第2章 高频技术面试问题

嵌入式系统、RTOS、驱动开发、通信协议(I2C/SPI/UART等)是智能硬件系统工程师面试的核心考点。本章梳理3个典型面试问题,覆盖协议细节、RTOS任务管理、驱动开发思路。建议先通过下方速查表回顾协议对比,再结合回答框架练习。

嵌入式通信协议速查表

协议 信号线 通信方式 最大速率 典型场景 优缺点
I2C 2线 (SCL/SDA) 半双工,主从,多设备 3.4 Mbps (高速) 传感器、EEPROM 省引脚,支持多主;速率较低
SPI 4线 (SCK/MISO/MOSI/CS) 全双工,主从,多设备需片选 数十 Mbps ADC、Flash、显示屏 高速、全双工;引脚较多
UART 2线 (TX/RX) 全双工,点对点 几 Mbps 调试串口、蓝牙模块 简单、无需时钟;速率有限
CAN 2线 (CAN_H/CAN_L) 半双工,多主,差分 1 Mbps 汽车电子、工业控制 抗干扰,远距离;协议复杂
嵌入式面试回答框架(5步穿透法) 1. 确认问题 明确场景与要求 2. 拆解原理 核心机制与标准 3. 结合项目 STAR实例佐证 4. 细节边界 异常处理与陷阱 5. 延伸拓展 对比与优化

使用提示:回答任何技术问题时,先判断面试官意图(考察原理 vs 项目经验),按框架逐层展开,避免直接背诵细节。

面试问答卡片

面试问题 1

请解释I2C通信协议的工作原理,包括起始条件、停止条件、数据字节传输、应答机制。

  • 考察点:对经典同步协议细节的掌握程度,能否区分主从、时钟同步、应答与仲裁。
  • 回答框架:概述→起始条件→数据字节(高位在前,SCL低电平时SDA变化)→应答位(第9个时钟)→停止条件→可提多主仲裁。
  • 示例回答:I2C是两线半双工同步协议。SCL高电平时SDA由高变低为起始,之后每8位数据后接收方拉低SDA应答。传输结束后SCL高电平时SDA由低变高为停止。例如我在某传感器项目中配置100kHz标准模式,成功读取温湿度数据。
  • 可能追问:如何计算I2C上拉电阻值?为什么需要应答?时钟拉伸如何工作?
  • 避坑提醒:避免只背诵时序图,要说出实际项目中遇到的速度选择、干扰处理、死锁恢复等经验。

面试问题 2

在FreeRTOS中,任务之间的同步与通信有哪些方式?请举例说明。

  • 考察点:对实时操作系统核心机制的理解,能否区分队列、信号量、事件组、任务通知,并说出适用场景。
  • 回答框架:先分类(数据通信→队列 vs 同步→信号量)→各自机理→选型依据→举例任务间传递传感器数据。
  • 示例回答:常用方式有队列(传递数据)、二值信号量(任务同步)、计数信号量(资源管理)、事件组(多事件等待)。例如在智能手表项目中,用队列将读取的加速度计数据从采集任务发送到处理任务,设置超时防止阻塞死锁。
  • 可能追问:队列深度如何设定?二值信号量与互斥量区别?任务通知相比队列有何优势?
  • 避坑提醒:不要只说“用队列”,要解释为什么选队列而不是全局变量(避免竞态),并说明中断中如何使用队列(FromISR后缀)。

面试问题 3

请描述如何为新的硬件外设编写Linux内核驱动,举一个简单的GPIO控制例子。

  • 考察点:驱动开发流程、字符设备框架、设备树、GPIO子系统,以及对内核空间/用户空间的理解。
  • 回答框架:分析硬件→注册字符设备(file_operations)→实现open/read/write/ioctl→设备树绑定→编译测试。
  • 示例回答:以GPIO LED驱动为例:在设备树中定义gpio-led节点,驱动中通过gpio_request和gpio_set_value控制电平。注册字符设备后,用户程序通过write向/sys/class/leds下虚拟文件写入控制命令。我曾在ARM平台调试该驱动,需注意GPIO号与CPU pin mapping。
  • 可能追问:设备树如何描述中断?如何实现poll/select支持?怎样做并发保护(自旋锁/mutex)?
  • 避坑提醒:不要直接背诵教科书步骤,要结合自身项目体现对驱动分层、内存映射、内核API选用的思考。避免在回答中忽略设备树。

备考建议:在面试前找一块STM32开发板或树莓派,动手实现I2C读取传感器、创建FreeRTOS任务通信、编写简单字符驱动,能显著提升回答的真实性与自信度。