volatile是c/c++中的关键字,主要作用就是抑止编译器的缓存优化,变量不从register中读取,提醒编译器每次从地址中读取变量。
一.适用环境
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
二.测试
#include <unistd.h> #include <stdio.h> #include <signal.h> int i = 0; void alm_fn(int arg) { printf("alarm\n"); i = 1; // 中断改变定时器值 } int main(int argc,char **argv) { signal( SIGALRM,alm_fn ); alarm(5); printf("sleep\n"); while(i == 0); // i=1时执行下一句打印 printf("wake up\n"); return 0; }
三.调试
打开调试: gcc -g -o v v.c
打开调试编译运行,发现程序能正常退出。此时因为编译的是调试版本,没有进行优化,所以程序运行正常是在情理之中。
关闭调试: gcc -o v v.c
此时发现程序还是能正常退出,貌似不加volatile也行,别急 ...
打开O2选项优化: gcc -O2 -o v v.c
程序果然没有退出,看来变量i被顺利的优化了。加上volatile关键字,程序正常退出。由此证明volatile起到抑止编译器优化作用,为了保证程序健壮性,在上面三种环境下加上volatile关键字。