裸机开发之延时(空循环)volatile

一、由于volatile遇到的坑
今天在I.MX6U开发板的最简单的点灯裸机实验中遇到了因为volatile关键字的坑,具体如下:

void delay_short(unsigned int n)
{
    while(n--){};
}

//延时接近n ms(396MHz主频下)
void delay(unsigned int n)
{
    while(n--)
    {
        delay_short(0x7ff);
    }
}

最后经过排查了挺久才知道只要在delay_short的形式参数前添加valotile关键词即可,因此对于空循环中的变量需要添加volatile关键词,否则会被优化无法延时。

二、volatile关键字的作用

volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

精确地说就是,编译器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

1)并行设备的硬件寄存器(如:状态寄存器,存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义)
2)一个中断服务子程序中会访问到的非自动变量(中断服务程序中修改的供其它程序检测的变量)
3)多线程应用中被几个任务共享的变量

具体解析:
volatile百度百科

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值