海康威视 嵌入式软件 二面 面经

1. 在你做过的嵌入式项目中,请详细描述系统整体架构是如何设计的,各个模块之间是如何解耦和通信的?

答案:一般我会采用分层架构设计,把系统拆成三个层次:

  1. 驱动层(Driver/HAL)封装 SPI、I2C、UART、GPIO 等硬件操作对上提供统一接口,屏蔽具体芯片差异
  2. 服务层(Service)对驱动进行二次封装,例如:传感器服务通信协议解析负责数据处理和逻辑封装
  3. 应用层(Application)实现具体业务逻辑不直接操作硬件

解耦方式:

  • 使用**消息队列(Queue)**传递数据
  • 使用回调函数处理事件
  • 模块之间只通过接口通信,不直接访问内部数据

核心原则:

  • “高内聚、低耦合”
  • 尽量避免全局变量共享

2. 在嵌入式系统中,如果出现优先级反转问题,会对系统造成什么影响,通常有哪些解决方案?

答案:优先级反转是指:

  • 高优先级任务等待低优先级任务释放资源
  • 中间被中优先级任务抢占,导致高优先级任务长时间无法执行

影响:

  • 实时性严重下降
  • 关键任务无法按时执行
  • 在极端情况下可能导致系统失效

解决方案:

  1. 优先级继承(FreeRTOS mutex)低优先级任务临时继承高优先级释放资源后恢复
  2. 优先级天花板协议资源绑定固定优先级
  3. 设计优化减少共享资源缩短临界区

3. 在使用 FreeRTOS 时,如果系统响应变慢或者实时性下降,你通常会从哪些方面去分析和优化?

答案:

分析思路:

  1. CPU使用情况是否存在高占用任务是否有死循环
  2. 任务调度情况是否有任务长期不释放CPU是否优先级设置不合理
  3. 中断影响高频中断是否占用过多时间

优化方法:

  • 调整任务优先级
  • 使用 DMA 减少CPU负担
  • 减少临界区时间
  • 将耗时操作移出中断

工具:

  • vTaskGetRunTimeStats
  • 逻辑分析 + 日志

4. 在嵌入式项目中,你是否遇到过内存越界或者栈破坏的问题,你是如何定位和修复的?

答案:

常见表现:

  • 随机崩溃
  • HardFault
  • 数据异常

定位方法:

  1. 栈水位检测:uxTaskGetStackHighWaterMark
  2. 填充检测:初始化栈为固定值(如0xA5)
  3. 边界检查:检查数组访问
  4. 工具:查看 map 文件分析 PC 地址

修复方法:

  • 增加栈大小
  • 避免大数组放栈上
  • 禁止越界访问

5. 在 Cortex-M 系统中,中断嵌套对系统会产生哪些影响,在设计中断优

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式面试八股文全集 文章被收录于专栏

这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论

相关推荐

牛客62533758...:华为不卡双非,而是卡院校hhhh
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务