скрытое меню

CHECK FOR STACK OVERFLOW

Полезная фича во 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 :

фотка 1

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]