易百教程

33、C语言中的变量可以既是常量(const)又是易失(volatile)?

是的,可以同时使用常量和易失性。 volatileconst 关键字的最大用途之一是在访问 GPIO 寄存器时。 在 GPIO 的情况下,如果它被配置为输入,它的值可以通过“外部因素”(如果开关或任何输出设备连接到 GPIO)来更改。 在这种情况下, volatile 起着重要作用,并确保编译器始终从 GPIO 地址读取值并避免做出任何假设。
使用 volatile 关键字后,无论何时访问端口,都将获得正确的值,但这里还有一个问题,因为指针不是 const 类型,因此可能是程序更改了指针的指向地址。 所以必须用 volatile 关键字创建一个常量指针。

声明的语法:

int volatile * const PortRegister;

如何阅读以上声明:

int volatile * const PortRegister;
 |     |     |   |    |
 |     |     |   |    +------> PortRegister is a
 |     |     |   +-----------> constant
 |     |     +---------------> pointer to a
 |     +---------------------> volatile
 +---------------------------> integer

考虑下面一个简单的例子:

#define PORTX 0x00020000 // Address of the GPIO
uint32_t volatile * const pcPortReg = (uint32_t *) PORTX;

pcPortReg 是一个指向易失性无符号整数的常量指针,使用 *pcPortReg 可以访问内存映射寄存器。

*pcPortReg = value; // Write value to the port
value = *pcPortReg; // Read value from the port