前言
本系列文章预计应该也许可能大概会持续更新一段时间。笔者将整理网络上各个面试题目,在此系列中。如有错误可以私信、评论指正,多多包涵~谢谢~
本期参考文章如下:
【八股文】嵌入式软件工程师-2025校招必备-详细整理_嵌入式软件开发八股-CSDN博客
1、 volatile 关键字
volatile关键字主要是为了防止编译器对变量进行优化,在某些特殊情况告知编译器存取某个变量的时候不在寄存器中存取,而是直接从内存存取。
int a = 1, b, c;
b = a;
c = a;
在上述代码中,第一行执行了变量的初始化。
第二行,b = a,编译器先将变量a的内存地址(&a)里的值存入 CPU,再从 CPU 读取值存入变量b的内存地址中。
第三行,c = a,由于此时 CPU 中已经有变量a的值,所以直接从 CPU 中读取值存入c的内存地址中。
当代码执行在第二行和第三行之间的时候,如果发送了中断,在中断处理函数中改变了a的值,那么此时变量a的内存地址中的值会改变,但是 CPU 的值不会,此时变量c的值是a的旧值。
volatile int a = 1, b, c;
b = a;
c = a;
在上述代码中,使用了 volatile 关键字。第一行与上面一致。
第二行,也一样。在第三行,此时 volatile 会让编译器不管咋样,都要从内存中存取,所以此时还是会访问a的内存地址,而不是 CPU 。那这样结果就和变量b的值一样了。
哪些情况下使用volatile?
(1)并行设备的硬件寄存器。存储器映射的硬件寄存器通常加volatile,因为寄存器随时可以被外设硬件修改。当声明指向设备寄存器的指针时一定要用volatile,它会告诉编译器不要对存储在这个地址的数据进行假设。
(2) 一个中断服务程序中修改的供其他程序检测的变量。volatile提醒编译器,它后面所定义的变量随时都有可能改变。因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
(3)多线程应用中被几个任务共享的变量。
2、 static 关键字
static是被声明为静态类型的变量,存储在静态区(全局区)中,其生命周期为整个程序。
static可以修饰变量和函数。
如果是静态局部变量,其作用域为一对{ }内。
如果是静态全局变量,其作用域为当前文件。