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

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

为什么不能直接改

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

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

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

架构

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

相关推荐
熊出没1 天前
AI Agent 生产级架构设计:工具调用与MCP、RAG、安全护栏与评估体系
人工智能·安全·架构设计·rag·ai agent
熊出没1 天前
高并发高可用系统设计:限流、熔断、降级与多级缓存实战指南
缓存·高并发·架构设计·高可用
风123456789~1 天前
【架构设计】习题1 数据库题目 2/2
架构设计·数据库习题
beluge1 天前
SPI通信
嵌入式
beluge1 天前
I2C通信
嵌入式
qq_456168282 天前
通信协议学习笔记汇总
嵌入式·开源协议
guslegend2 天前
工程地基、Provider 与 ReAct 循环:Agent 核心能力的设计、实现与验收
人工智能·agent·react·架构设计·spring ai
范中勤2 天前
技术文档:模型工厂 `llm_provider` / `llm_use` 分层设计
设计模式·langchain·架构设计·模型工厂·llm_provider
番茄灭世神2 天前
PN学堂GD32教程第12篇——SPI与Nor Flash
c语言·stm32·单片机·嵌入式·gd32·总线协议
潘潘的嵌入式日记3 天前
大彩串口屏型号怎么看?DC80480M070 命名拆解与选型
嵌入式·硬件·串口屏·选型·大彩·型号命名