是的,可以同时使用常量和易失性。 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。