来自 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 值中?
最佳答案
关键字const
有两种含义:
如果
const
变量是用编译时常量初始化的,那么它本身就是一个编译时常量。如果它在运行时初始化,那么它是一个运行时常量,这意味着一旦初始化,它就无法更改其值。
使用 const
对于代码读者来说也是一个很好的提示,但也可以作为编译器的提示,编译器可能会进行一些原本不可能实现的优化。
关于c - 运行时值怎么可能是 const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45085259/