微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 关于STM32库中 __IO 修饰符(volatile修饰符,反复无常的意思)

关于STM32库中 __IO 修饰符(volatile修饰符,反复无常的意思)

时间:11-10 来源:互联网 点击:
STM32例子代码中会有像这样的代码 static __IO uint32_t TimingDelay; 这里边的__IO修饰符不好理解,单从字面可以看出是为IO相关,查其标准库可以得知这个__IO原来是在Core_cm3.h中被重定义,其实就是volatile,句子如下

/* IO definitions (access restrictions to peripheral registers) */

#ifdef __cplusplus

#define __I volatile /*!< defines read only permissions */

#else

#define __I volatile const /*!< defines read only permissions */

#endif

#define __O volatile /*!< defines write only permissions */

#define __IO volatile /*!< defines read / write permissions */

不难看出这些修饰管是用于指示编译器在编译时如何对变量进行操作。volatile 的作用就是指示编译器不要因优化而省略此指令,必须每次都直接读写其值。

写一段测试代码如下

u8 test;

test = 1;

test = 2;

test = 3;

设置优化级别中级

运行后test会被直接取值为3 只有最后一个语句被编译

如用volatile

volatile u8 test;

test = 1;

test = 2;

test = 3;

则所有语句都会被编译。test先后被设置成1、2、3

由此可以看出这个作用在IO操作,寄存器操作,特殊变量,多线程变量读写都是很重要。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top