c - 运行时值怎么可能是 const?

标签 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 值中?

最佳答案

关键字const有两种含义:

  1. 如果 const 变量是用编译时常量初始化的,那么它本身就是一个编译时常量。

  2. 如果它在运行时初始化,那么它是一个运行时常量,这意味着一旦初始化,它就无法更改其值。

使用 const 对于代码读者来说也是一个很好的提示,但也可以作为编译器的提示,编译器可能会进行一些原本不可能实现的优化。

关于c - 运行时值怎么可能是 const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45085259/

相关文章:

c - 区分 VMware 网络适配器与物理网络适配器 - 或 - 检测虚拟网络适配器

c - 为什么我的内存检查代码不能正常工作

你可以使用用mingw编译的程序访问其他程序的内存吗?

c - 停止和启动任务

callback - 为了方便起见,我们可以编辑回调函数 HAL_UART_TxCpltCallback 吗?

c - 为什么我可以使用 size_t 而无需定义它?

c - #program in C - 如何读取 .txt 中的一个单词和该单词的行? C程序

c - 将 .txt 文件中的多行数据扫描到结构数组中

c - 内核编码的下一步

freertos - 如何在 FreeRTOS 中进行文件处理