volatile关键字

volatile是c/c++中的关键字,主要作用就是抑止编译器的缓存优化,变量不从register中读取,提醒编译器每次从地址中读取变量。

 

一.适用环境

1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

2、多任务环境下各任务间共享的标志应该加volatile;

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

 

二.测试

#include <unistd.h>
#include <stdio.h>
#include <signal.h>

int i = 0;

void alm_fn(int arg)
{
	printf("alarm\n");
	i = 1;   // 中断改变定时器值
}

int main(int argc,char **argv)
{
	signal( SIGALRM,alm_fn );
	alarm(5);

	printf("sleep\n");
	while(i == 0);  // i=1时执行下一句打印
	printf("wake up\n");

	return 0;
}

 

 

三.调试

打开调试: gcc -g -o v v.c

打开调试编译运行,发现程序能正常退出。此时因为编译的是调试版本,没有进行优化,所以程序运行正常是在情理之中。

关闭调试: gcc -o v v.c 

此时发现程序还是能正常退出,貌似不加volatile也行,别急 ...

打开O2选项优化:   gcc -O2 -o v v.c 

程序果然没有退出,看来变量i被顺利的优化了。加上volatile关键字,程序正常退出。由此证明volatile起到抑止编译器优化作用,为了保证程序健壮性,在上面三种环境下加上volatile关键字。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值