一. volatile关键字的作用

Volatile意思是“易变的”,应该解释为“直接存取原始内存地址”比较合适。“易变”是因为外在因素引起的,像多线程,中断等。

编译角度:防止编译器对代码优化,避免生成的机器代码少了一些指令,如果这些缺少的指令刚好是控制硬件的时序逻辑,就会出错。

应用场景:

(1) 硬件寄存器

int32* pnGpioB= (int32*)0xf0000000;//定义一个IO端口;
*pnGpioB = 0x01;
*pnGpioB = 0x02;
*pnGpioB = 0x04;
*pnGpioB = 0x08;

如果不加volatile修饰,编译器在优化后,只是执行了一次操作*pnGpioB = 0x08;和逻辑预期不符合

(2) 中断服务程序中修改的供其它程序检测的变量,需要加volatile

当变量在触发某中断程序中修改,而编译器判断主函数里面没有修改该变量,因此可能只执行一次从内存到某寄存器的读操作,而后每次只会从该寄存器中读取变量副本。

(3) 多任务环境下各任务间共享的标志,应该加volatile

int a = 10; 
int b = a; 
int c = a; 

由于编译器优化时有时会先把变量读取到一个寄存器中。在某个线程内,当读取一个变量a=10时,先把变量读取到一个寄存器中,以后再取变量值时,就直接从寄存器中取值。当内存变量a在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致 。

面试问题

(1)一个参数既可以是const还可以是volatile吗?

只读的状态寄存器,它是volatile因为其可能被意想不到的改变,是const因为程序不应该试图去修改它;

(2)一个指针可以是volatile 吗?

 中断服务子程序修改一个指向一个buffer的指针时,可以使用volatile修饰

(3)下面的函数被用来计算某个整数的平方,它能实现预期设计目标吗?如果不能,试回答存在什么问题?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值