当前位置: 代码迷 >> 单片机 >> stm32 编译预加工求解
  详细解决方案

stm32 编译预加工求解

热度:432   发布时间:2016-04-28 14:45:59.0
stm32 编译预处理求解
小弟最近在学习stm32,其中很多东西不懂,恳请大神指教~~~
问题1:比如:下面这个关键字 volatile,我也百度过,说是可变的,可是它在程序中的具体作用是什么呢?
问题2:再比如:使用_IO和使用IO的作用有啥区别?
#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     

------解决思路----------------------
楼上说的都对。
我补充一点,volatile的在什么情况下需要使用。

如果你定义了静态变量,在多线程(或者说多任务)的情况下,或者说类似于多线程的情况下,是需要加volatile关键字的。

多线程情况:假如你使用了UCOS2这类支持多任务的操作系统,某个静态变量需要在多个任务中被访问到,这种情况需要加volatile关键字。

类似于多线程情况:中断ISR其实类似于一个线程(或者说任务),多线程其实本身就是利用了定时器中断和软中断的。如果某个静态变量在中断中被使用,在用户任务中也被使用了,或者说在多个中断中使用,这也都需要加volatile关键字。

需要加volatile关键字的原因:不加的话,可能会被编译器优化,程序流程被切换到另一个"线程“或者中断ISR后,程序可能会去读原来临时保存在寄存器中的值,但实际上这个值可能已经变了,如果还是去读寄存器中的值,读出来的可能就是过时的数据,会导致表面上很奇怪的逻辑问题。我已经在这个地方栽过很多次跟头了,出现这种奇怪的现象我基本上就知道是这个问题。

如果单片机嵌入式中用到了cache,编译器优化时,也可能会优化到cache中存放,不一定总是优化到CPU核内的寄存器。例如S3C44B0。cache是比CPU核内的寄存器慢,但比SRAM和flash还是要快点的。