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操作,寄存器操作,特殊变量,多线程变量读写都是很重要。
  • 相关阅读:
    java中的单例模式
    数组的冒泡排序
    2019年总结—即将而立之年的90后
    圣诞节开启博客之旅
    分布式多线程的Lock示例
    抽象工厂模式
    观察者模式
    建造者模式
    外观模式(Facade)
    模板方法模式
  • 原文地址:https://www.cnblogs.com/huanzxj/p/5466659.html
Copyright © 2011-2022 走看看