永发信息网

有谁能否帮我解释一下C语言中的volatile关键字,最好是要有程序例子的。谢谢啊!!

答案:3  悬赏:0  手机版
解决时间 2021-03-04 18:14
  • 提问者网友:ミ烙印ゝ
  • 2021-03-04 00:01
有谁能否帮我解释一下C语言中的volatile关键字,最好是要有程序例子的。谢谢啊!!
最佳答案
  • 五星知识达人网友:骨子里都是戏
  • 2021-03-04 01:04
推荐一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
如TI corn 3的std_het.h文件里就有volatile的使用,



typedef volatile struct acmp_format
{
unsigned int : 11 ;
unsigned int brk : 1 ;
unsigned int next_program_address : 8 ;
unsigned int op_code : 4 ;
unsigned int : 3 ;
unsigned int : 5 ;

unsigned int : 10 ;
unsigned int auto_read_clear : 1 ;
unsigned int en_pin_action : 1 ;
unsigned int cond_addr : 8 ;
unsigned int pin_select : 5 ;
unsigned int : 2 ;
unsigned int pin_action : 1 ;
unsigned int : 1 ;
unsigned int t_register_select : 1 ;
unsigned int ab_register_select : 1 ;
unsigned int interrupt_enable : 1 ;

unsigned int : 7 ;
unsigned int data : 20 ;
unsigned int : 5 ;

} ACMP_FIELDS;

typedef volatile union
{
ACMP_FIELDS acmp ;
HET_MEMORY memory ;
} ACMP_INSTRUCTION;
详细说明可以看看参考对volatile的说明。
全部回答
  • 1楼网友:千夜
  • 2021-03-04 02:36
volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(vc++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。 例如: volatile int i=10; int j = i; ... int k = i; volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。 而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错。
  • 2楼网友:拜訪者
  • 2021-03-04 02:14
volatile 关键字告诉编译器改变量是一个“易变”变量,避免编译器将该变量进行优化为寄存器型,如优化为寄存器类型,则程序对该变量的操作只对寄存器起作用,而不会操作与真正的外设地址。多用于对外设(如寄存器)的声明。 如 #define REG_CTRL_VAL (*((volatile unsigned int *)0x4000 0000))
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯