10.28 得一微嵌入式一面:HardFault 定位与 DMA 缓冲设计
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 做一下自我介绍。
- 讲讲操作系统项目。
- 有没有遇到 HardFault?怎么定位、怎么解决?
- 第二个项目有没有遇到什么问题?怎么解决的?
- DMA 加缓冲区是怎么设计的?
- 多包在缓冲区里怎么定位、取某一个包?
- 丢包怎么排查、怎么解决?
- 平时看什么书?爱好是什么?
- 智力题:数手指游戏。
- 智力题:四棵树在立体空间中怎么让每棵树距离相等?
《参考解析》
HardFault 定位:先看故障现场——从栈里取压入的 R0-R3、R12、LR、PC、xPSR,PC 指向出错指令,LR 判断是主栈还是进程栈(MSP/PSP),再用 map 文件或 addr2line 定位到函数行号。常见原因:空指针/野指针、数组越界、栈溢出、非对齐访问、在中断里调用阻塞函数、函数指针跳飞。解决:加栈水位监测和 MPU 保护、打开 UsageFault/BusFault 分别捕获、在 HardFault handler 里打印现场并复位、用断言检查入参。
DMA + 缓冲区设计:常用「环形缓冲 + 半满/全满中断」或「双缓冲(ping-pong)」:DMA 按固定块写入,半满中断处理前半段、全满中断处理后半段,CPU 与 DMA 交替使用不同区域,避免竞争。要说明缓冲区大小怎么定(按最大帧长和吞吐算)、内存对齐要求、cache 一致性(DMA 前后做 invalidate/flush)、以及溢出时的丢弃策略。
多包定位:如果协议是定长,用「帧头 + 长度 + 校验」解析;变长则先找帧头,再读长度字段,校验通过才认为是一个完整包;环形缓冲里维护读指针和写指针,处理时只消费完整帧,半包留在缓冲里等下一次数据。要防止粘包和拆包。
丢包排查:先确认丢在链路哪一段(发送计数、接收计数、DMA 溢出标志、FIFO 溢出、中断丢失);再看缓冲是否太小、处理是否太慢、是否有中断被长时间关闭;用示波器/逻辑分析仪看时序,用计数器做对账;解决手段是加大缓冲、提高处理优先级、用 DMA 卸载、加流控。
智力题:四棵树等距,在平面上做不到,放到正四面体的四个顶点即可(立体空间)。数手指类题目先明确规则(是否循环、从哪根开始),再对周期取模。