IAR C выделение памяти

May 17, 2005 2 Replies

Здравствуй, All!



Столкнулся я с неприятным явлением при динамическом выделении памяти в IAR C (3.20). Есть хип размером F00 = 3840 байт. Массив (unsigned char) в нем размером 3800 байт не создается, а 3500 байт - запросто. Массив единственный, весь хип должен быть свободен. Причем, как оператором new[], так и malloc(). Компилируется все нормально, но при работе программы (на атмеге 128) во время выделения памяти выдается ошибка. В чем может быть причина?



Успехов! До свидания. Sergey.


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

Привет Sergey!

17 May 05 16:15, Sergey Brylew писал All:

SB> Столкнулся я с неприятным явлением при динамическом выделении памяти SB> в IAR C (3.20). Есть хип размером F00 = 3840 байт. Массив (unsigned SB> char) в нем размером 3800 байт не создается, а 3500 байт - запросто. SB> Массив единственный, весь хип должен быть свободен. Причем, как SB> оператором new[], так и malloc(). Компилируется все нормально, но при SB> работе программы (на атмеге 128) во время выделения памяти выдается SB> ошибка. В чем может быть причина?

Видимо, мал размер кучи. Кроме выделяемой памяти в ней обычно хранится какая-то служебная информация.

Всего наилучшего, [Team PCAD 2000] Алексей М. ... О сколько нам открытий чудных готовит открывашки крюк!

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required