面灵AI→

昂瑞微二面(10.10)

轮次
二面
时间
2026-10
来源
牛客网

《面试题目》

  1. 自我介绍。
  2. 发表的论文是做什么的,创新点是什么?
  3. 操作系统学过吗,运行机制是什么?
  4. 中断向量表了解吗?前几个是什么?
  5. 项目中的 DMA 怎么配置的?
  6. 串口加 DMA 怎么配置的?
  7. DMA 怎么中断?
  8. DMA 接收大小是多少?
  9. 设计的通信协议是什么?
  10. 帧尾没收到怎么办?
  11. bootloader 怎么设计的?
  12. 升级中掉电怎么办?
  13. DMA 最后一包剩的数据接收到后怎么中断通知其他任务?
  14. 汇编了解吗?
  15. MOV 指令
  16. MRS、MSR 指令
  17. 位测试指令
  18. CBZ、CBNZ 指令
  19. FreeRTOS 任务切换机制
  20. 了解单片机上的文件系统吗?
  21. 了解其他开源系统吗,比如 RT-Thread?
  22. 用过蓝牙、WiFi 吗?
  23. 了解蓝牙主从角色吗?你知道的讲一下。
  24. 了解轻量级 IP 协议吗?

《参考解析》

串口 DMA 的配置与中断通知:标准配置链路是:先把 USART 的收发引脚复用、波特率/数据位/校验位配好,再配 DMA 流或通道——指定外设地址(数据寄存器)与内存地址、数据宽度、传输方向、是否地址自增、单次还是循环模式、FIFO 阈值与突发长度,然后打开 USART 的 DMA 收发请求位并启动 DMA。中断方式要分清三类:DMA 传输完成中断(整块搬完)、半传输中断(搬了一半,适合双缓冲)、以及串口的空闲中断 IDLE(一帧结束的标志,接收不定长数据最常用)。「最后一包不足阈值怎么通知」正是这个点:定长 DMA 收不满就不触发完成中断,典型做法是用 DMA 循环模式加 IDLE 中断,或者用「剩余计数快照 + 超时」判断帧尾,收到后在中断里只做置标志、发信号量或写环形缓冲,真正的解析交给任务做,绝不在中断里跑长逻辑。

通信协议设计与帧尾丢失:工业串口协议一般有帧头、长度、序号、负载、校验(CRC16/异或和)、帧尾。要答出「为什么这么设计」:帧头用于快速定位起点,长度或固定分隔决定边界,校验用于发现错误,序号用于检测丢帧与重复。帧尾收不到的处理方式有几层:靠超时重同步——只要在预期时间内没有收全一帧,就把缓冲清掉重新找帧头;靠长度字段兜底,不依赖帧尾也能判定完整;用序号发现中间丢帧并请求重传,或让上位机做整包重发;接收侧用环形缓冲 + 状态机解析,容忍粘包与半包。可以顺带说明为什么不用纯分隔符:负载里出现同样的字节就会被误判,所以要么转义要么改成「长度 + 校验」。

bootloader 与升级掉电:稳妥的做法是分区设计:bootloader 区、应用区 A/B 双区(或应用区 + 备份区)、参数区。升级流程是「先写备份区或备区 → 校验(CRC/签名)→ 写升级标志位 → 复位进 bootloader → bootloader 校验并搬运或直接跳转 → 成功则清除标志、失败则回滚」。掉电保护的关键在于每一步都可恢复:写 flash 必须以扇区或块为最小单位且先擦后写,标志位最后写且带 CRC,搬运过程中掉电时靠标志位与双方 CRC 判断该回滚还是续传,绝不能在原地擦掉唯一可用镜像。跳转前要关总中断、复位外设、把中断向量表重定位(设置 VTOR 或重映射),还要考虑看门狗在搬运过程中的喂狗策略与升级超时判断。面试时把这套状态机讲清楚,比只说「用 Ymodem 传」加分得多。

ARM 汇编与 RTOS 任务切换:指令类问题要能给用途而不是只念名字。MOV 是寄存器之间的数据传送,可以带移位;MRS/MSR 用于在通用寄存器与特殊寄存器之间搬数据(如从 PRIMASK、CONTROL、PSP 读出,或写回控制位),是切换栈指针与开关中断的常用手段;位测试指令(TST、以及 Thumb-2 的 BFC/BFI、位带操作)用于判断与修改单个位;CBZ/CBNZ 是比较为零则跳转/非零则跳转,编译器和手写汇编里常用于简化分支。FreeRTOS 的任务切换机制要能串起来:SysTick 或任务主动让出触发 PendSV,PendSV 里保存当前任务的 R4–R11 到其栈、更新任务控制块、切换到下一个任务的栈、恢复寄存器后异常返回;任务用 PSP、内核用 MSP,临界区用 BASEPRI 或 PRIMASK 屏蔽中断来保证原子性。能解释「为什么用 PendSV 而不是直接在 SysTick 里切」就更能体现理解。

操作系统、文件系统与无线协议:操作系统机制可以从「启动—调度—同步—中断」四个词展开:启动阶段建立内存与栈、初始化时钟与异常向量,运行阶段按优先级抢占式调度、用信号量/互斥量/队列同步,中断负责响应外设并把重活推给任务。中断向量表就是一张「异常号 → 处理函数地址」的表,前几项通常是初始栈指针、复位、NMI、HardFault,之后是各外设中断;向量表可以通过 VTOR 重定位,这是 bootloader 跳转和动态注册中断的前提。单片机上常见的文件系统是 FatFs、LittleFS、SPIFFS,重点考擦写均衡、掉电一致性与块设备适配层。无线部分要能说清蓝牙的经典与低功耗之分、主从角色与广播/连接状态、GATT 的 Service/Characteristic 结构;LwIP 属于轻量级 TCP/IP 协议栈,用回调或 raw API 而不是完整 socket 语义,内存靠 pbuf 池管理,这些点讲出来就是加分项。

这场的复盘建议:两位面试官的分工很清楚,一位问项目与系统设计,一位问指令与协议细节,说明岗位对「底层手感」要求高。面试官提出共享看项目代码是很强的好信号,但也是最容易翻车的一步:提前整理好能展示的仓库,删掉无关文件与密钥、补一页 README 讲清模块划分与关键实现、确认能编译或至少有清晰的分层说明,最好再准备三处亮点代码能当场讲。复习清单上按优先级排:DMA 与中断(收发、半传输、空闲中断、双缓冲)> bootloader 与升级可靠性 > RTOS 调度与同步 > 总线协议(IIC/SPI/UART)> ARM 汇编与启动流程。每一条都按「配置步骤—中断/回调—常见故障」三段式写成口述稿,面试时按这个顺序讲,听起来会有明显条理。