volatile 在STC32中的含义解释,应用

版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处,@清风蓝。 https://blog.csdn.net/qq_38405680/article/details/81543827

1 //寄存器的值常常是芯片外设自动更改的,即使 CPU 没有执行程序,也有可能发生变化
2 //编译器有可能会对没有执行程序的变量进行优化

4 //volatile 表示易变的变量,防止编译器优化,
5 #define __IO volatile
6 typedef unsigned int uint32_t;
7 typedef unsigned short uint16_t;

9 // GPIO 寄存器结构体定义
10 typedef struct
11 {
12 __IO uint32_t CRL; // 端口配置低寄存器, 地址偏移 0X00
13 __IO uint32_t CRH; // 端口配置高寄存器, 地址偏移 0X04
14 __IO uint32_t IDR; // 端口数据输入寄存器, 地址偏移 0X08
15 __IO uint32_t ODR; // 端口数据输出寄存器, 地址偏移 0X0C
16 __IO uint32_t BSRR; // 端口位设置/清除寄存器,地址偏移 0X10
17 __IO uint32_t BRR; // 端口位清除寄存器, 地址偏移 0X14
18 __IO uint32_t LCKR; // 端口配置锁定寄存器, 地址偏移 0X18
19 } GPIO_TypeDef;
这段代码在每个结构体成员前增加了一个“__IO”前缀,它的原型在这段代码的第一
行,代表了 C 语言中的关键字“volatile”,在 C 语言中该关键字用于表示变量是易变的,
要求编译器不要优化。这些结构体内的成员,都代表着寄存器,而寄存器很多时候是由外
设或 STM32 芯片状态修改的,也就是说即使 CPU 不执行代码修改这些变量,变量的值也
有可能被外设修改、更新,所以每次使用这些变量的时候,我们都要求 CPU 去该变量的地
址重新访问。若没有这个关键字修饰,在某些情况下,编译器认为没有代码修改该变量,
就直接从 CPU 的某个缓存获取该变量值,这时可以加快执行速度,但该缓存中的是陈旧数
据,与我们要求的寄存器最新状态可能会有出入。

猜你喜欢

转载自blog.csdn.net/qq_38405680/article/details/81543827