Инструменты пользователя

Инструменты сайта


ob:o7:memory

Это старая версия документа!


Особенности работы с памятью

При выполнении команды O7ARMv{6,7}Linker.Link в рабочий журнал будет выведено, сколько программа потребляет ROM и RAM. Например, для программы из первого урока требуется 880 байт ROM и 16 байт RAM.

Доступная память RAM используется под следующие ресурсы:

  • heap (heapLim - heapOrg)
  • stack
  • global variables
  • pointers table, strings, modules table

Heap (куча) используется только при динамическом выделении памяти через команду NEW, и она заполняется снизу вверх. (Перед вызовом команды NEW для указателя, ему необходимо присвоить значение NIL). Для сборки мусора в куче надо вызывать команду MicroGC0.Collect. Количество выделенной динамической памяти доступно в переменной MicroKernel0.allocated, начало кучи — MicroKernel0.heapOrg, конец — MicroKernel0.heapLim. Следовательно общий размер легко вычислить как их разность.

Стек заполняет выделенную под него память сверху вниз. И когда этот объем полностью заполняется, он начинает расти поверх кучи. Поэтому большие переменные рекомендуется размещать либо глобально, либо в куче, выход за границы которой контролируется автоматически.

Размер памяти, выделяемой под стек, определяется переменной StkSize в модуле System для конкретного контроллера. Например, для STM32F4 это 8192 байта, для STM32F103x{8,B} — 2048 байт. Это значение вы можете легко изменить исходя из требований вашего проекта. Если вы используете рекурсивные алгоритмы, то скорее всего вам потребуется зарезервировать больше места под стек.

Чтобы проверить заполнение стека, необходимо его вычислить исходя из положения начала и его текущего положения:

SYSTEM.GET(SYSTEM.REG(6), stkOrg);
SYSTEM.GET(SYSTEM.REG(13), stkPos);
stkLen := stkOrg - stkPos;

Так возможно контролировать при отладка, не превышает ли stkLen значение StkSize

Переполнение стека возможно сделать и более простым путем, сравнив stkPos с MicroKernel0.heapLim. Если он меньше, значит стек уже начал писаться в область памяти, выделенной для кучи.

ob/o7/memory.1472054712.txt.gz · Последнее изменение: 2020/10/29 07:08 (внешнее изменение)