Полезная фича во FreeRTOS , когда программа виснет:
FreeRTOS.h
#define configCHECK_FOR_STACK_OVERFLOW 2
StackMacros.h
Становится активным для компиляции макрос taskCHECK_FOR_STACK_OVERFLOW:
#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) )
#define taskCHECK_FOR_STACK_OVERFLOW() \
{ \
const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \
const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5; \
\
if( ( pulStack[ 0 ] != ulCheckValue ) || \
( pulStack[ 1 ] != ulCheckValue ) || \
( pulStack[ 2 ] != ulCheckValue ) || \
( pulStack[ 3 ] != ulCheckValue ) ) \
{ \
vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName );\
} \
}
#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */
Вот стек функций при вызове taskCHECK_FOR_STACK_OVERFLOW :
taskCHECK_FOR_STACK_OVERFLOW будет вызываться в файле [tasks.c] в функции vTaskSwitchContext.
uxTaskGetStackHighWaterMark
#define INCLUDE_uxTaskGetStackHighWaterMark 1
И теперь везде где вам надо можно вызывать функцию uxTaskGetStackHighWaterMark и она будет возвращать размер свободной памяти стека задачи. Это очень полезная фича , когда не хватает памяти и все виснет.
Стек вызовов функций :
Thread #3 536874336 (defaultTask : Running [P: 3]) (Suspended : Step)
uxListRemove() [list.c]
StartDefaultTask() [main.c]
uxTaskGetStackHighWaterMark() [tasks.c] // это мы добавили
prvTaskCheckFreeStackSpace() [tasks.c]