不积小流,无以成江海。
分类: c/c
2022-04-10 21:56:13
本意是“易变的”,因为访问寄存器要比访问内存单元快的多,所以编译器一般都做减少存取内存的优化。
加了这个修饰后,系统总是重新从它所在的内存读取数据。
volatile关键词影响编译器编译的结果。因为volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错。
编译器的优化
volatile解释为“直接存取原始内存地址”比较合适,
1、 中断服务程序中修改的供其他程序检测的变量需要加volatile;
例如:
static int i = 0;
int main(void)
{
…
while(1) {
if (i) dosomething();
}
}
/* interrupt service routine*/
void isr_2(void)
{
i = 1;
}
2、 多任务环境下各任务间共享的标志应该加volatile
3、 存储器映射的硬件寄存器通常也要加volatile
1、一个参数可以是const,还可以是volatile吗?
可以的。例如,只读的状态寄存器。
它是volatile,因为它可能被意想不到地改变;
是const,因为程序不应该试图是修改它。
2、一个指针可以是volatile吗?
可以,当一个中断子程序修改一个buffer的指针时。
频繁volatile很可能增加代码尺寸和降低性能,因此,要合理使用volatile。