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

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

为什么不能直接改

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

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

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

架构

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

相关推荐
分支预测失败11 小时前
RISC-V 上下文切换实战:从 Trap 入口到 Linux 进程调度
后端·嵌入式
Freak嵌入式12 小时前
基于 MicroPython+DMA 链式触发的 Scatter-Gather 数据聚合实现
嵌入式
Freak嵌入式13 小时前
MicroPython ADC 采样拖慢主循环?试试 DMA + 乒乓缓冲,全程解放 CPU
嵌入式
Freak嵌入式14 小时前
从代码到项目:MicroPython+MCP4725 自定义类实现信号发生器功能的完整流程
嵌入式
与你40314 小时前
STM32F103_AB_OTA_从零复现教程
嵌入式
Freak嵌入式14 小时前
一文搞懂 MCP4725 波形发生器:MicroPython 代码实现、定时器驱动与调试流程全梳理
嵌入式
慧都小项15 小时前
汽车工具链重复测试太耗人?用 TestComplete 自动跑
功能测试·回归·汽车·嵌入式·软件工程·测试覆盖率
Discipline~Hai16 小时前
Linux网络编程02-TCP协议
linux·网络·tcp/ip·嵌入式·linux网络编程
Jason_zhao_MR17 小时前
电能质量监测为什么需要PTP精确时钟同步
linux·单片机·嵌入式硬件·嵌入式
Freak嵌入式18 小时前
全网最详细|树莓派 Pico ADC 软件控制全解析:从machine.ADC API 到定时温度采集实战(含 ISR 避坑指南)
嵌入式