一、由于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百度百科