是的,可以同时使用常量和易失性。 volatile
和 const
关键字的最大用途之一是在访问 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