运行时值如何成为常量?
How can a runtime value be a const?
来自 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 ) ) \
{ \
vApplicationWhosebugHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
} \
}
#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */
如果我理解正确,pxCurrentTCB 是 运行 进程的内核结构,pxStack 指向该进程的堆栈开始。每次都不同,但是,它可以以某种方式存储在 const 值中?
关键字 const
可以表示两件事:
如果 const
变量是用编译时常量初始化的,它本身就是编译时常量。
如果它在 运行 时间初始化,那么它是一个 运行 时间常数,这意味着一旦初始化它就不能更改其值。
使用 const
也是对代码读者的一个很好的提示,但也可以作为对编译器的提示,编译器可能会进行一些原本不可能进行的优化。
在pulStack
的定义中:
- 第一个
const
说 pulStack
可能 不会 修改它指向的内容。 (即)pulStack[0] = ...
是一个错误
- 第二个
const
表示 pulStack
中的值(即它指向的内容)可能 不 在它所在的块范围内被修改被宣布。 (即)[后续] pulStack = ...
是一个错误
来自 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 ) ) \
{ \
vApplicationWhosebugHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
} \
}
#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */
如果我理解正确,pxCurrentTCB 是 运行 进程的内核结构,pxStack 指向该进程的堆栈开始。每次都不同,但是,它可以以某种方式存储在 const 值中?
关键字 const
可以表示两件事:
如果
const
变量是用编译时常量初始化的,它本身就是编译时常量。如果它在 运行 时间初始化,那么它是一个 运行 时间常数,这意味着一旦初始化它就不能更改其值。
使用 const
也是对代码读者的一个很好的提示,但也可以作为对编译器的提示,编译器可能会进行一些原本不可能进行的优化。
在pulStack
的定义中:
- 第一个
const
说pulStack
可能 不会 修改它指向的内容。 (即)pulStack[0] = ...
是一个错误 - 第二个
const
表示pulStack
中的值(即它指向的内容)可能 不 在它所在的块范围内被修改被宣布。 (即)[后续]pulStack = ...
是一个错误