volatile关键字
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
1 #include <stdio.h>
2
3 void ISR_2(void);
4 volatile int i=0;
5 char c;
6 int main(void)
7 {
8 printf("================\n");
9 while (1)
10 {
11 scanf("%c",&c);
12 getchar();
13 if(c == 'a')
14 {
15 ISR_2();
16 }
17 if (i) {
18 printf("i == 1\n");
19 i = 0;
20 }
21 }
22 }
23 /* Interrupt service routine. */
24 void ISR_2(void)
25 {
26 printf("---------------------\n");
27 i=1;
28 }
通常用在:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
*注:以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在 1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。