嵌入式安全重构——新老两套同时跑

一句话: 要替换一个关键判稳算法,别直接改原逻辑。新算法用独立变量和老逻辑并行跑,验证新算法更可靠后,一行代码切过去。
适合谁读:要改核心控制逻辑但不敢动的嵌入式开发者。

为什么不能直接改

判稳逻辑是设备启动序列的关键节点------判稳不到位,输出不许开。直接改等于拿上线产品做实验。

安全的做法:新老两条线同时跑,新算法的输出先不参与控制只做记录。确认新更可靠后一行切。

就像换刹车系统------不把旧的拆了装新的,而是两套刹车并联,新的先不接管,测够了再切。

架构

复制代码
新算法线:
  读传感器A+B → 新判稳算法 → 独立状态变量 → 只记录,不控制

老算法线(现有逻辑):
  读传感器C+D → 老判稳算法 → 主状态变量 → 控制实际序列
c 复制代码
// 两条线用完全独立的状态变量
volatile uint8_t g_bStable_New_A;    // 新判稳结果
volatile uint8_t g_bStable_New_B;

volatile E_STATE eStable_Old_A;      // 老判稳结果
volatile E_STATE eStable_Old_B;

// 老逻辑继续控制
if (eStable_Old_A == STABLE && eStable_Old_B == STABLE) {
    Output_Enable();
}

// 新逻辑只记录,不控制
if (g_bStable_New_A && g_bStable_New_B) {
    g_u8NewReady = 1;                // 只写标志,不参与决策
}

验证

并行跑一段时间,记录两种判稳的差异:

c 复制代码
if (eStable_Old_A == STABLE && g_bStable_New_A == 0) {
    g_u16OldFasterCnt++;   // 老判稳了,新没判
}
if (eStable_Old_A != STABLE && g_bStable_New_A == 1) {
    g_u16NewFasterCnt++;   // 新判稳了,老没判
}

确认新逻辑始终比老的更早判稳且状态一致 → 一线切:

c 复制代码
// 切过去:只改一行
if (g_bStable_New_A && g_bStable_New_B) {
    Output_Enable();
}

总结

要点 说明
独立变量 新老用不同变量,不互相改
并行不控制 新逻辑只记录不决策
对比计数 记录差异,用数据说话
一线切 验证通过后只改一行

重构关键逻辑别直接改,先双线并行。多几行代码的成本,比失控小得多。


实测对比:直接替换: 温控序列失控风险高 | 双线并行验证: 0风险,一线切

有用的话点个收藏 ,下次调试直接用。有问题欢迎评论区交流,看到了都会回。

下一篇 :升级断电也不变砖------双镜像升级、五层架构、Flash双备份------工业级固件的设计模式

相关推荐
用户83514140494911 小时前
const的四种位置,含义完全不同
嵌入式·源码
Zevalin爱灰灰1 天前
Linux入门第二部分(ARM裸机篇) 第二章 Cortex-A7 MPCore架构与ARM汇编基础
linux·汇编·arm开发·嵌入式
Zwawa1 天前
串口命令如何从字符串长成协议:帧头、长度、校验和与状态机
c语言·单片机·嵌入式
小李不想当小白2 天前
BKP备份寄存器与RTC实时时钟(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
La Pulga2 天前
【FreeRTOS源码学习笔记】链表的实现
数据结构·笔记·stm32·mcu·链表·嵌入式·freertos
凉、介2 天前
深入理解 ARMv7-A | Generic Timer
笔记·学习·嵌入式·arm
La Pulga2 天前
【FreeRTOS源码学习笔记】任务创建
笔记·stm32·mcu·学习·嵌入式·freertos·实时操作系统
Liaiyang663 天前
空圈容错视角-HarmonyOS 7 架构体检:从被动容错到主动免疫的真伪验证与生态反推
操作系统·harmonyos·架构设计·ai-agent·端云协同·鸿蒙7·空圈容错
Zevalin爱灰灰3 天前
Linux入门第二部分(ARM裸机篇) 第一章 开发环境搭建与了解
linux·arm开发·嵌入式
菜鸟小芯3 天前
【Quectel Pi M2 实战】Day3 USB 摄像头图像采集:拍照、录像与踩坑记录(V4L2 + FFmpeg)
ffmpeg·嵌入式