小鹏汽车- 嵌入式软件开发一面 面经
1. 先做个自我介绍,说说你的技术背景和项目经验
参考答案:
面试官您好,我是XXX,目前是XX大学计算机专业的研究生/本科生。我从大二开始接触嵌入式开发,到现在有两年多的学习和实践经验。
技术方面,我熟悉C/C++编程,有扎实的数据结构和算法基础。掌握STM32、ESP32等主流MCU的开发,熟悉FreeRTOS等实时操作系统。了解常见的通信协议如UART、I2C、SPI、CAN等。有多线程开发经验,熟悉互斥锁、信号量、消息队列等同步机制。
项目经验方面,我做过基于STM32的智能车载终端项目,实现了GPS定位、4G通信、CAN总线数据采集等功能。还参与过基于FreeRTOS的工业控制系统开发,负责传感器数据采集和处理模块。另外做过ESP32的物联网网关项目,实现了多协议转换和云端数据上传。
我对嵌入式系统开发很感兴趣,特别是车载系统和工业控制方向,希望能在这个领域深入发展。
2. 详细介绍一下你的项目,这个项目有什么实际应用场景?解决了什么问题?
参考答案:
我做的智能车载终端项目是一个集成了定位、通信、数据采集的嵌入式系统,主要用于车队管理和车辆监控。实际应用场景包括:物流车辆的实时定位和轨迹追踪;车辆状态监控,包括油耗、速度、发动机参数等;驾驶行为分析,检测急加速、急刹车等危险驾驶;远程故障诊断和OTA升级。
这个项目解决的核心问题是多任务实时处理和数据可靠传输。车载环境复杂,需要同时处理GPS定位、CAN总线数据采集、4G通信、本地存储等多个任务,而且对实时性要求高。我采用了FreeRTOS实时操作系统,将不同功能划分为独立任务,通过优先级调度保证关键任务的实时性。
项目的技术亮点包括:使用CAN总线过滤器和DMA,减少CPU占用,提高数据采集效率;实现了环形缓冲区管理GPS和CAN数据,防止数据丢失;采用双缓冲机制处理4G通信,发送数据时不阻塞数据采集;实现了掉电保护和数据恢复机制,确保关键数据不丢失;支持远程参数配置和固件升级,方便维护。
经过实际测试,系统可以稳定运行,GPS定位精度在5米以内,CAN数据采集频率达到100Hz,4G数据上传延迟小于1秒。系统在高温、低温、振动等恶劣环境下都能正常工作。这个项目让我深入理解了嵌入式系统设计、实时操作系统、通信协议等技术。
3. 在项目开发过程中,你遇到的最棘手的技术问题是什么?如何解决的?
参考答案:
最棘手的问题是系统运行一段时间后会出现任务卡死,整个系统失去响应。这个问题很难复现,有时运行几小时才出现,有时几天才出现。
我的排查过程是这样的。首先我怀疑是硬件问题,检查了电源、晶振、复位电路,都没有问题。然后我怀疑是看门狗没有正确喂狗,但检查代码发现喂狗逻辑是正确的。
我在关键位置添加了调试日志,通过串口输出任务运行状态。发现卡死时,某个任务一直在等待信号量,而发送信号量的任务也在等待另一个信号量,形成了死锁。深入分析后发现,问题出在中断和任务的交互上。
具体情况是这样的:CAN接收中断中会发送信号量通知处理任务,处理任务会访问共享的数据缓冲区。为了保护缓冲区,我用了互斥锁。但在某些情况下,任务持有互斥锁时,中断到来尝试发送信号量,而信号量队列满了,中断就会一直等待,导致系统卡死。
解决方案是重新设计中断和任务的交互机制。我改用了无锁的环形缓冲区,中断只负责把数据写入缓冲区,不涉及信号量和锁。任务定期轮询缓冲区处理数据。这样中断处理函数非常短,不会阻塞。同时我还优化了任务优先级,确保关键任务能及时响应。
修改后进行了长时间的稳定性测试,连续运行一个月没有出现卡死问题。这个问题让我深刻理解了中断和任务的交互、死锁的预防、实时系统的设计原则。
4. 你的项目中哪些功能用到了多任务?开发过程中遇到了什么问题?
参考答案:
我的项目基于FreeRTOS,采用了多任务架构,主要有以下几个任务:
GPS任务负责从GPS模块读取定位数据,解析NMEA协议,更新位置信息。优先级设置为中等,1秒更新一次。
CAN任务负责从CAN总线读取车辆数据,包括速度、转速、油耗等,解析CAN协议,存储到数据缓冲区。优先级设置为高,因为CAN数据实时性要求高。
通信任务负责通过4G模块上传数据到服务器,处理下行指令。优先级设置为低,因为网络通信可以容忍一定延迟。
存储任务负责将数据写入Flash,实现掉电保护。优先级设置为低,后台运行。
监控任务负责检测系统状态,喂看门狗,处理异常情况。优先级设置为最高,确保系统可靠运行。
开发过程中遇到的主要问题是任务间通信和资源竞争。多个任务需要访问共享的数据缓冲区,我用互斥锁保护。但一开始没有注意临界区的大小,导致高优先级任务被低优先级任务阻塞,出现了优先级反转问题。我通过使用FreeRTOS的优先级继承互斥锁解决了这个问题。
还遇到过栈溢出问题。一开始我给每个任务分配的栈空间比较小,运行时出现了栈溢出导致系统崩溃。我用FreeRTOS的栈溢出检测功能找到了问题任务,增加了栈空间。同时优化了代码,减少了栈上的局部变量,避免深度递归。
另一个问题是任务调度的CPU占用。一开始我设置的任务优先级不合理,导致某些任务占用CPU时间过多,其他任务得不到执行。我通过调整优先级和使用任务延时,让各个任务能够合理分配CPU时间。
还有内存管理的问题。FreeRTOS提供了多种内存分配方案,我选择了heap_4,支持内存释放和合并。但要注意避免内存碎片,尽量在初始化时分配好内存,运行时不频繁分配释放。
通过解决这些问题,我对RTOS的任务调度、同步机制、内存管理有了更深入的理解。
5. 你有跨团队合作的经历吗?合作中遇到过什么问题?如何解决的?
参考答案:
我在学校的项目中有过跨团队合作的经历。我们的项目是一个智能设备系统,分为硬件团队、嵌入式软件团队、后端团队、前端团队。我在嵌入式软件团队,负责设备端的固件开发。
合作中遇到的主要问题是沟通和接口对接。一开始我们定义的数据格式和后端团队理解的不一致,导致数据传输出错。我们开会讨论后,重新明确了接口定义,用文档详细记录了数据格式、字段含义、取值范围等,避免了理解偏差。
还有一个问题是进度不同步。硬件团队的PCB还没做好,我们软件团队就等着调试。为了不耽误进度,我们用开发板先做软件开发和测试,等硬件就绪后再移植。这样提高了并行度,缩短了整体周期。
另一个问题是问题归属不清。有时候系统出问题,不知道是硬件问题还是软件问题,大家互相推诿。我们建立了问题跟踪机制,每个问题都有明确的负责人和截止时间。遇到跨团队的问题,相关人员一起讨论,用排除法定位问题,比如用示波器测量信号、用日志分析软件逻辑等。
改善措施包括:定期开会同步进度和问题,及时沟通避免信息不对称;用文档和注释明确接口定义,减少理解偏差;建立问题跟踪系统,明确责任和时间节点;互相学习对方的知识,软件了解硬件,硬件了解软件,方便协作。
通过这次合作,我学到了团队协作的重要性,也提升了沟通和协调能力。
6. 说说你项目中某个技术的具体实现过程,优化后达到了什么效果?
参考答案:
我重点说一下CAN总线数据采集的实现和优化。项目需求是以100Hz的频率采集CAN总线上的车辆数据,包括速度、转速、油耗等十几个参数,不能丢失数据,同时CPU占用率要低。
最初的实现是用中断方式接收CAN数据。每收到一帧CAN消息就触发中断,在中断中解析数据并存储。但这种方式有几个问题:中断频率太高,CPU占用率达到30%以上;中断中处理逻辑复杂,影响系统实时性;数据存储涉及互斥锁,可能导致优先级反转。
优化方案是使用CAN过滤器和DMA。首先配置CAN过滤器,只接收需要的CAN ID,过滤掉无关消息,减少中断次数。然后使用DMA将CAN
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。