Chinaunix首页 | 论坛 | 博客
  • 博客访问: 122407
  • 博文数量: 36
  • 博客积分: 2001
  • 博客等级: 大尉
  • 技术积分: 422
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-03 01:43
文章分类

全部博文(36)

文章存档

2011年(1)

2009年(2)

2008年(33)

我的朋友

分类:

2008-05-24 01:07:07

最近才程序中看到Volatile这个关键字,原来没有接触过,所以上网搜了一下,发现了一篇很好的文章,同时也觉得自己懂得东西真是太少了,要学的东西还很多,否则2年后毕业都不知道能找到什么样的工作
 
先把网址贴在这里,以后要用的时候再去细看:

摘录部分:

int volatie i; //全局变量,在其它地方会被修改
while (i)
{
do_somethings();
}

如果i没有被volatie修饰,当while循环执行时,另一段程序并发的执行了i=0, 这个循环仍不会退出,因为每次循环都是检查寄存器中的值。
如果有volatie修饰,那么循环结束,因为循环每次检查i的时候,会先从内存把i读入寄存器,这个时候i在其它地方被赋0,则循环结束。

void main (void)
{
   volatile int i;
   int j;
   i = 1; //1 不被优化 i=1
   i = 2; //2 不被优化 i=2
   i = 3; //3 不被优化 i=3

   j = 1; //4 被优化,汇编代码忽略
   j = 2; //5 被优化 汇编代码忽略
   j = 3; //6 j = 3
}

这就是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 进行管理。

阅读(838) | 评论(0) | 转发(0) |
0

上一篇:LDR指令总结

下一篇:Linux-dd命令详解

给主人留下些什么吧!~~