影石嵌入式一面面经
面试流程
流程分三块:基础八股 → 项目深挖 → 手撕代码。整体感觉:考察点偏底层实现与系统设计,不满足于表面答案,问得很深。
一、八股文环节(核心难点)
这一部分不只是背诵,而是深挖机制,很多问题都追问到实现原理。
C语言与内存相关
- 函数指针和回调的本质区别?如何在中断回调和任务回调之间安全切换?
malloc
内部是如何管理堆的?在嵌入式系统里为什么尽量避免?memcpy
和memmove
的区别?如果自己实现要如何避免内存重叠问题?union
在寄存器映射里的应用,为什么比结构体更合适?
RTOS 内核机制
- FreeRTOS 的任务控制块(TCB)里面包含哪些关键内容?(栈指针、优先级、状态列表等)
- 内核是如何实现任务切换的?具体到 ARM Cortex-M,PendSV 中断和 SVC 的作用?
- 信号量、互斥量、事件组的底层差异?为什么互斥量会涉及优先级继承?
- 如果任务 A 持有互斥量但被高优先级任务 B 抢占,会发生什么?内核如何处理?
- 系统 tick 丢失会有什么后果?如何设计 tickless idle 来降低功耗?
驱动与硬件相关
- I2C DMA 和 I2C 中断模式的差异?在高频采样场景下哪个更合适?
- 如果 SPI 主机和从机时钟不同步,会有什么现象?怎么排查?
- USB 枚举流程的关键步骤?设备是如何告诉主机自己的配置的?
- 摄像头驱动中,为什么常用环形队列管理帧缓存?如何避免帧丢失?
全网最全面的嵌入式八股文专栏:https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk
二、项目深挖
项目问得非常细,面试官会结合你做过的模块,往系统设计和调优层面引导。
- 系统架构你做过的 RTOS 项目里,任务是如何划分的?任务优先级是基于什么考虑?为什么要用消息队列而不是直接共享内存?怎么保证实时性?
- 性能与调优你如何定位任务卡死?除了加日志,还有没有更底层的方法?(比如利用空闲任务统计、看门狗、硬件 trace)如果某个任务频繁触发上下文切换,怎么分析它是不是优先级配置不合理?
- 驱动与硬件结合你做过的 DMA 优化:是如何减少 CPU 占用的?如何保证 DMA 传输和中断同步?如果摄像头采集数据速率过高,导致队列满了,丢帧怎么解决?
- 系统稳定性嵌入式产品在量产后,偶发死机问题如何排查?如何用硬件定时器 + 看门狗实现双重保护?
三、手撕代码
题目很贴近实际:既考算法逻辑,也考嵌入式开发能力。
例题 1:环形缓冲区实现一个无锁环形缓冲区,要求:
- 读写指针用
volatile
修饰,保证中断和主循环同时访问安全; - 支持覆盖写模式;
- 提供
push
和pop
接口。
例题 2:简化版任务调度器实现一个简易任务调度器,要求:
- 每个任务有执行周期(ms);
- 在
main()
的死循环里,通过tick()
调用决定哪个任务该执行; - 要求支持多个任务同时运行,避免漂移。
例题 3(追问):如果任务执行时间超过了设定周期,如何处理?(考察你是否知道 “软实时 vs 硬实时” 的区别)
四、总结
影石一面的整体感觉:
- 八股不浅显,不止问 “RTOS 有几种内存分配”,而是问 TCB、任务切换机制、优先级继承等底层实现;
- 项目深挖到真实问题,比如 DMA 异常、摄像头丢帧、任务调度失衡;
- 手撕题偏工程化,不是纯算法,而是环形缓冲区、任务调度器这种贴近嵌入式开发的题目。
整体难度属于偏硬核,需要不仅会用,还要懂原理。