运行时值如何成为const?

时间:2017-07-13 15:32:59

标签: c operating-system freertos

来自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值中?

2 个答案:

答案 0 :(得分:3)

关键字const可能意味着两件事:

  1. 如果使用编译时常量初始化const变量,则它本身就是编译时常量。

  2. 如果它在运行时初始化,那么它是运行时常量,这意味着一旦初始化它就不能改变它的值。

  3. 使用const对于代码的读者来说也是一个很好的提示,但也可以作为编译器的提示,这可能会做一些可能无法实现的优化。

答案 1 :(得分:0)

pulStack

的定义中
  1. 第一个const表示pulStack可能修改其指向的内容。 (即)pulStack[0] = ...是错误
  2. 第二个const表示pulStack中的值(即它指向的内容)可能在声明它的块范围内被修改。 (即)[后续] pulStack = ...是错误