海康威视 嵌入式软件 二面 面经
1. 在你做过的嵌入式项目中,请详细描述系统整体架构是如何设计的,各个模块之间是如何解耦和通信的?
答案:一般我会采用分层架构设计,把系统拆成三个层次:
- 驱动层(Driver/HAL)封装 SPI、I2C、UART、GPIO 等硬件操作对上提供统一接口,屏蔽具体芯片差异
- 服务层(Service)对驱动进行二次封装,例如:传感器服务通信协议解析负责数据处理和逻辑封装
- 应用层(Application)实现具体业务逻辑不直接操作硬件
解耦方式:
- 使用**消息队列(Queue)**传递数据
- 使用回调函数处理事件
- 模块之间只通过接口通信,不直接访问内部数据
核心原则:
- “高内聚、低耦合”
- 尽量避免全局变量共享
2. 在嵌入式系统中,如果出现优先级反转问题,会对系统造成什么影响,通常有哪些解决方案?
答案:优先级反转是指:
- 高优先级任务等待低优先级任务释放资源
- 中间被中优先级任务抢占,导致高优先级任务长时间无法执行
影响:
- 实时性严重下降
- 关键任务无法按时执行
- 在极端情况下可能导致系统失效
解决方案:
- 优先级继承(FreeRTOS mutex)低优先级任务临时继承高优先级释放资源后恢复
- 优先级天花板协议资源绑定固定优先级
- 设计优化减少共享资源缩短临界区
3. 在使用 FreeRTOS 时,如果系统响应变慢或者实时性下降,你通常会从哪些方面去分析和优化?
答案:
分析思路:
- CPU使用情况是否存在高占用任务是否有死循环
- 任务调度情况是否有任务长期不释放CPU是否优先级设置不合理
- 中断影响高频中断是否占用过多时间
优化方法:
- 调整任务优先级
- 使用 DMA 减少CPU负担
- 减少临界区时间
- 将耗时操作移出中断
工具:
vTaskGetRunTimeStats- 逻辑分析 + 日志
4. 在嵌入式项目中,你是否遇到过内存越界或者栈破坏的问题,你是如何定位和修复的?
答案:
常见表现:
- 随机崩溃
- HardFault
- 数据异常
定位方法:
- 栈水位检测:uxTaskGetStackHighWaterMark
- 填充检测:初始化栈为固定值(如0xA5)
- 边界检查:检查数组访问
- 工具:查看 map 文件分析 PC 地址
修复方法:
- 增加栈大小
- 避免大数组放栈上
- 禁止越界访问
5. 在 Cortex-M 系统中,中断嵌套对系统会产生哪些影响,在设计中断优
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式面试八股文全集 文章被收录于专栏
这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

