昂瑞微二面(10.10)
- 轮次
- 二面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍。
- 发表的论文是做什么的,创新点是什么?
- 操作系统学过吗,运行机制是什么?
- 中断向量表了解吗?前几个是什么?
- 项目中的 DMA 怎么配置的?
- 串口加 DMA 怎么配置的?
- DMA 怎么中断?
- DMA 接收大小是多少?
- 设计的通信协议是什么?
- 帧尾没收到怎么办?
- bootloader 怎么设计的?
- 升级中掉电怎么办?
- DMA 最后一包剩的数据接收到后怎么中断通知其他任务?
- 汇编了解吗?
- MOV 指令
- MRS、MSR 指令
- 位测试指令
- CBZ、CBNZ 指令
- FreeRTOS 任务切换机制
- 了解单片机上的文件系统吗?
- 了解其他开源系统吗,比如 RT-Thread?
- 用过蓝牙、WiFi 吗?
- 了解蓝牙主从角色吗?你知道的讲一下。
- 了解轻量级 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 汇编与启动流程。每一条都按「配置步骤—中断/回调—常见故障」三段式写成口述稿,面试时按这个顺序讲,听起来会有明显条理。