Tue May 17 2005 16:15, Sergey Brylew wrote to All:
SB> Столкнулся я с неприятным явлением при динамическом выделении памяти в SB> IAR C (3.20). Есть хип размером F00 = 3840 байт. Массив (unsigned char) в SB> нем размером 3800 байт не создается, а 3500 байт - запросто. Массив SB> единственный, весь хип должен быть свободен. Причем, как оператором SB> new[], так и malloc(). SB> Компилируется все нормально, но при работе программы (на атмеге 128) во SB> время выделения памяти выдается ошибка. В чем может быть причина?
Менеджер памяти имеет некоторые накладные расходы. Обычно менеджер памяти с блоками переменной длины реализуется как двусвязанный список.
struct MEM_H { struct MEM_H * next; struct MEM_H * prev; unsigned int len; }
В итоге при полностью пустом пуле в нем связаны 2 заголовка, один по 0 адресу пула, второй в конце. Максимальный блок, который может быть выделен = выделенная под пул память минус рамер 2 заголовков. В приведенном варианте для avr 2 заголовка займут 12 байт. Возможно, в IAR сделан более сложный менеджер, который требует бОльших накладных расходов. Hужно смотреть в исходниках библиотечных функций, как реализован пул.
wbr, Andy