第4章:嵌入式硬件接口面试题
对于BSP工程师而言,I2C、SPI、UART、GPIO、中断与DMA是每天都要打交道的底层接口。面试中,这部分内容重点考察你对协议时序的理解深度、驱动框架的设计能力以及软硬件联调的排错经验。
复习提示: 本章以“驱动实现五步法”和“DMA异常排查路径”为主线,配合3个高频问答卡片与1个实战项目模板,帮你构建可迁移的接口知识体系。
接口驱动实现核心框架
嵌入式总线协议速查表
| 特性 | I2C | SPI | UART |
|---|---|---|---|
| 线数 | 2 (SCL, SDA) | 3+N (SCK, MOSI, MISO, CS) | 2 (TX, RX) |
| 速率 | 100k~3.4M bps | 10M~50M+ bps | 115.2k~1M bps |
| 通信方式 | 半双工 | 全双工 | 全双工 |
| 多设备 | 是(地址寻址) | 是(片选) | 否(点对点) |
| 适用场景 | 传感器、EEPROM | 显示屏、ADC、Flash | 调试串口、GPS模块 |
📌 面试官问:你在实际项目里,是怎么选 I2C、SPI 还是 UART 的?
- 考察点:协议本质理解、工程折中思维、场景敏感度。
- 回答框架:速率匹配 → 硬件资源(引脚/FIFO)→ 开发效率(复用现有驱动)。
- 示例回答:“优先看速率和从机数量。I2C省引脚但速度慢,适合片外传感器配置。SPI快且全双工,适合音频或LCD数据通道。UART最简单,适合两设备间固定波特率通信,多数SOC自带FIFO,CPU开销低。
- 可能追问:① I2C的ACK/NACK驱动怎么处理?② SPI设备丢数据怎么排查?
- ⚠ 避坑提醒:不要只谈性能,忽略开发成本和SoC的IP已知Bug。
📌 面试官问:你在 BSP 驱动里写中断服务程序(ISR)时,会特别注意哪些问题?
- 考察点:实时系统思维、竞态条件处理、ISR设计规范。
- 回答框架:唤醒源确认 → 数据紧急拷贝 → 清中断标志 → 触发任务(信号量/队列)。
- 示例回答:“ISR里只做最少工作:读取数据推到环形队列,立即清中断,发信号量解锁等待任务。禁止在ISR内调用printf或malloc,避免使用延时函数,防止阻塞系统调度造成优先级反转。
- 可能追问:① 中断嵌套怎么处理?② 如何测量中断延迟?
- ⚠ 避坑提醒:切勿忘记对ISR与任务间共享数据加锁(关中断或使用spinlock)。
📌 面试官问:用 DMA 做 SPI 传输有什么坑?什么情况你会放弃 DMA 改回轮询?
- 考察点:Cache一致性理解、DMA描述符配置、性能边界把握。
- 回答框架:D-Cache一致性 → 描述符链表 → 中断回调 → 传输粒度判断。
- 示例回答:“必须处理Cache一致性,否则读到脏数据。开启DMA前invalidate源地址,传输完invalidate目的地址。若单次传输小于FIFO深度(如4字节),用轮询/中断比DMA快,因DMA配置开销更大。
- 可能追问:① Scatter-Gather模式原理?② 如何测量DMA传输吞吐量?
- ⚠ 避坑提醒:不要忽略MMU/MPU对DMA地址空间的限制,高速传输务必关D-Cache或手动维护一致性。
DMA 异常排查路径(面试高频追问)
🚀 项目案例模板:多传感器数据采集 BSP 驱动开发
| 项目名称 | 工业物联网网关 - 多传感器驱动子系统 |
| 业务背景 | 网关需采集温度(I2C SHT30)、加速度(SPI BMI160)等数据,上传至云端。要求低功耗与高稳定性。 |
| 规模指标 | 采样率 100Hz,I2C 总线挂载 3 个设备,SPI 时钟 10MHz,DMA 传输速率 2MB/s。 |
| 技术栈 | STM32H7 / RT-Thread / Sensor框架 / DMA + Cache管理 / 逻辑分析仪 |
| 核心难点 | ① I2C总线冲突与重试机制设计。② SPI DMA传输的Cache一致性维护。③ 传感器在不同电源状态下的恢复流程。 |
| 面试高频追问 | ① SHT30的I2C地址怎么确定?② BMI160的SPI是Mode0还是Mode3?如何配置?③ DMA传输卡死,排查步骤? |
| 可迁移话术 | “我会先看Datasheet定位Device Address和Register Map,再用逻辑分析仪抓波形确认时序。针对高速DMA,Cache一致性是必考题,我的标准做法是…”。 |
💡 复习建议: BSP面试中,接口部分80%的问题都能用“抓波形”和“看手册”解决。遇到不会的时序问题,主动提出用逻辑分析仪分析,是极具工程经验的表现。