面灵AI→

嵌入式 双选会现场面试记录

轮次
双选会
时间
2026-10
来源
牛客网

《面试题目》

  1. 信号量有哪些?优先级反转怎么解决?
  2. 数组大小怎么测量?使用指针打印数组
  3. 实习主要负责什么?LoRa 通信?这个产品主要实现什么功能?
  4. LoRa 通信遇到过什么问题?为什么用 flash?环形缓冲的优势?
  5. 储物柜当时调试花了多长时间?有遇到什么问题吗?当时接不到回包怎么解决的?
  6. 为什么不用 DMA 半满中断?
  7. 除了 FreeRTOS,有了解别的 RTOS 架构吗?(Zephyr)
  8. 怎么用 AI?
  9. LoRa 是什么?
  10. 你的生物特征识别 RTOS 项目有拿去参加比赛吗?
  11. 哪个是国家级比赛?除了校设课设比赛,有没有自己做过的?

《参考解析》

信号量与优先级反转:信号量分二值信号量(互斥 / 同步,取值 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 帮不了)。竞赛部分,能拿出「自己做的项目」比列一堆校级课程设计加分得多——双选会现场的面试官最想确认的就是「你亲手做过什么」。