整数变量可以在 C 中同时具有 const 和 volatile 限定符吗?
Can an integer variable have both const and volatile qualifier in C?
我想知道这是否可行,以及类似的东西可以应用到哪里。我在某个地方被问到这个问题,我的想法是你会对一些你知道其价值不会改变或者你不想改变的东西有一个常量。然而,根据定义,volatile 变量可以随时更改,即使是在当前范围之外的代码也是如此。所以在我看来,这两个限定词相互矛盾。
是的,在某些情况下它是有意义的。总之,const volatile
意味着代码不能改变变量的值,但程序之外的东西可以。这方面的一些用例包括:
只读硬件寄存器
只读共享内存缓冲区,其中一个 CPU 写入而另一个仅读取
这是一篇内容更详细的好文章:http://embeddedgurus.com/barr-code/2012/01/combining-cs-volatile-and-const-keywords/
是的,有可能。
最好的例子就是控制器中的状态寄存器,在程序中我们不应该修改这个状态寄存器,所以它应该是一个常量。但这可以根据中断条件由处理器或硬件更改。所以在程序中,我们要读取这个Status Register的值时,它应该读取实际值而不做任何优化。因此,状态寄存器也可以声明为易失性的。
示例:
uint32_t volatile * const Spi_status_reg = (uint32_t *) 0x000800F0;
阅读这样的声明的最佳方式是从变量名向左读:
这里 Spi_status_reg 是指向易失性 32 位无符号整数的常量指针。
我想知道这是否可行,以及类似的东西可以应用到哪里。我在某个地方被问到这个问题,我的想法是你会对一些你知道其价值不会改变或者你不想改变的东西有一个常量。然而,根据定义,volatile 变量可以随时更改,即使是在当前范围之外的代码也是如此。所以在我看来,这两个限定词相互矛盾。
是的,在某些情况下它是有意义的。总之,const volatile
意味着代码不能改变变量的值,但程序之外的东西可以。这方面的一些用例包括:
只读硬件寄存器
只读共享内存缓冲区,其中一个 CPU 写入而另一个仅读取
这是一篇内容更详细的好文章:http://embeddedgurus.com/barr-code/2012/01/combining-cs-volatile-and-const-keywords/
是的,有可能。
最好的例子就是控制器中的状态寄存器,在程序中我们不应该修改这个状态寄存器,所以它应该是一个常量。但这可以根据中断条件由处理器或硬件更改。所以在程序中,我们要读取这个Status Register的值时,它应该读取实际值而不做任何优化。因此,状态寄存器也可以声明为易失性的。 示例:
uint32_t volatile * const Spi_status_reg = (uint32_t *) 0x000800F0;
阅读这样的声明的最佳方式是从变量名向左读: 这里 Spi_status_reg 是指向易失性 32 位无符号整数的常量指针。