兆易创新嵌入式开发一面,面试官主要问了这些
1. volatile 关键字有什么作用?它能保证线程安全吗?
答案:
volatile 的作用是告诉编译器,这个变量的值可能会被外部因素修改,因此每次使用都要直接从内存中读取,而不是从寄存器或缓存中取值。
它常用于:
- 中断与主循环共享变量
- 多线程共享标志位
- 硬件寄存器映射
但 volatile不能保证线程安全,因为它只能保证“可见性”,不能保证“原子性”。如果是复合操作,比如 count++,仍然可能发生竞争问题。
2. const 和 #define 的区别是什么?
答案:
const 是有类型的常量,编译器会做类型检查,调试时也更容易定位。
#define 是预处理宏,本质上是文本替换,没有类型信息。
主要区别:
const有类型安全,#define没有const更适合定义常量变量#define更适合条件编译、宏开关、简单宏表达式
在实际开发里,能用 const 的地方通常优先用 const。
3. 指针和引用的区别是什么?
答案:
指针本质上是一个变量,保存另一个变量的地址;引用则是变量的别名。
区别主要有:
- 指针可以为空,引用定义时必须初始化
- 指针可以改变指向,引用一旦绑定后不能再改
- 指针需要解引用访问,引用可以像普通变量一样使用
- 指针占内存,引用本质上更像语法层封装
在 C 语言和嵌入式底层开发中,指针更常用;在 C++ 接口设计中,引用可读性更好。
4. 什么是栈和堆?它们的区别是什么?
答案:
栈和堆都是内存的一部分,但管理方式不同。
栈:
- 由系统自动分配和释放
- 存放局部变量、函数参数、返回地址
- 分配速度快,但空间通常较小
堆:
- 由程序员手动申请和释放
- 常用于动态内存分配
- 更灵活,但容易产生内存泄漏和碎片
嵌入式系统里通常更谨慎使用堆,因为系统往往更强调可控性和稳定性。
5. 什么情况下会发生内存泄漏?在嵌入式中为什么要特别关注?
答案:
内存泄漏是指申请了内存但没有释放,导致这部分内存后续无法再被使用。
常见情况:
malloc后忘记free- 指针被覆盖,原地址丢失
- 异常流程中提前返回,未释放资源
嵌入式系统中内存本来就有限,而且设备通常需要长期稳定运行,所以内存泄漏积累后可能导致系统越来越慢,甚至崩溃。
6. static 关键字在 C 语言里有哪些作用?
答案:
static 在不同位置有不同含义。
修饰局部变量时:
- 变量只初始化一次
- 生命周期延长到整个程序运行期间
- 作用域仍然只在当前函数内
修饰全局变量或函数时:
- 作用域限制在当前文件内
- 防止外部文件访问,起到隐藏作用
在嵌入式中,static 常用于模块内私有函数、私有全局变量和状态保存。
7. 为什么中断服务函数里不建议做复杂逻辑?
答案:
因为中断
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

查看12道真题和解析