zoukankan      html  css  js  c++  java
  • 关于STM32库中 __IO 修饰符(volatile修饰符,反复无常的意思)

    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操作,寄存器操作,特殊变量,多线程变量读写都是很重要。
  • 相关阅读:
    Hive窗口函数
    自然周与自然月的Hive统计SQL
    Spark中的Join类型
    随机生成验证码类
    mysql看视频笔记
    sql工作记录
    mysql和sqlserver的区别
    mysql的安装配置
    把一个数组遍历倒序放到另一个数组中,数组取值是c:out value
    Echarts雷达代码
  • 原文地址:https://www.cnblogs.com/huanzxj/p/5466659.html
Copyright © 2011-2022 走看看