打印

有关编程中volatile这个定义是怎么回事?

[复制链接]
1882|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
恬蔚|  楼主 | 2013-10-30 10:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
volatile Uint16 DMABuf1[1024];
volatile Uint16 DMABuf2[1024];

volatile Uint16 *DMADest;
volatile Uint16 *DMASource;
为什么一定要用这个定义?我查了一下volatile的意思   但还是不明白  说什么要每次运行都要到它的地址去赋值
沙发
zhangmangui| | 2013-10-30 10:47 | 只看该作者
volatile定义之后  遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;
要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。volatile 指出变量DMABuf1是随时可能发生变化的,每次使用它的时候必须从DMABuf1的地址中读取

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
恬蔚 + 1 赞一个!
板凳
恬蔚|  楼主 | 2013-10-30 11:54 | 只看该作者
zhangmangui 发表于 2013-10-30 10:47
volatile定义之后  遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特 ...

谢谢哦~

使用特权

评论回复
地板
pinda_| | 2013-10-30 13:47 | 只看该作者
:D我的理解是强制运行,不进行优化,也就是说该变量在程序运行过程中一定会执行该步。一般,不太常用,偶尔发现变量出现问题的时候,可以加上这个关键字,看看出错情况。我们常见的是给系统寄存器加上这个关键字进行外部定义。

使用特权

评论回复
5
江枫渔火| | 2013-10-30 14:54 | 只看该作者

我举个例子给你:如果一个变量,在上下文中没有被赋值的语句操作,编译器会以为这个变量就是第一次取到的值,从没变过。而实际上,可能被硬件变化了,只是软件不知道。比如发生了中断,某个寄存器里的值已经变化了,但并不是在软件里被赋值,所以编译器不会知道这样的内幕。所以,一般头文件里对寄存器的宏定义,都会加这个关键字。这样每次去取这个寄存器的值时,都取最新的。不管它是不是被改变了。

使用特权

评论回复
6
zhangmangui| | 2013-10-30 22:39 | 只看该作者
江枫渔火 发表于 2013-10-30 14:54
我举个例子给你:如果一个变量,在上下文中没有被赋值的语句操作,编译器会以为这个变量就是第一次取到的 ...

是的  寄存器的一定要加上   因为硬件是随时变化的   
每次要用它的值时  都要读取一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

147

帖子

1

粉丝