第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 | 汽车电子、工业控制 | 抗干扰,远距离;协议复杂 |
使用提示:回答任何技术问题时,先判断面试官意图(考察原理 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任务通信、编写简单字符驱动,能显著提升回答的真实性与自信度。