免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 南海一钓叟
打印 上一主题 下一主题

那为大侠给俺讲讲cache和volatie变量的关系 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2008-03-03 15:24 |只看该作者

to sohu2000000

请问http://blog.chinaunix.net/u1/52454/showart_486989.html这个帖子中的例1

例1.


void main (void)
{
   volatile int i;
   int j;

  i = 1;  //1  不被优化 i=1
  i = 2;  //2  不被优化 i=1
  i = 3;  //3  不被优化 i=1
  
   j = 1;  //4  被优化
   j = 2;  //5  被优化
   j = 3;  //6  j = 3
}

i的最终结果是多少?1?还是3?

[ 本帖最后由 zhlyp 于 2008-3-3 15:28 编辑 ]

论坛徽章:
0
42 [报告]
发表于 2008-03-03 15:31 |只看该作者
我在linux下编译的结果i=3
但是不理解楼上例子的意思

论坛徽章:
0
43 [报告]
发表于 2008-03-03 15:45 |只看该作者
原帖由 zhlyp 于 2008-3-3 15:31 发表
我在linux下编译的结果i=3
但是不理解楼上例子的意思

这就是volatie的另一个功能,主要用于嵌入式(嵌入式我不懂,说错误怪)
就是体现一个时序。
这里i的变化有3个过程, i = 1, i =2, i =3 ,编译器会把这个过程体现出来,汇编指令变为如下序列:
i 赋值为1
i 赋值为2
i 赋值为3

最终结果当然是3,只是体现了i变化的一个过程。

如果没有volatie修饰,编译器会把前两次赋值忽略掉,也就是所谓的优化掉,汇编指令变成一条:
i 赋值为3

论坛徽章:
0
44 [报告]
发表于 2008-03-03 15:56 |只看该作者
原帖由 zx_wing 于 2008-3-3 15:45 发表

这就是volatie的另一个功能,主要用于嵌入式(嵌入式我不懂,说错误怪)
就是体现一个时序。
这里i的变化有3个过程, i = 1, i =2, i =3 ,编译器会把这个过程体现出来,汇编指令变为如下序列:
i 赋值为1 ...

奥,谢谢
那就是说那个例子应该错了
应该改成
  i = 1;  //1  不被优化 i=1

  i = 2;  //2  不被优化 i=2

  i = 3;  //3  不被优化 i=3


[ 本帖最后由 zhlyp 于 2008-3-3 15:57 编辑 ]

论坛徽章:
0
45 [报告]
发表于 2008-03-03 16:04 |只看该作者
原帖由 zhlyp 于 2008-3-3 15:56 发表

奥,谢谢
那就是说那个例子应该错了
应该改成
  i = 1;  //1  不被优化 i=1

  i = 2;  //2  不被优化 i=2

  i = 3;  //3  不被优化 i=3

对,我估计是笔误

论坛徽章:
0
46 [报告]
发表于 2008-03-03 17:58 |只看该作者
受教了。 比原来理解的更深一些

论坛徽章:
0
47 [报告]
发表于 2008-03-03 18:52 |只看该作者
幸好手边有keil,要不真颠覆自己对volatile的理解了,调试过程如下。
说明:mov操纵片内的256byte的RAM, Memory View中d:0x0008显示的便为片内RAM0x0008处值。

1.jpg (50.42 KB, 下载次数: 56)

1.jpg

2.jpg (49.94 KB, 下载次数: 57)

2.jpg

3.jpg (48.79 KB, 下载次数: 60)

3.jpg

4.jpg (50.55 KB, 下载次数: 53)

4.jpg

论坛徽章:
0
48 [报告]
发表于 2008-03-03 18:57 |只看该作者
这哥们是不是调程序时看程序存储器0x0008处值了,那倒真是一直是1.

论坛徽章:
0
49 [报告]
发表于 2008-03-04 12:50 |只看该作者
一般来说,如果做device driver 的程序员,对这个问题分得很清楚。volatile 是用来防止编译器对代码进行优化的,定义成volatile的变量,不会被分配临时的寄存器来优化。所以,对外设来说,读的时候,读到的是内存的即时值。可以通过反汇编来比较一下源代码。cacha 是cpu读写时的一块缓冲区,一般对内存的操作是enable cacha的,但对外设必须对cacha进行单独的操作或关掉cacha.一般地,读的时候是invalidate cacha.写的时候是flush cacha。如果有MMU的话,可以自己配一块内存,单独对cacha 进行管理。

论坛徽章:
0
50 [报告]
发表于 2008-03-04 14:36 |只看该作者
mark一下,拜服各位高手。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP