6958|43

84

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于volatile的简单问题! [复制链接]

在bootloader里面的定义:将addr地址的值取出来给value,请问,前面加上volatile的用意何在,一般在什么情况下要加这个修饰符!谢谢!

#define HAL_READ_UINT32(addr, value)        ((value) = *((volatile UINT32 *)(addr)))

最新回复

谢谢,学习了  详情 回复 发表于 2010-3-21 22:11
点赞 关注

回复
举报

85

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
volatile 关键字是用来告诉编译器,该变量尽可能的存储在CPU的寄存器中,已加快cpu的处理速度

一般对短期内频繁使用的变量,在声明的时候会加该关键字
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 arnold9009 的回复:
volatile 关键字是用来告诉编译器,该变量尽可能的存储在CPU的寄存器中,已加快cpu的处理速度

一般对短期内频繁使用的变量,在声明的时候会加该关键字


你是不是说反了?

volatile 的基本用法是告诉编译器不要做优化,保证每次都是从变量的地址中读取,不是从临时寄存器中或cache等中读取,即使CPU刚访问过该变量。因为异步事件(如中断、IO电平变化、并发进程等)可能会异步地改变变量值。

 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 zyzhang365 的回复:
引用 1 楼 arnold9009 的回复:
volatile 关键字是用来告诉编译器,该变量尽可能的存储在CPU的寄存器中,已加快cpu的处理速度

一般对短期内频繁使用的变量,在声明的时候会加该关键字


你是不是说反了?

volatile 的基本用法是告诉编译器不要做优化,保证每次都是从变量的地址中读取,不是从临时寄存器中或cache等中读取,即使CPU刚访问过该变量。因为异步事件(如中断、IO电平变化、并发进程等)可能会异步地改变变量值。



呵呵 正确~~
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

5
 
不太清楚,感觉2楼的正确
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
1楼反了!

加volatile,每次的读取都从新从地址读!

不加,如果反复频繁使用时,可能会被编译器优化,导致一直在内存里面操作变量!
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 2 楼 zyzhang365 的回复:
引用 1 楼 arnold9009 的回复:
volatile 关键字是用来告诉编译器,该变量尽可能的存储在CPU的寄存器中,已加快cpu的处理速度

一般对短期内频繁使用的变量,在声明的时候会加该关键字


你是不是说反了?

volatile 的基本用法是告诉编译器不要做优化,保证每次都是从变量的地址中读取,不是从临时寄存器中或cache等中读取,即使CPU刚访问过该变量。因为异步事件(如中断、IO电平变化、并发进程等)可能会异步地改变变量值。



二楼正确。一楼反了
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

8
 
二楼正确!
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

9
 
volatile 的基本用法是告诉编译器不要做优化,保证每次都是从变量的地址中读取,不是从临时寄存器中或cache等中读取,即使CPU刚访问过该变量。因为异步事件(如中断、IO电平变化、并发进程等)可能会异步地改变变量值。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
一楼这不是在误导别人么。。。。。。
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

11
 
二楼解释得很清楚,一楼也来看看哈
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

12
 
二楼说得对,你可以写段代码,经过编译后查看反汇编代码就一目了然了。
除寄存器外还有一个很好的例子就是
int a;
while(a)
{
.......
}
不断查询a的状态,而a的值在某个驱动中会改变,这时候volatile 就一定要加,否则可能会被优化得while(a)始终不变。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

13
 
一楼也是好心,可能记反了,呵呵。一起学习。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

14
 
volatile保证程序永远都从指定的地址读取数据,一般用于宏定义芯片引脚的地址
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

15
 
二楼正确。
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

16
 
操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的

代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

举个例子
将一个变量说明为volatile表示这个变量是“易变的”。如果一个变量会被其它引用改变,或在其它并行的任务中会被改变(例如中断服务程序),都要显式地说明为“volatile”,否则在编译器优化阶段会作出错误的判断,例如将这个变量读入寄存器以后,在没有对这个变量赋值以前,会一直使用寄存器中的值,而实际上这个变量的值可能已经被一个指针引用改变了,或者是在中断服务程序中被改变了,下面这个例子说明这种错误:

    有一个变量T,在定时中断中每隔一个固定时间减一,然后在主程序中等待它减到0

unsigned char T;

void T0_int(void) interrupt 1
{
  ...
  T--;
  ...
}

void main(void)
{
  ...
  T=10;
  while (T!=0);   /* 这在某些编译器中将成为一个死循环,而不是预想的等待一段时间 */
  ...
}

正确的写法应该是将第一句改为:
volatile unsigned char T;
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

17
 
这个比较基础哦
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

18
 
程序中采用volatile修饰变量edge_capture ,这是操作系统内核编程经常用到的一个修饰关键字。
如果将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。

一般说来,volatile用在如下的几个地方:
中断服务程序中修改的供其它程序检测的变量需要加volatile ;
多任务环境下各任务间共享的标志应该加volatile;
存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

19
 
编译器不要做优化
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

20
 
二楼正解,一般是告诉编译器不要优化。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表