配色: 字号:
((volatile_unsigned_int_))详解
2012-03-30 | 阅:  转:  |  分享 
  
个重要特点。上述表达式拆开来分析,首先(volatileunsignedlong)0x48000000的意
思是把0x48000000强制转换成volatileunsignedlong类型的指针,暂记为p,那么就是
#defineAp,即A为P指针指向位置的内容了。这里就是通过内存寻址访问到寄存器A,
可以读/写操作。
用GCC编译时。volatile所指示的寄存器不进行优化!!!

理解#definerRTCCON((volatileunsignedchar)0x57000043)//RTCcontrol
嵌入式系统编程,要求程序员能够利用C语言访问固定的内存地址。既然是个地址,那么按
照C语言的语法规则,这个表示地址的量应该是指针类型。所以,知道要访问的内存地址后,
比如0x57000043,
第一步是要把它强制转换为指针类型
(unsignedchar)0x57000043,s3c2410的rRTCCON是单字节访问的(怎么看出来的???
我无法理解),所以0x57000043强制转换为指向unsignedchar类型。
volatile(可变的)这个关键字说明这变量可能会被意想不到地改变,这样编译器就不
会去假设这个变量的值了。这种“意想不到地改变”,不是由程序去改变,而是由硬件去改
变——意想不到。
第二步,对指针变量解引用,就能操作指针所指向的地址的内容了
(volatileunsignedchar)0x57000043
第三步,小心地把#define宏中的参数用括号括起来,这是一个很好的习惯。
在嵌入式系统中经常使用到Volatile,对于volatile的用法

编译器对代码的优化是指:
CPU在执行的过程中,因为访问内存的速度远没有cpu的执行速度快,为了提高效率,引入了
高速缓存cache.C编译器在编译时如果不知道变量会被其它外部因素(操作系统、硬件或者
其它线程)修改,那么就会对该变量进行标识,即优化.那么这个变量在CPU的执行过程中,就
会被放到高速缓存cache去,进而达到对变量的快速访问.在了解了优化的概念后,试想如
果我们事先就知道该变量会被外部因素改变,那么我们就在这个变量定义前加上Volatile,
这样编译器就不会对该变量进行优化.这样该变量在cpu处理的过程当中,就不会被放到高
速缓存cache中。
为什么要让变量在执行的过程中不被放到cache中去呢?
如果变量是被外部因素改变,那么cpu就无法判断出这个变量已经被改变,那么程序在执行
的过程中如果使用到该变量,还会继续使用cache中的变量,但是这个变量其实已经被改变
了.需要到内存地址中更新其内容了.
还有一个原因,在一些寄存器变量或数据端口的使用中,因为寄存器变量本身也是靠cache
来处理,为了避免引起错误,也可以使用volatile修饰符.

简单的说使用volatile的目的就是:
让对volatile变量的存取不能缓存到寄存器,每次使用时需要重新存取。
献花(0)
+1
(本文系MyBook7401首藏)