[! 简介]
volatile(中文意为 “易变的、不稳定的”)是 C/C++ 中的一个类型修饰符,它的核心作用是:禁止编译器对这个变量做任何优化。编译器优化:编译器会把 内存中的值 缓存到寄存器,即使 硬件 改了内存中的值,程序读取的还是寄存器里的旧值
volatile的核心是禁止编译器对变量的优化,强制每次读写都操作内存(而非寄存器缓存)。
应用场景
硬件寄存器操作(嵌入式开发)
嵌入式中,硬件寄存器的地址是固定的,这些寄存器的值可能被硬件自动修改(比如定时器计数、传感器数据)
static void DWT_CNT_Update(void)
{
// 互斥锁:避免多个路径同时调用
static volatile uint8_t bit_locker = 0;
if (!bit_locker)
{
bit_locker = 1;
volatile uint32_t cnt_now = DWT->CYCCNT;
if (cnt_now < CYCCNT_LAST)
CYCCNT_RountCount++;
CYCCNT_LAST = DWT->CYCCNT;
bit_locker = 0;
}
}信号处理函数中的变量
信号处理函数(比如捕获 Ctrl+C)会异步修改变量,需要 volatile 确保主线程读取最新值
#include <stdio.h>
#include <signal.h>
volatile sig_atomic_t exit_flag = 0; // sig_atomic_t是信号安全的类型
// 信号处理函数(捕获Ctrl+C)
void handle_sigint(int sig)
{
exit_flag = 1;
printf("\n收到退出信号\n");
}
int main()
{
signal(SIGINT, handle_sigint); // 注册信号处理函数
while (!exit_flag)
{
printf("程序运行中(按Ctrl+C退出)...\n");
sleep(1);
}
printf("程序正常退出\n");
return 0;
}