#define __IO volatile

本文解析了STM32例程中__IO修饰符的含义及其底层实现,揭示了它与volatile关键字的关系,并通过实例说明了其在编译过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自https://blog.csdn.net/qq_35553587/article/details/79507277

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值