RT-Thread Getting Started Study Notes: familiarizado con la aplicación y la versión de memoria dinámica

RT-Thread Getting Started Notas de estudio: uso de menuconfig Kconfig

RT-Thread Getting Started Study Notes: familiarizado con la aplicación y la versión de memoria dinámica

RT-Thread Getting Started Study Notes: vea la dirección de la pila de subprocesos

RT-Thread Getting Started Study Notes: resuelva el problema de la falla RT_ASSERT

 

Prefacio

  • La gestión de memoria dinámica de RT-Thread utilizada recientemente: rt_malloc rt_free, resume la experiencia.
  • Domina la aplicación y liberación de memoria dinámica.

 

Descripción del problema

  • Después de usar rt_malloc para un byte, se encontró que el consumo de memoria: ¡24 bytes!
  • Después de usar rt_free un buf aplicado dinámicamente, ¡el puntero buf sigue ahí!

 

análisis del problema

Plataforma de verificación: plataforma Pandora STM32L4, RT-Thread 4.0.3

Función de prueba:

rt_uint8_t *ptr_buf = RT_NULL;

void mem_malloc_test(int argc, char **argv)
{
    rt_uint32_t buf_len = 0x00;

    if (argc >= 2)
    {
        buf_len = atoi(argv[1]);
        ptr_buf = rt_malloc(buf_len);
        rt_kprintf("%s:malloc len=%d\n", __func__, buf_len);
        rt_kprintf("%s: ptr=%p\n", __func__, ptr_buf);
    }
    else
    {
        rt_kprintf("help: mem_malloc_test 3\n");
    }
}

void mem_free_test(void)
{
    if (ptr_buf != RT_NULL)
    {
        rt_free(ptr_buf);
        rt_kprintf("%s: free OK!\n", __func__);
        rt_kprintf("%s: ptr=%p\n", __func__, ptr_buf);
    }
    else
    {
        rt_kprintf("%s: error! buffer is null!\n", __func__);
    }
}

MSH_CMD_EXPORT(mem_malloc_test, memory malloc test);
MSH_CMD_EXPORT(mem_free_test, memory free test);

La siguiente tabla:

en eso rt_malloc rt_free buf_len tamaño total diff
28788 28812 28788 1 24 23
28788 28812 28788 4 24 20
28788 28812 28788 8 24 dieciséis
28788 28812 28788 10 24 14
28788 28812 28788 11 24 13
28788 28812 28788 12 24 12
28788 28816 28788 13 28 15
28788 28816 28788 dieciséis 28 12
28788 28820 28788 20 32 12
28788 28824 28788 24 36 12
28788 28900 28788 100 112 12
28788 39040 28788 10240 10252 12
28788 69760 28788 40960 40972 12
  • Solicite 1 ~ 12 bytes, todos ocuparán: 24 bytes.
  • El número de bytes solicitados no está alineado con 4 bytes, pero sigue ocupando el mismo tamaño que con 4 bytes alineados. Si solicita 13 ~ 16 bytes, la memoria ocupada es 28.
  • Al solicitar más de 12 bytes de memoria, como 13, 16, 100, 1K, 10K, 40K, etc., la ocupación adicional de la parte de gestión de memoria es de 12 bytes.
  • rt_malloc y rt_free se utilizan en pares, lo que no provocará pérdidas de memoria
  • Después de rt_free, el búfer libre desaparece, ¡pero el valor del puntero del búfer no cambia!

 

Cuestiones clave

  • Después de solicitar memoria, los punteros buf y buf de rt_free todavía existen. Entonces, después de rt_free, debe asignar buf manualmente a null.
  • Después de rt_free, el puntero buf sigue estando allí. Si no asigna manualmente el puntero buf a null y libera buf muchas veces, se producirán resultados inesperados.
  • A continuación, uso un puntero global, después de solicitar memoria, libre varias veces (después de libre, el puntero no se cambia manualmente a nulo)
  • Observaciones: Después de la verificación, se encontró que el byte apagó accidentalmente la función RT_ASSERT; de lo contrario, si se repite rt_free, aparecerá una aserción ASSERT. !
  • Los siguientes datos son solo de referencia, lo que significa: después de rt_free, debe cambiar manualmente el puntero a nulo, ¡y no puede repetir gratis!

 

msh />free
total memory: 82256
used memory : 24564
maximum allocated memory: 27572
msh />mem_mal
mem_malloc_test
msh />mem_malloc_test 12
mem_malloc_test:malloc len=12
mem_malloc_test: ptr=20003ea4
msh />free
total memory: 82256
used memory : 24588
maximum allocated memory: 27572
msh />mem_free_test
mem_free_test: free OK!
mem_free_test: ptr=20003ea4
msh />free
total memory: 82256
used memory : 28788
maximum allocated memory: 29604
msh />mem_free_test
to free a bad data block:
mem: 0x20003e98, used flag: 0, magic code: 0x1ea0
mem_free_test: free OK!
mem_free_test: ptr=20003ea4
msh />free
total memory: 82256
used memory : 28764 /* 内存在变小!!!! */
maximum allocated memory: 29604
msh />mem_free_test
to free a bad data block:
mem: 0x20003e98, used flag: 0, magic code: 0x1ea0
mem_free_test: free OK!
mem_free_test: ptr=20003ea4
msh />free
total memory: 82256
used memory : 28740 /* 内存在变小!!!! */
maximum allocated memory: 29604
msh />mem_free_test
to free a bad data block:
mem: 0x20003e98, used flag: 0, magic code: 0x1ea0
mem_free_test: free OK!
mem_free_test: ptr=20003ea4
msh />mem_free_test
to free a bad data block:
mem: 0x20003e98, used flag: 0, magic code: 0x1ea0
mem_free_test: free OK!
mem_free_test: ptr=20003ea4
msh />free
total memory: 82256
used memory : 28692
maximum allocated memory: 29604
msh />mem_free_test
to free a bad data block:
mem: 0x20003e98, used flag: 0, magic code: 0x1ea0
mem_free_test: free OK!
mem_free_test: ptr=20003ea4
msh />free
total memory: 82256
used memory : 28668  /* 内存在变小!!!! */
maximum allocated memory: 29604
msh />mem_free_test
to free a bad data block:
mem: 0x20003e98, used flag: 0, magic code: 0x1ea0
mem_free_test: free OK!
mem_free_test: ptr=20003ea4
msh />free
total memory: 82256
used memory : 28644 /* 内存在变小!!!! */
maximum allocated memory: 29604
msh />mem_free_test
to free a bad data block:
mem: 0x20003e98, used flag: 0, magic code: 0x1ea0
mem_free_test: free OK!
mem_free_test: ptr=20003ea4
msh />free
total memory: 82256
used memory : 28620 /* 内存在变小!!!! */
maximum allocated memory: 29604
msh />
  • Se encontró un puntero global. Después de solicitar memoria una vez, estaba libre muchas veces. Aunque se informó un error, ¡todavía estaba libre! !

 

para resumir

  • Utilice rt_malloc y rt_free correctamente, ¡aparezcan en pares! !
  • Aunque la memoria estática es fácil de usar, siempre ocupa memoria, por lo tanto, para algunos búferes de recepción de datos de longitud variable, se puede usar la administración de memoria dinámica.
  • Tenga en cuenta que la memoria después de que esté libre, la dirección del puntero todavía está allí, si es un puntero global, es mejor cambiar manualmente a nulo después de que esté libre.

Supongo que te gusta

Origin blog.csdn.net/tcjy1000/article/details/113852478
Recomendado
Clasificación