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

【转】关于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) */& C: K& P( z5 k. M+ Y4 h/ j
#ifdef __cplusplus0 v. M6 v9 t9 r& Q1 N/ q
  #define   __I     volatile             /*!< defines 'read only' permissions                 */
2 O! ^9 T+ x- s" l#else% X8 s$ L4 J5 i7 h7 a7 e
  #define   __I     volatile const       /*!< defines 'read only' permissions                 */
7 X+ `8 Q3 _* Y2 V1 `#endif0 U6 W9 _4 w* R: B3 F
#define     __O     volatile             /*!< defines 'write only' permissions                *// z9 T% J0 t# s/ S; f: N( {/ e
#define     __IO    volatile             /*!< defines 'read / write' permissions              */ + b8 g- ]; F/ h, q; i
- o1 O7 l4 I3 {" }+ _) H
不难看出这些修饰管是用于指示编译器在编译时如何对变量进行操作。volatile 的作用就是指示编译器不要因优化而省略此指令,必须每次都直接读写其值。
6 w. ]8 o' i  x' F% {$ T* }2 q写一段测试代码如下
" l! R( |8 C5 W* M  u8 test;, o& }( P/ W+ x; y2 o' V' q" _( a

( D5 C$ D! H% B% d* q; R  test = 1;
: B; [+ c& t3 _5 v  test = 2;2 k3 [3 ?+ x9 R& w6 L
  test = 3;
  d; n1 U5 i2 q  l- K设置优化级别中级/ N2 b" D1 U( ?% n
运行后test会被直接取值为3 只有最后一个语句被编译
1 p) U& T: b, }. N0 r如用volatile
8 j* h, J+ J4 L$ P2 e! q7 [6 J  volatile u8 test;
# q# V. b7 ?2 n5 I' D& o; G/ D2 n; y* @
  test = 1;7 z/ p. }# @$ O" A+ k& F
  test = 2;
5 J% b7 g: F2 k! t; T0 H; R- K  test = 3;
: V) a5 S* c- |& F( \3 V则所有语句都会被编译。test先后被设置成1、2、3
: h6 k; a8 |. U8 y1 N. x& F/ P2 Q由此可以看出这个作用在IO操作,寄存器操作,特殊变量,多线程变量读写都是很重要。0 `( l7 |, P: B  U
赞 收藏 评论2 发布时间:2017-5-25 22:03

举报

2个回答
mark0668 回答时间:2017-5-25 22:33:38
涨知识了.
peter001 回答时间:2017-5-26 00:45:06
这个修饰符常用,要牢记
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版