STM32例子代码中会有像这样的代码 static __IO uint32_t TimingDelay; 这里边的__IO修饰符不好理解,单从字面可以看出是为IO相关,查其标准库可以得知这个__IO原来是在Core_cm3.h中被重定义,其实就是volatile,句子如下 /* IO definitions (access restrictions to peripheral registers) */2 V" O6 f5 z! m8 M* z$ R#ifdef __cplusplus #define __I volatile /*!< defines 'read only' permissions */, C+ |* Q8 M$ ~9 y: ? #else5 I! ~& s( g+ Y5 K7 b7 l: A #define __I volatile const /*!< defines 'read only' permissions *// p* E0 n' ?; D% b+ c5 b #endif #define __O volatile /*!< defines 'write only' permissions */ #define __IO volatile /*!< defines 'read / write' permissions */ : x% K. v7 g6 D5 @0 D* x% b / R; `' X% `8 s; k5 d) N6 L 不难看出这些修饰管是用于指示编译器在编译时如何对变量进行操作。volatile 的作用就是指示编译器不要因优化而省略此指令,必须每次都直接读写其值。 写一段测试代码如下3 \8 U) M% k* ]2 @9 a/ @9 i+ l3 J u8 test; test = 1;6 }$ z9 v2 f6 K$ O test = 2; test = 3; 设置优化级别中级* W! n+ u+ G/ t0 j- @ 运行后test会被直接取值为3 只有最后一个语句被编译 如用volatile" h% }. H& I# u* `4 g volatile u8 test; / u, q" _( B8 j* {- ?: \; M test = 1;% l' j! {9 }& a) i9 z5 e test = 2;7 p$ N! P p; C. {# @9 j, J% s test = 3; 则所有语句都会被编译。test先后被设置成1、2、39 V+ [$ N8 B0 `8 {" x9 _* t+ I 由此可以看出这个作用在IO操作,寄存器操作,特殊变量,多线程变量读写都是很重要。 |
涨知识了. |
这个修饰符常用,要牢记 |