Это старая версия документа!
При выполнении команды O7ARMv{6,7}Linker.Link в рабочий журнал будет выведено, сколько программа потребляет ROM и RAM. Например, для программы из первого урока требуется 880 байт ROM и 16 байт RAM.
Доступная память RAM используется под следующие ресурсы:
Куча используется только при динамическом выделении памяти через команду 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. Если он меньше, значит стек уже начал писаться в область память, выделенной для кучи.