C语言中关键字 volatile

版权声明:均是学习笔记、心得,如有冒犯,请指出,会及时处理。https://blog.csdn.net/qq_27485531 https://blog.csdn.net/qq_27485531/article/details/82812887

1、volatile 

     volatile关键字在c语言中用于表示变量是易变的,告诉编译器不缓存该变量,也就是每次访问改变量都要去内存访问,不会访问该变量在缓存中的副本,也就是CPU的一级二级三级等等缓存,改变的时候也是直接写回内存的,不会放到缓存里,一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

      在嵌入式环境中用volatile关键字声明的变量,在每次对其值进行引用的时候都会从原始地址取值,而不会将值保存在栈或其他位置。

例如:

uint8_t *ptr =...; //设备地址 
*ptr = 1; //第一个指令 
*ptr = 0; //第二个指令 

以上程序编译器可能做优化而成:

int *ptr = ...; 
*ptr = 0; 

就会导致第一个指令丢失。如果用关键字volatile,那么编译器就会保证程序的原意,单片机库函数中对于IO寄存器的映射都会使用关键字volatile。

volatile uint8_t *addr = ...; 
*addr = 1; 
*addr = 0; 

2.在多任务环境下各任务间共享的标志也应该加volatile。

3.存储器映射的硬件寄存器通常也要加voliate,因为每次对它的读写都可能有不同意义。

例如:

假设要对一个设备进行初始化,此设备的某一个寄存器为0xXXXXXX。

int *uartSendRegist= (unsigned  int *)0xXXXXXXXXX;//定义一个串口数据寄存器地址;
int init(void)
{
   int i;
   for(i=0;i< 10;i++)
   {
 delaySomeTime();
     *uartSendRegist= data[i];
   }
}

猜你喜欢

转载自blog.csdn.net/qq_27485531/article/details/82812887