在C语言中,volatile
是一个类型修饰符。它告诉编译器,被修饰的变量可能会在程序的控制或知识之外被改变。这通常发生在以下几个情况:
- 硬件寄存器的映射。
- 由不同线程在多线程程序中访问的变量。
- 信号处理程序中的变量。
使用 volatile
告诉编译器不应优化掉这些变量的读写,因为它们可能会突然改变,而这种改变是编译器无法预测的。这确保了每次访问 volatile
变量都会直接从它的实际内存地址读取,而不是从可能已经不同步的寄存器或其他缓存中读取。
使用 volatile
的正确性和需要它的场合通常涉及到硬件和并发编程。下面进一步介绍几个 volatile
关键字的用途和一些注意事项:
嵌入式编程
在嵌入式系统编程中,volatile
经常被用于访问由硬件事件更新的内存。例如,一个硬件计时器可能会更新一个内存位置,表示计时器的值。由于硬件会改变这个值,而且这种变化是异步的(即编译器和程序流程无法预测的),因此这个变化应通过 volatile
变量来读取:
volatile uint32_t *timer = (volatile uint32_t *)0x10000000;
uint32_t timer_value;
timer_value = *timer; // 读取硬件计时器的值
上面的代码示例中,指针 timer
指向一个硬件计时器的内存映射地址,