分类:
2008-05-24 01:07:07
|
如果i没有被volatie修饰,当while循环执行时,另一段程序并发的执行了i=0, 这个循环仍不会退出,因为每次循环都是检查寄存器中的值。
如果有volatie修饰,那么循环结束,因为循环每次检查i的时候,会先从内存把i读入寄存器,这个时候i在其它地方被赋0,则循环结束。
|
这就是volatie的另一个功能,主要用于嵌入式(嵌入式我不懂,说错误怪)
就是体现一个时序。
这里i的变化有3个过程, i = 1, i =2, i =3 ,编译器会把这个过程体现出来,汇编指令变为如下序列:
i 赋值为1
i 赋值为2
i 赋值为3
最终结果当然是3,只是体现了i变化的一个过程。
如果没有volatie修饰,编译器会把前两次赋值忽略掉,也就是所谓的优化掉,汇编指令变成一条:
i 赋值为3
一般来说,如果做device driver 的程序员,对这个问题分得很清楚。volatile 是用来防止编译器对代码进行优化的,定义成volatile的变量,不会被分配临时的寄存器来优化。所以,对外设来说,读的时候,读到的是内存的即时值。可以通过反汇编来比较一下源代码。cacha 是cpu读写时的一块缓冲区,一般对内存的操作是enable cacha的,但对外设必须对cacha进行单独的操作或关掉cacha.一般地,读的时候是invalidate cacha.写的时候是flush cacha。如果有MMU的话,可以自己配一块内存,单独对cacha 进行管理。