ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
303713
fk0, легенда (01.02.2012 19:33 - 19:37, просмотров: 19799)
PIC24, malloc(). Ну да, профессионалы malloc() не используют (потому, что не умеют). Опять г@#$$@#$@!!! Компилируется с опциями -Wl,--heap=8192. Далее имеем такую картину при вызове _dump_heap_info (до первого вызова malloc): 
*** Unused Heap status:
***   start: 0x000018e4   end: 0x000038e4
***   current:0x00000000 remaining bytes: 8192
***
*** Total bytes left: 8192
Однако, при попытке выделить и освободить 4096 байт далее блоки разного размера получается максимум 4096 байт, больше никак. Потому, что получается такая картина (__curbrk=0x28ec):
*** Unused Heap status:
***   start: 0x000018e4   end: 0x000038e4
***   current:0x000028ec remaining bytes: 4088
***
*** Allocated blocks:
***   [id ] address     size
***   [000] 0x000018e4  24
***
*** Free blocks:
***   [id ] address     size
***   [000] 0x000018fc  4080
***
*** Total bytes left: 8168
Понятно, да? Свободно 8168 байт в одном сегменте размером 4080 байт (ещё сколько-то выделено подо что-то, с десяток байт -- забыл malloc убрать). И только следующий вызов malloc(), который вынудит вызвать brk(), в итоге сможет установить адекватный размер свободного блока (__curbrk=0x38e4):
*** Unused Heap status:
***   start: 0x000018e4   end: 0x000038e4
***   current:0x000038e4 remaining bytes: 0
***
*** Allocated blocks:
***   [id ] address     size
***   [000] 0x000018e4  24
***
*** Free blocks:
***   [id ] address     size
***   [000] 0x000018fc  8168
***
*** Total bytes left: 8168
На unused heap status, поля start и end смотреть не надо, всё от brk() зависит на самом деле. Короче, malloc() в библиотеке для C30 -- порядочный ещё тот говнокод. Чем newlib неугодила -- да понятно чем, лицензией.
[ZX]