Sto creando codice per un ARM Cortex-M3 (LCP17xx di NXP). Fino ad ora ho utilizzato la memoria statica e tutto ha funzionato bene. Ho provato ad aggiungere il supporto per la memoria dinamica, ma una volta chiamo malloc, il sistema si blocca.Utilizzo di malloc di newlib in un ARM Cortex-M3
Sto compilando con gcc per arm bare metal e utilizzando newlib. Versione: gcc-arm-none-eabi-4_6-2012q1
Per aggiungere il supporto per malloc, ho implementato una semplice funzione _sbrk e modificato il mio script linker per creare spazio per l'heap (ho letto molti tutorial su questo parte, ma nessuno copre il problema che ho incontrato dopo).
Con l'aiuto di alcuni LED, posso essere certo che il codice viene eseguito fino al punto che chiama malloc
, quindi non va avanti. Non raggiunge nemmeno la mia funzione _sbrk
. Inoltre, si bloccherà in una chiamata a sizeof
, se includo una chiamata a malloc
più avanti nel codice.
Quindi, cosa posso fare di sbagliato che quando si chiama malloc
il codice si blocca senza mai raggiungere _sbrk
o di ritorno?
Dopo aver fissato per un po 'la mappa di memoria generata quando è inclusa la chiamata malloc
e quando non lo è, ho il sospetto che sia correlata alle strutture utilizzate da malloc
.
Questa è la parte dello script ld che definisce la memoria ram:
.bss :
{
_start_bss = .;
*(.bss)
*(COMMON)
_ebss = .;
. = ALIGN (8);
_end = .;
} >sram
. = ALIGN(4);
_end_bss = .;
. = ALIGN(256);
_start_heap = .;
PROVIDE(__cs3_heap_start = _start_heap)
_end_stack = 0x10008000;
_end_stack viene impostato nella tabella vettore di interrupt.
E ora un confronto tra le diverse mappe. Senza usare malloc nel codice:
*(COMMON)
0x1000000c _ebss = .
0x10000010 . = ALIGN (0x8)
*fill* 0x1000000c 0x4 00
0x10000010 _end = .
0x10000010 . = ALIGN (0x4)
0x10000010 _end_bss = .
0x10000100 . = ALIGN (0x100)
0x10000100 _start_heap = .
mappa di memoria utilizzando malloc nel codice:
*(COMMON)
COMMON 0x10000848 0x4 ...arm-none-eabi/lib/armv7-m/libc.a(lib_a-reent.o)
0x10000848 errno
0x1000084c _ebss = .
0x10000850 . = ALIGN (0x8)
*fill* 0x1000084c 0x4 00
0x10000850 _end = .
.bss.__malloc_max_total_mem
0x10000850 0x4
.bss.__malloc_max_total_mem
0x10000850 0x4 ...arm-none-eabi/lib/armv7-m/libc.a(lib_a-mallocr.o)
0x10000850 __malloc_max_total_mem
(...) It goes on (...)
0x1000085c __malloc_current_mallinfo
0x10000884 . = ALIGN (0x4)
0x10000884 _end_bss = .
0x10000900 . = ALIGN (0x100)
0x10000900 _start_heap = .
Sei sicuro di voler richiamare correttamente il codice di avvio, che inizializzerà le strutture dell'heap? –
Ovviamente sto facendo qualcosa di sbagliato, il problema è che non so COSA sto sbagliando. Ho aggiunto ulteriori informazioni sulle mappe di memoria, speriamo che possa aiutare a trovare l'errore. –
Un problema molto simile si verifica quando si utilizza sprintf. Quindi non è solo un problema Malloc. Ha a che fare con tutta la roba newlib. Probabilmente ha bisogno di un cambiamento nello script di collegamento, anche se non riesco a capire cosa. –