C语言volatile的应用举例

volatile 本意为“易变的”,它的作用是,当程序以一种编译器不知道的方式更改变量时,防止编译器对其进行任何优化(需要注意的是编译器的优化等级)。用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能重复使用放在cache或寄存器中的备份
volatile变量的例子:

1、中断的发生,

1.char flag = 0;
2.
3.int main(void)
4.{
5.    ...
6.    while(1)
7.    {
8.        if (flag)
9.            do_something();     
10.    }
11.}
12.
13./*中断服务程序*/
14.void ISR_1(void)
15.{
16.    flag = 1;
17.}

上述程序存在的一个问题就是 flag 没有使用 volatile 进行修饰,而编译器判断在 main 函数里没有别的操作对 flag 的值进行更改,可能就只执行一次从 flag 到某寄存器的读取操作,这时中断里对 flag 的操作将被忽略,函数将一直执行不到 do_something 的内容。用 volatile 将可以避免这个问题的出现

2、对寄存器的操作

在嵌入式开发中,常常要操作寄存器,对寄存器进行写入,读出等等操作。每个寄存器都有自己固有的地址,通过C语言访问这些地址就变得尤为重要。

#define GSTAT   (*(volatile unsigned int *)0x560000B0)

在这里,我们举一个例子。这是一个状态寄存器的宏定义。首先,通过unsigned int我们能够知道,该寄存器是32位的。因为要避免程序执行过程中直接从cache中读取数据,所以用volatile进行修饰。
每次都要重新读取该地址上的值。首先(volatile unsigned int*)是一个指针,我们就假设它为p吧。它存储的地址就是后面的0x560000B0,然后取这个地址的值,也就是p,所以源代码变成了((volatile unsigned int *)0x560000B0),接下来我们就能直接赋值给GSTAT来改变地址0x560000B0上存储的值了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值