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

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


ob:o7:memory

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
Следующая версия Следующая версия справа и слева
ob:o7:memory [2016/08/24 19:16]
иван_денисов
ob:o7:memory [2018/11/30 01:13]
127.0.0.1 внешнее изменение
Строка 4: Строка 4:
  
 Доступная память RAM используется под следующие ресурсы: Доступная память RAM используется под следующие ресурсы:
-  * heap (heapLim - heapOrg) +  * куча; 
-  * stack +  * стек; 
-  * global variables +  * глобальные переменные; 
-  * pointers tablestringsmodules table+  * таблица указателейстрокитаблица модулей.
  
-Heap (кучаиспользуется только при динамическом выделении памяти через команду NEW, и она заполняется снизу вверх. Для сборки мусора в куче надо вызывать команду **MicroGC0.Collect**. Количество выделенной динамической памяти доступно в переменной **MicroKernel0.allocated**, начало кучи --- **MicroKernel0.heapOrg**, конец --- **MicroKernel0.heapLim**. Следовательно общий размер легко вычислить как их разность.+Куча используется только при динамическом выделении памяти через команду NEW, и она заполняется снизу вверх. Для сборки мусора в куче надо вызывать команду **MicroGC0.Collect**. Количество выделенной динамической памяти доступно в переменной **MicroKernel0.allocated**, начало кучи --- **MicroKernel0.heapOrg**, конец --- **MicroKernel0.heapLim**. Следовательно общий размер легко вычислить как их разность.
  
-Стек заполняет выделенную под него память сверху вниз. И когда этот объем полностью заполняется, он начинает расти поверх кучи. Поэтому большие переменные рекомендуется размещать либо глобально, либо в куче, выход за границы которой контролируется автоматически. При переполнении кучи сработает TRAP HeapOverflow. Про обработку аварийных остановок читайте [[http://obertone.ru/ob/o7/debug|заметку про отладку]].+Стек заполняет выделенную под него память сверху вниз. И когда этот объем полностью заполняется, он начинает расти поверх кучи. Поэтому большие переменные рекомендуется размещать либо глобально, либо в куче, выход за границы которой контролируется автоматически. При переполнении кучи указатель будет равен 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;
  
 Так возможно контролировать при отладке, не превышает ли **stkLen** значение **StkSize** Так возможно контролировать при отладке, не превышает ли **stkLen** значение **StkSize**
  
-Переполнение стека возможно обнаружить и более простым путем, сравнив **stkPos** с **MicroKernel0.heapLim**. Если он меньше, значит стек уже начал писаться в область памяти, выделенной для кучи.+Переполнение стека возможно обнаружить и более простым путем, сравнив **stkPos** с **MicroKernel0.heapLim**. Если он меньше, значит стек уже начал писаться в область памяти, выделенной для кучи. Так возможно добавить ASSERT для аварийной остановки в случае переполнения стека. Про обработку аварийных остановок читайте [[http://obertone.ru/ob/o7/debug|заметку про отладку]]. 
 + 
 +---- 
 + 
 +Автор заметки: [[http://iadenisov.ru|И.А. Денисов]]
ob/o7/memory.txt · Последнее изменение: 2020/10/29 07:08 (внешнее изменение)