版权声明:均是学习笔记、心得,如有冒犯,请指出,会及时处理。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];
}
}