主要是总结自己日常学习到的重点知识。
1、使用volatile定义一个变量。
含义:优化器在用到这个变量时,必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
2、 volatile通常在以下几个地方使用:
①中断服务程序中修改的供其他程序检测的变量需要使用volatile;
②多任务环境下各任务间共享的标志也需要使用volatile;
③存储器映射的硬件寄存器也要加volatile说明。
3、一个参数既可以是volatile也可以是const:只读状态寄存器(它可以被改变,但程序不应该试图去修改它)。
4、volatile 指针
①代码如下:
volatile uint32_t *DataReg;
上述代码中,volatile修饰的是指针所指内容。定义了一个uint32_t 类型的指针,这个指针指向的是一个volatile的对象,编译器必须保证对datareg的操作都不会被优化。
指针变量本身并不是volatile的。如果对指针变量DataReg本身进行计算或赋值等操作,那么可能会被编译器优化,但对DataReg所指向内容的引用是不能进行编译器优化的。
在驱动程序的开发中,对硬件寄存器指针的定义,通常都会采用该形式。
②另一种形式:
uint32_t * volatile DataReg;
上述代码中volatile修饰的是DataReg这个变量。这里实际上是定义了一个uint32_t 类型的指针,并且这个指针变量本身是volatile 的。但是指针所指的内容并不是volatile的。
在实际使用时,编译器对指针变量DataReg本身的操作不会进行优化,但是对DataReg所指的内容会进行处理,对DataReg的操作还是会被优化。
该写法通常用在对共享指针的声明上。将一个变量定义为volatile以后,编译器每次取指针变量值的时候都会从内存中载入,即便该变量已经被其他程序修改了,但在当前函数被使用的时候也可以得到修改后的值。