C语言知识点学习之volatile关键字

本文深入探讨了volatile关键字的作用,解释了它如何确保在嵌入式编程中变量的正确读写,特别关注了其在中断服务程序、多任务环境和硬件寄存器中的使用。通过实例分析,强调了正确使用volatile对于避免编程错误的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

volatile关键字:
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不
会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小
心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。由于访问寄存器
的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。
比如:
static int i=0;
int main(void)
{
    ...
    while ( 1 )
    {
        if ( i )
        {
            dosomething();
        }
    }
}
/*Interrupt service routine.*/
void ISR_2(void)
{
    i=1;
}
程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,但是,由
于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器
的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething
永远也不会被调用。如果将将变量加上volatile修饰,则编译器保证对此变量的读写
操作都不会被优化(肯定执行)。此例中i也应该如此说明。一般说来,volatile用在
如下的几个地方:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile。
2、多任务环境下各任务间共享的标志应该加volatile。
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对
   它的读写都可能有不同意义。
不懂得volatile 的内容将会带来灾难,这也是区分C语言和嵌入式C语言程序员的一
个关键因素。为强调volatile的重要性,再次举例分析:
代码一:
int a,b,c;
//读取I/O空间0x100端口的内容
a= inword(0x100);
b=a;
a=inword(0x100);
c=a;
代码二:
volatile int a;
int b,c;
a = inword(0x100);
b = a;
a = inword(0x100);
c = a;
在上述例子中,代码一会被绝大多数编译器优化为如下代码:
a=inword(0x100)
b=a;
c=a;
这显然与编写者的目的不相符,会出现I/O空间0x100端口漏读现象,若是增加volatile,像
代码二所示的那样,优化器将不会优化掉任何代码.从上面来看,volatile关键字是会降低
编译器优化力度的,但它保证了程序的正确性,所以在适合的地方使用关键字volatile是
件考验编程功底的事情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值