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

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

为什么不能直接改

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

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

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

架构

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

相关推荐
Fu_Lin_7 小时前
Qt 嵌入式从零基础到精通总纲
开发语言·qt·嵌入式·qt嵌入式
潘潘的嵌入式日记13 小时前
一个宏在调试阶段挡住所有误操作
安全·嵌入式··调试·编译期·bring-up
在水一缸13 小时前
深度解析:OPEN NPO网络大模型架构与开发者实践指南
网络·人工智能·华为·架构·架构设计·open npo·网络大模型
doiito1 天前
【Agent Harness】Gliding Horse 高级认知优化:让 Agent 的“大脑”和“免疫系统”真正协同
ai·rust·架构设计·系统设计·ai agent
Rain的Java大神实战圈2 天前
分库分表会带来哪些问题如何解决
架构设计·场景设计题
Rain的Java大神实战圈3 天前
介绍一下分库分表
架构设计·场景设计题
doiito4 天前
【RUST AI】把 TTS 搬进浏览器:kokoroi-rs 的 WASM 实践
ai·rust·架构设计
Rain的Java大神实战圈4 天前
线上慢SQL的排查思路
经验分享·架构设计·场景设计题
K成长日志4 天前
BLE链路层空口包--LE Uncoded PHY
物联网·嵌入式·蓝牙·iot·ble·无线·通信