来自FreeRTOS include / StackMacros.h文件:
#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 ) */
如果我理解正确,pxCurrentTCB是用于运行进程的内核结构,pxStack点堆栈是该进程的开始。它每次都不一样,但不知何故它可以存储在const值中?
答案 0 :(得分:3)
关键字const
可能意味着两件事:
如果使用编译时常量初始化const
变量,则它本身就是编译时常量。
如果它在运行时初始化,那么它是运行时常量,这意味着一旦初始化它就不能改变它的值。
使用const
对于代码的读者来说也是一个很好的提示,但也可以作为编译器的提示,这可能会做一些可能无法实现的优化。
答案 1 :(得分:0)
在pulStack
:
const
表示pulStack
可能不修改其指向的内容。 (即)pulStack[0] = ...
是错误const
表示pulStack
中的值(即它指向的内容)可能不在声明它的块范围内被修改。 (即)[后续] pulStack = ...
是错误