Volatile的应用场景
1、当一个变量可能会被意想不到的更新时,要使用volatile来声明该变量,告诉编译器它所修饰的变量的值可能会在任何时刻被意外的更新。 2、语法 volatile int foo; int volatile foo; volatile int * foo; int volatile * foo; int * volatile foo; int volatile * volatile foo; 3、场景 1)并行设备的硬件寄存器(如状态寄存器) 假设我们有一个8位的状态寄存器映射在地址0x1234上。系统需要我们一直监测状态寄存器的值,直到它的值不为0为止。通常错误的实现方法是: UINT1 * ptr = (UINT1 *) 0x1234; // Wait for register to become non-zero.等待寄存器为非0值 while (*ptr == 0); // Do something else.作其他事情 汇编代码: mov ptr, #0x1234 mov a, @ptr loop bz loop 编译器认为变量值总是不变的,不必要到内存中读取它,使用一个无限循环来结束 正确: UINT1 volatile * ptr = (UINT1 volatile *) 0x1234