你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【转】关于STM32库中 __IO 修饰符(volatile修饰符)

[复制链接]
feixiang20 发布时间:2017-5-25 22:03
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
% O/ `7 U, {/ L# `) y  #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
8 Y2 |0 y$ p! p5 V. [( C#define     __O     volatile             /*!< defines 'write only' permissions                */
0 @9 J: G9 I8 b9 O7 @# H#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 的作用就是指示编译器不要因优化而省略此指令,必须每次都直接读写其值。
9 P6 Y  P( |) w  \& K写一段测试代码如下3 \8 U) M% k* ]2 @9 a/ @9 i+ l3 J
  u8 test;
, H. T* I  p' V* K4 I- l- L
- V$ _; x' y  F5 F% x* U  test = 1;6 }$ z9 v2 f6 K$ O
  test = 2;
" [# W, e% ]  t6 o4 p  test = 3;
8 J' b5 y- s% W+ x5 c设置优化级别中级* W! n+ u+ G/ t0 j- @
运行后test会被直接取值为3 只有最后一个语句被编译
. M, o' U/ d! i+ Y& [, S如用volatile" h% }. H& I# u* `4 g
  volatile u8 test;
4 S8 H4 B7 u5 X8 Y. t/ 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;
( o( @' s9 @  D; ~& Y8 C- F则所有语句都会被编译。test先后被设置成1、2、39 V+ [$ N8 B0 `8 {" x9 _* t+ I
由此可以看出这个作用在IO操作,寄存器操作,特殊变量,多线程变量读写都是很重要。
# A( ~1 q" c4 g
收藏 评论2 发布时间:2017-5-25 22:03

举报

2个回答
mark0668 回答时间:2017-5-25 22:33:38
涨知识了.
peter001 回答时间:2017-5-26 00:45:06
这个修饰符常用,要牢记

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版