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

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

为什么不能直接改

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

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

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

架构

复制代码
新算法线:
  读传感器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双备份------工业级固件的设计模式

相关推荐
不悔哥2 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
优信电子2 天前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
youcans_2 天前
【嵌入式软件AI编程】16. Claude Code 与 VS Code 的协同开发
stm32·mcu·嵌入式·ai编程·claude code
阿钱真强道2 天前
06 嵌入式操作系统 | vim 与软件管理:apt / 源码编译
ubuntu·vim·嵌入式·apt·源码编译
G.E.M.小白2 天前
【IMX6ULL ARM内核启动与时钟系统超详解】PLL/PFD/分频/根时钟配置
嵌入式·arm·时钟·imx6ull
嵌入式阿蔡2 天前
嵌入式DevOps 2026:AI驱动工具链与CI/CD闭环
嵌入式
嵌入式阿蔡3 天前
嵌入式虚拟化2026:Hypervisor从数据中心走进MCU
嵌入式
hanchenxing3 天前
干掉卫语句:用策略模式重构嵌套地狱的实战指南策略模式
代码重构·可读性
嵌入式阿蔡3 天前
RISC-V工具链生态2026:从GCC命令到VS Code插件
嵌入式
金士顿3 天前
ASP.NET Core Native AOT + systemd 实战:把 Linux ARM64 程序变成可靠的设备服务
linux·嵌入式·asp.net core·arm64