嵌入式 双选会现场面试记录
- 轮次
- 双选会
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 信号量有哪些?优先级反转怎么解决?
- 数组大小怎么测量?使用指针打印数组
- 实习主要负责什么?LoRa 通信?这个产品主要实现什么功能?
- LoRa 通信遇到过什么问题?为什么用 flash?环形缓冲的优势?
- 储物柜当时调试花了多长时间?有遇到什么问题吗?当时接不到回包怎么解决的?
- 为什么不用 DMA 半满中断?
- 除了 FreeRTOS,有了解别的 RTOS 架构吗?(Zephyr)
- 怎么用 AI?
- LoRa 是什么?
- 你的生物特征识别 RTOS 项目有拿去参加比赛吗?
- 哪个是国家级比赛?除了校设课设比赛,有没有自己做过的?
《参考解析》
信号量与优先级反转:信号量分二值信号量(互斥 / 同步,取值 0 或 1)、计数信号量(资源池计数、事件计数)和互斥量(带优先级继承、带所有者概念的信号量)。优先级反转是「高优先级任务等一个被低优先级任务持有的锁,而低优先级任务又被中优先级任务抢占」,导致高优先级任务被无限期延后。解决办法有三:优先级继承(持有锁的低优先级任务临时提升到等待者的优先级,FreeRTOS 的 Mutex 支持)、优先级天花板(把锁的优先级设为可能使用它的最高优先级)、以及设计上避免共享资源(关中断时间最短化、用无锁队列 / 消息传递代替共享)。经典案例是火星探路者的系统复位。
数组大小与指针:数组大小用 sizeof(arr)/sizeof(arr[0]),但只在数组定义可见的作用域内有效——作为函数参数传入后数组会退化成指针,sizeof 得到的是指针大小(这就是为什么传数组必须同时传长度)。指针打印数组用 for (i=0;i<n;i++) printf("%d ", *(p+i)); 或 p[i],要注意 p[i] 等价于 *(p+i),以及越界访问在嵌入式里往往不报错但会踩内存。相关的坑还有:字符数组与字符串字面量的 sizeof 差异、char *s = "abc" 不可写(在只读段)、以及 sizeof 是编译期求值而 strlen 是运行期。
LoRa 通信排查与环形缓冲:LoRa 是长距离低功耗的扩频调制技术,速率低但穿墙与距离好,常用于表计、储物柜这类低速采集场景。接不到回包的排查顺序是:先确认物理层(天线是否接好、频点与扩频因子 / 带宽是否与对端一致、有没有被金属屏蔽)、再确认配置(前导码、同步字、CRC 开关、目标地址)、再用示波器 / 逻辑分析仪看 SPI 与中断是否触发(模块到底有没有收到)、最后查软件(收包缓冲是否被覆盖、中断里是否做了耗时操作导致丢包)。为什么用 flash:存配置、日志与掉电需要保留的数据,注意磨损均衡与写入次数(擦写寿命有限,频繁写要加缓存或轮转区)。环形缓冲区(ring buffer)的优势是读写指针移动、无需搬移数据,O(1) 入队出队,适合生产者(中断 / DMA)与消费者(主循环)速率不匹配的场景;DMA 半满中断能在缓冲半满时就提前搬运,降低溢出风险,但不用它的常见理由是数据包边界不固定(半满处可能截断一帧)或实现复杂度高。
RTOS 与竞赛经历:除 FreeRTOS 外可以提 Zephyr(设备树 + Kconfig、功能全但学习曲线陡、生态偏 Linux 风格)、RT-Thread(国产、组件丰富、有软件包生态)、ThreadX / Azure RTOS(商业级、认证齐全)、以及裸机 + 状态机。面试官问「怎么用 AI」,如今已是常规必问,答法要落到具体场景(读数据手册、解释汇编、生成测试用例、排查编译错误),并说明边界(硬件时序与电气问题 AI 帮不了)。竞赛部分,能拿出「自己做的项目」比列一堆校级课程设计加分得多——双选会现场的面试官最想确认的就是「你亲手做过什么」。