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

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


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 для конкретного контроллера. Чтобы проверить заполнение стека, необходимо его вычислить исходя из положения начала и его текущего положения:

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

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

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

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