思源电气嵌入式软件一面:项目分层、任务间通信与掉电参数保护
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 先简单介绍一下你最近半年主要在做什么?
- 你简历里这个核心项目,整体架构怎么分层的?
- 任务间怎么传数据?为什么不用全局变量随便写?
- 看门狗你怎么用的?喂狗时机怎么选?
- Flash 里存参数,突然掉电你怎么保证数据还可用?
《参考解析》
-
架构分层题按「层 + 边界」讲,别按模块名报菜名:先给一条纵向切法——板级驱动(时钟、GPIO、定时器、UART/SPI/I2C)、中间件(帧解析、参数管理、状态机)、应用任务(采集、控制、上报、交互),再补两条横向约束:关键路径必须短,耗时操作一律下沉到后台任务,不能堵中断和主循环;配置与校准数据单独存放,和运行时变量分离,方便量产标定与维护。面试官追问的往往不是「分了几层」,而是「层之间的接口是什么、谁依赖谁」,所以提前想好一层依赖倒置的例子。
-
任务间通信别停在「用队列」三个字:要讲清数据形态和所有权——小数据与事件走队列或任务通知,周期性采样用共享缓冲,中断到任务只做投递、绝不在中断里做重活。共享缓冲必须约定生产者/消费者各自的生命周期责任,再加版本号或长度校验,防止读到半包。全局变量的问题不是「不优雅」,是竞态与可见性:多任务读写要进临界区或用原子操作,编译器还可能把轮询的读优化掉。
-
喂狗时机是这道题的分水岭:看门狗防的是死循环、跑飞和关键任务长期饿死,所以喂狗要放在「确认系统仍然健康」的路径上——由监控任务检查各关键模块的心跳或状态机推进后再统一喂,而不是随手在定时器中断里刷。超时时间要覆盖最坏处理耗时,又不能长到故障后很久才复位;复位后保留复位原因寄存器或标志位,用来区分软件卡死和电源异常,这一条经常是加分项。
-
Flash 掉电保护 = 备份 + 校验 + 原子切换:关键参数做双备份或 A/B 区,写入按页/扇区对齐,避免跨页写一半;数据带 CRC 或校验和,上电先校验再加载;提交时先写完数据与校验、再置有效标记,靠标记切换而不是靠覆盖旧区,这样任何时刻掉电都至少有一份可用的旧数据。校验失败就回退到上一份,并把失败计数记下来;写入过程尽量短,必要时先写临时区再提交。
-
这一面几乎每问都落回「异常与量产」:准备一版自己的自测清单——边界条件、掉电/复位、通信异常恢复、长时间运行的资源与计数回绕,把每一项对应的验证手段说清楚(日志、示波器、逻辑分析仪、现场复现)。面试官问「你怎么保证」,真正想听的是你有没有可复现的验证方法,而不是一句「测过了」。