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操作,寄存器操作,特别变量,多线程变量读写都是很重要。