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

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

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

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

// GPIO 寄存器结构体定义
typedef struct<br>
{
	__IO uint32_t CRL; // 端口配置低寄存器, 地址偏移 0X00
	__IO uint32_t CRH; // 端口配置高寄存器, 地址偏移 0X04
	__IO uint32_t IDR; // 端口数据输入寄存器, 地址偏移 0X08
	__IO uint32_t ODR; // 端口数据输出寄存器, 地址偏移 0X0C
	__IO uint32_t BSRR; // 端口位设置/清除寄存器,地址偏移 0X10
	__IO uint32_t BRR; // 端口位清除寄存器, 地址偏移 0X14
	__IO uint32_t LCKR; // 端口配置锁定寄存器, 地址偏移 0X18
} GPIO_TypeDef;

这段代码在每个结构体成员前增加了一个“__IO”前缀,它的原型在这段代码的第一

行,代表了 C 语言中的关键字“volatile”,在 C 语言中该关键字用于表示变量是易变的,

要求编译器不要优化。这些结构体内的成员,都代表着寄存器,而寄存器很多时候是由外

设或 STM32 芯片状态修改的,也就是说即使 CPU 不执行代码修改这些变量,变量的值也

有可能被外设修改、更新,所以每次使用这些变量的时候,我们都要求 CPU 去该变量的地

址重新访问。若没有这个关键字修饰,在某些情况下,编译器认为没有代码修改该变量,

就直接从 CPU 的某个缓存获取该变量值,这时可以加快执行速度,但该缓存中的是陈旧数

据,与我们要求的寄存器最新状态可能会有出入。


©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值