京东嵌入式软件开发 一面面经
1. 请你介绍一个最有技术含量的嵌入式项目,重点讲讲系统架构、你的职责和遇到的难点
参考答案:
- 我做过一个基于STM32/嵌入式Linux的控制系统,整体分为传感器采集层、控制逻辑层、通信层和上位机交互层。
- 我的主要职责是驱动开发、通信协议设计,以及核心任务调度与性能优化。
- 在架构上,我把高实时任务和低优先级任务拆开,用中断加RTOS任务的方式保证关键路径响应。
- 项目难点主要在于多模块协同、通信稳定性和异常场景下的恢复机制。
- 我通过优化任务优先级、引入状态机设计、增加超时重试和日志定位,解决了大部分稳定性问题。
- 这个项目让我对驱动、任务调度、接口抽象和系统级问题定位都有更深入的理解。
2. 为什么想做嵌入式开发?你觉得自己适合这个方向吗?
参考答案:
- 我对底层系统比较感兴趣,喜欢把软件和硬件真正结合起来解决实际问题。
- 嵌入式开发不像纯业务开发,它更强调资源受限场景下的稳定性、实时性和工程能力,这一点很吸引我。
- 我平时比较愿意钻底层原理,比如中断、通信协议、内存布局、驱动流程这些内容。
- 我觉得自己适合这个方向,因为我对问题定位比较有耐心,也愿意花时间看手册、查波形、分析日志。
- 在项目里我更享受把一个模块从驱动、协议到应用完整打通的过程。
- 从长期来看,我也希望在嵌入式系统、驱动开发和系统优化这条线持续深耕。
3. SPI 和 I2C 有什么区别?各自适合什么场景?
参考答案:
- SPI是全双工通信,速度一般更高;I2C是半双工,总线结构更简单。
- SPI通常需要更多引脚,至少有时钟、输入、输出和片选;I2C一般只需要SCL和SDA两根线。
- I2C支持多主多从和设备地址寻址,适合挂载多个低速外设;SPI更适合高速、短距离、点对点通信。
- SPI没有固定的应答机制,协议简单,实时性更好;I2C有应答位,通信规范更标准。
- 传感器、EEPROM这类低速外设常用I2C;屏幕、Flash、高速ADC这类外设常用SPI。
- 如果项目更关注速率和时序可控性,我会优先考虑SPI;如果更关注布线和设备扩展性,我会选I2C。
4. 讲一下中断处理流程,上半部和下半部为什么要分开?
参考答案:
- 当外设产生中断后,CPU会暂停当前任务,跳转到中断服务程序执行。
- 中断处理的第一原则是尽快响应,因此中断里一般只做最必要的事情,比如读状态、清标志、缓存数据。
- 上半部强调“快”,主要完成紧急和必须立即完成的工作。
- 下半部用于处理耗时任务,比如数据解析、协议封装、事件通知,避免长时间占用中断。
- 这样分开的好处是能降低中断延迟,避免影响其他高优先级中断和系统实时性。
- 在Linux里常见的下半部机制有softirq、tasklet、workqueue;在RTOS里也常通过消息队列或任务唤醒来完成类似处理。
5. 如果串口接收数据容易丢包,你会从哪些方面排查和优化?
参考答案:
- 先看波特率配置、时钟源和双方串口参数是否一致,比如数据位、停止位、校验位。
- 检查硬件层面是否有干扰,比如线过长、接地不好、电平不匹配。
- 看接收中断是否处理不及时,如果中断里做了太多事情,可能来不及取走数据。
- 可以引入环形缓冲区或DMA接收,减少CPU频繁处理中断带来的压力。
- 在协议层增加帧头、长度、校验和重发机制,避免上层误解析和无感知丢包。
- 最后结合逻辑分析仪、串口日志和统计计数,定位是硬件问题、驱动问题还是协议设计问题。
6. 说说 DMA 的作用,什么场景下适合使用 DMA?
参考答案:
- DMA的作用是让外设和内存之间直接传输数据,减少CPU参与,提高效率。
- 它特别适合大批量、重复性的数据搬运
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式面试八股文全集 文章被收录于专栏
这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

查看15道真题和解析