[! 简介] 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; 
}