海辰储能嵌入式软件面试:RTOS 锁与 Bootloader
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 如果 a 拿了锁,b 在等这把锁,这时 c 也来拿这把锁会发生什么?你会怎么设计?
- 持锁时发生中断,会发生什么?
- 项目二是几个人负责的?你主要负责哪部分?
- 项目中设计的算法具体说一下
- Bootloader 升级过程中,如果 flash 太小没法做双分区,你会怎么设计?
- 项目三中你负责了什么?
- 说一下 YOLO 的实现机制,是怎么训练的?
- 在采集传感器数据发送云端时是通过串口吗?怎么设计可以提高实时性和效率?
- 有做一些滤波消抖吗?
- 反问:要不要出差海外,随后要求用英语做一下自我介绍、谈谈对 AI 的看法
《参考解析》
a 持锁、b 等锁、c 又来拿锁
如果用的是 RTOS 的互斥量(mutex)而不是二值信号量,等待队列通常按任务优先级排队,而不是先来先得。所以 c 的优先级比 b 高时,c 会插到 b 前面先拿到锁;如果 a 的优先级又低于 c,就会出现优先级反转——高优先级的 c 被低优先级的 a 间接阻塞。标准解法是给互斥量开优先级继承(FreeRTOS 的 xSemaphoreCreateMutex 默认带优先级继承,xSemaphoreCreateBinary 不带),让 a 临时提升到等待者的最高优先级尽快释放锁;更激进的做法是优先级天花板,进临界区就把优先级提到天花板值。
设计上还要注意三点:一是约定统一的加锁顺序,避免多把锁的循环等待;二是所有 take 都要带超时(xSemaphoreTake(mutex, pdMS_TO_TICKS(100))),拿不到就让出而不是永久挂起;三是尽量缩小临界区,把耗时操作(打印、flash 写、网络收发)挪到锁外。
持锁时发生中断
要分两种情况。中断服务程序里只是处理自己的事,没有去碰这把锁,那没有问题,但要注意临界区里的全局变量如果被 ISR 修改,需要 taskENTER_CRITICAL 或者把变量做成原子访问。真正危险的是 ISR 里也去 take 同一把锁:中断上下文不能阻塞,xSemaphoreTake 在 ISR 里是禁止的(要用 FromISR 版本,而且 ISR 里拿不到锁不能等),一旦自旋或等待就是死锁。正确姿势是把中断里的活尽量做少(置标志、存数据到环形缓冲),用 xSemaphoreGiveFromISR 通知任务,真正的处理放到任务里做。反过来说,持锁期间如果中断被屏蔽(某些实现在临界区里关闭中断),实时性会变差,所以临界区必须尽量短。
flash 太小做不了双分区怎么升级
先明确双分区(A/B)的本质是用空间换「升级失败可回滚」。空间不够时有几条路:一是把升级逻辑从 bootloader 移出去,bootloader 只保留最小的搬运和校验能力,由 app 负责下载新固件到外部存储;二是加一颗外部 flash 或 SD 卡,把新固件先落到外部再搬运;三是压缩固件,边收边解,减少暂存体积;四是原地升级加一块小的 scratch 扇区,分块把旧固件挪走、写新固件,代价是升级期间断电风险高,必须配合断电保护。
断电保护的做法是标志位加校验:固件带 CRC 和签名,升级前先擦一个专用的状态页写「升级中」,搬运完成后再写「升级成功」,bootloader 启动时只认「校验通过且状态为成功」的镜像,否则回滚到上一份可用固件或进恢复模式。另外还要防止喂狗中断升级、保证升级过程中掉电后能重试。
YOLO 的实现机制和训练
以 YOLOv5 这类 anchor-based 版本为例:输入图片先 letterbox 缩放并 padding 到网络尺寸,backbone(CSPDarknet)提特征,neck 用 FPN 加 PAN 做多尺度特征融合,head 在三个尺度上输出每个 anchor 的 (tx, ty, tw, th, obj, cls...),解码时按 stride 还原成框,再经过置信度阈值和 NMS 得到最终结果。训练时损失由三部分组成:框回归用 CIoU 之类的 IoU 损失、置信度用二元交叉熵、分类也是交叉熵,正样本按 anchor 匹配策略分配;常用技巧有 mosaic、mixup 数据增强,余弦学习率,EMA 权重,预训练权重迁移。部署到边缘设备一般做 int8 量化,精度掉 1 到 3 个百分点是可以接受的。
串口上传怎么提高实时性和效率
从下往上排:采集侧用 DMA 加环形缓冲加空闲中断接收,避免 CPU 轮询和丢包;协议上用二进制帧而不是文本,带帧头、长度、CRC,支持批量打包上报而不是一帧一个点;波特率提高后注意时钟误差和线缆质量,必要时加校验和重传;发送侧用双缓冲或队列交给 DMA,避免阻塞采集任务;任务优先级上让采集和通信分开,别在中断里做重活;如果走云端,用 MQTT 这类长连接替代轮询,并做本地缓存加断点补传,防止网络抖动丢数据。
滤波消抖
常见做法:中值滤波去脉冲干扰、滑动平均或一阶低通(y = α·x + (1-α)·y_prev)平滑噪声、卡尔曼滤波处理有模型的过程量(姿态、位置),开关量用施密特触发器思路设高低阈值加去抖计数。选型看信号特性:传感器原始值适合先中值再一次低通,控制量要考虑相位滞后,采样率远高于信号带宽时才适合重滤波。