兆易创新嵌入式开发二面

1. 在你的项目里,如果一个任务既要保证实时性,又要避免占用过多 CPU,你会怎么设计?

答案:

我会优先采用事件驱动而不是纯轮询的方式。比如通过中断、消息队列、信号量或者任务通知来触发任务执行,而不是让任务一直空转检查状态。

如果任务对实时性要求很高,我会把它的优先级适当提高,同时保证任务内部逻辑尽量短,不做耗时操作。对于数据搬运类场景,还可以配合 DMA,减少 CPU 占用。核心思路是:用更少的轮询,换更高的响应效率

2. 如果项目中有多个任务同时访问同一个外设,你会如何保证系统稳定?

答案:

首先要判断这个外设是否适合多任务共享。如果必须共享,我一般会在驱动层或服务层做统一管理,而不是让多个任务直接操作外设。

常见做法有:

  • 用互斥锁保护访问过程
  • 用消息队列让一个专门任务统一管理外设
  • 对读写时序做状态机控制

这样可以避免资源竞争、时序混乱和数据覆盖问题。相比多个任务直接抢占外设,统一管理通常更稳定。

3. 在嵌入式系统中,为什么很多时候不建议把复杂业务逻辑直接写在驱动层?

答案:

因为驱动层的职责应该是屏蔽硬件细节并提供基础操作接口,如果把过多业务逻辑塞进去,会导致驱动层职责不清,耦合严重。

这样做的后果通常是:

  • 驱动难复用
  • 平台迁移困难
  • 测试和维护成本变高
  • 上下层边界混乱

更合理的方式是:驱动层只负责硬件访问,服务层负责数据处理和协议封装,应用层负责业务逻辑。

4. 如果系统偶发死机,但现场不好复现,你通常怎么定位?

答案:

这种问题一般不能只靠“猜”,我会优先做现场信息保留最小范围缩小

常用方法有:

  • 加日志,记录关键状态和异常前后的操作
  • 增加看门狗复位原因记录
  • 保存异常现场寄存器信息
  • 检查任务栈水位
  • 检查是否有越界、空指针、野指针访问
  • 回看最近改动的代码

如果怀疑是并发问题,会重点检查共享资源访问、临界区和中断交互。

如果怀疑是内存问题,会去看 map 文件、堆栈使用情况和缓冲区边界。

5. 在你看来,设计一个可靠的嵌入式系统,最重要的几个点是什么?

答案:

我觉得可靠性主要体现在以下几个方面:

  • 架构清晰,模块边界明确
  • 资源使用可控,尤其是内存、CPU、栈
  • 异常处理完善,比如超时、重试、默认恢复机制
  • 关键路径可监控,比如日志、状态记录、看门狗
  • 充分测试边界场景,比如断电、通信异常、高频中断、长时间运行

嵌入式系统很多时候不是功能做出来就够了,而是要考虑设备能不能长期稳定运行。

6. 如果通信协议需要兼容后续升级,你会如何设计报文格式?

答案:

我会优先考虑可扩展性和兼容性

常见做法是报

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

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

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

全部评论

相关推荐

03-31 14:46
已编辑
门头沟学院 Web前端
励志成为双港第一ja...:这其实很正常,离的太远了,他认为你不会来,就为了混个面试,而且成本很高,实习生都优先选本地高校。吃了地域的亏,所有很多时候地域可能比院校层次更重要。
点赞 评论 收藏
分享
zaakfung:26届不应该春招吗 为啥还实习
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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