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

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


ob:o7:memory

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
Следующая версия Следующая версия справа и слева
ob:o7:memory [2016/08/25 04:42]
иван_денисов
ob:o7:memory [2018/11/30 01:13]
127.0.0.1 внешнее изменение
Строка 13: Строка 13:
 Стек заполняет выделенную под него память сверху вниз. И когда этот объем полностью заполняется, он начинает расти поверх кучи. Поэтому большие переменные рекомендуется размещать либо глобально, либо в куче, выход за границы которой контролируется автоматически. При переполнении кучи указатель будет равен NIL после вызова NEW. Стек заполняет выделенную под него память сверху вниз. И когда этот объем полностью заполняется, он начинает расти поверх кучи. Поэтому большие переменные рекомендуется размещать либо глобально, либо в куче, выход за границы которой контролируется автоматически. При переполнении кучи указатель будет равен NIL после вызова NEW.
  
-Размер памяти, выделяемой под стек, определяется переменной **StkSize** в модуле **System** для конкретного контроллера. Например, для STM32F4 это 8192 байта, для STM32F103x{8,B} --- 2048 байт. Это значение вы можете легко изменить исходя из требований вашего проекта. Если вы используете рекурсивные алгоритмы, то скорее всего вам потребуется зарезервировать больше места под стек.+Размер памяти, выделяемой под стек, определяется константой **StkSize** в модуле **System** для конкретного контроллера. Например, для STM32F4 это 8192 байта, для STM32F103x{8,B} --- 2048 байт. Это значение вы можете легко изменить исходя из требований вашего проекта. Если вы используете рекурсивные алгоритмы, то скорее всего вам потребуется зарезервировать больше места под стек.
  
 Степень заполнение стека возможно вычислить, исходя из положения начала и его текущего положения: Степень заполнение стека возможно вычислить, исходя из положения начала и его текущего положения:
  
- SYSTEM.GET(SYSTEM.REG(6), stkOrg); + SYSTEM.GET(SYSTEM.REG(MT), stkOrg); (* MT = 6 *) 
- SYSTEM.GET(SYSTEM.REG(13), stkPos);+ SYSTEM.GET(SYSTEM.REG(SP), stkPos); (* SP = 13 *)
  stkLen := stkOrg - stkPos;  stkLen := stkOrg - stkPos;
  
Строка 25: Строка 25:
 Переполнение стека возможно обнаружить и более простым путем, сравнив **stkPos** с **MicroKernel0.heapLim**. Если он меньше, значит стек уже начал писаться в область памяти, выделенной для кучи. Так возможно добавить ASSERT для аварийной остановки в случае переполнения стека. Про обработку аварийных остановок читайте [[http://obertone.ru/ob/o7/debug|заметку про отладку]]. Переполнение стека возможно обнаружить и более простым путем, сравнив **stkPos** с **MicroKernel0.heapLim**. Если он меньше, значит стек уже начал писаться в область памяти, выделенной для кучи. Так возможно добавить ASSERT для аварийной остановки в случае переполнения стека. Про обработку аварийных остановок читайте [[http://obertone.ru/ob/o7/debug|заметку про отладку]].
  
 +----
 +
 +Автор заметки: [[http://iadenisov.ru|И.А. Денисов]]
ob/o7/memory.txt · Последнее изменение: 2020/10/29 07:08 (внешнее изменение)