STM32 FreeRTOS lwIP Управление кучей / стеком / памятью

Я работаю над кастомной платой с процессором STM32F107VCT. Я использую FreeRTOS и lwIP

Я использую библиотеку tinyxml2 и читаю / записываю в EEPROM, и у меня возникают странные проблемы с повреждением и сбои. Я подозреваю, что у меня заканчивается память. У меня довольно новая встроенная электроника и FreeRTOS, поэтому я не уверен, где мне искать.

Я создаю несколько таких потоков:

osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 512); 
defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
osThreadDef(RfTask, StartRfTask, osPriorityNormal, 0, 700); 
RfTaskHandle = osThreadCreate(osThread(RfTask), NULL);
osThreadDef(DiscoveryTask, StartDiscoveryTask, osPriorityNormal, 0, 256); 
DisoveryTaskHandle = osThreadCreate(osThread(DiscoveryTask), NULL);

Вот некоторые из моих определений, связанных с кучей / стеком

FreeRTOS.h 
define configTOTAL_HEAP_SIZE ((size_t)1024*24)

Flash.id
_estack = 0x20010000; /* end of RAM */
_Min_Heap_Size = 0; /* required amount of heap */ 
_Min_Stack_Size = 0x200; /* required amount of stack */

Я не совсем понимаю, что такое теория кучи / стека и как она соотносится с цифрами в flash.id и FreeRTOS.h

Может ли кто-нибудь предложить мне объяснение, как все это работает, и какие-либо методы проверки количества оперативной памяти, доступной для задач и т. Д.?

При необходимости я могу поделиться своим кодом на gitlab

Большое спасибо


person Daniel Beyzade    schedule 08.09.2017    source источник


Ответы (2)


Не могу прокомментировать, как ваша конфигурация lwIP использует память, но что касается FreeRTOS:

Куча, определенная вашим сценарием компоновщика, используется FreeRTOS только в том случае, если вы включаете heap_3.c в свою сборку. Все другие реализации кучи, поставляемые с FreeRTOS, берут память из статически выделенного массива. Если все распределение памяти выполняется с использованием распределителей памяти FreeRTOS, то определение кучи в сценарии компоновщика приводит к потере оперативной памяти, поскольку она не будет использоваться. См. http://www.freertos.org/a00111.html для получения дополнительной информации.

[на STM32] Стек, определенный вашим сценарием компоновщика, будет использоваться main () до запуска планировщика и прерывания после запуска планировщика. Задачи FreeRTOS не используют этот стек, поскольку при создании каждой задаче выделяется свой собственный стек. См. Документацию по API для функций API xTaskCreate () и xTaskCreateStatic (). http://www.freertos.org/a00019.html

При разработке рекомендуется убедиться, что configASSERT () определен, и что у вас включено обнаружение переполнения стека. Поиск в Google этих терминов вместе с «FreeRTOS» также найдет ссылки для них.

person Richard    schedule 09.09.2017

какие-либо методы для проверки количества оперативной памяти, доступной для задач и т. д.?

В FreeRTOS каждая задача имеет структуру данных с именем TCB_t для хранения своего собственного блока управления задачами (TCB), один член структуры TCB_t - это pxStack, который указывает место с наименьшим адресом памяти стека задачи. В STM32 стековая память (также указатель $sp) увеличивается из верхней памяти, если $sp становится ниже, чем pxStack, происходит переполнение стека.

Чтобы проверить память стека, доступную для конкретной задачи, вы можете просто проверить значение pxStack и $sp (например, через OpenOCD / GDB) и увидеть их разницу.

Подробнее см. task.c.

person Han    schedule 23.11.2019