参考
嵌入式秋招面试中,你一定要掌握的c基础——关键字详解(1)_牛客网 (nowcoder.com)
嵌入式校招_面试经验大全【C语言】【2_关键字】_牛客网 (nowcoder.com)
static
volatile
在C语言中,volatile
关键字是一种类型修饰符,用于告诉编译器该变量的值可能会在程序的控制之外被改变。这意味着编译器在每次访问这个变量时都必须重新从内存中读取它的值,而不是使用可能已经存储在寄存器中的缓存值。这是因为某些变量的值可能会因为外部事件(如硬件中断、多线程环境中的其他线程操作等)而意外地改变,而这些变化编译器在编译时是无法预知的。
含义
- 防止编译器优化:编译器在优化代码时,可能会将频繁访问的变量缓存到寄存器中,以减少对内存的访问次数。然而,如果变量是
volatile
修饰的,编译器就会避免这种优化,确保每次访问都直接从内存中读取该变量的值。 - 保证变量的可见性:在多线程程序中,
volatile
可以用来确保一个线程对变量的修改对其他线程是可见的。但需要注意的是,volatile
并不保证操作的原子性,也不提供线程同步机制。 -
举例说明
假设你正在编写一个嵌入式系统程序,该程序需要读取一个由硬件定时器更新的寄存器值。由于这个值可能会在任何时候由硬件更新,你不能依赖编译器对变量访问的优化。
在这个例子中,
timer_value
被声明为volatile
,以确保每次在check_timer
函数中访问它时,都是从实际的硬件寄存器中读取其值,而不是从可能被编译器缓存的某个旧值中读取。这样,程序就能正确地响应硬件定时器产生的变化。
const
extern
typedef
sizeof