MCU 冷启动 vs 热启动:重启机制深度解析
MCU 的两种重启姿态
在嵌入式系统中,MCU 的重启不是简单的"断电再来"。冷启动和热启动是两种完全不同的机制,它们对系统状态的影响、恢复速度、以及适用场景都有本质区别。搞混这两种重启,轻则系统行为异常,重则丢失关键数据。
冷启动(Cold Boot)是 MCU 从完全断电状态上电,所有寄存器、SRAM、外设状态都被复位到默认值。热启动(Warm Boot)则是 MCU 在保持供电的情况下触发复位,部分寄存器和 SRAM 内容可能被保留。
从设计意图看,冷启动是"从零开始",热启动是"带着记忆重启"。两者的核心差异在于:冷启动必须完整执行所有初始化流程,而热启动可以跳过部分初始化,快速恢复到工作状态。
硬件层面的差异
STM32 的复位源决定了启动类型。通过查看 RCC_CSR 寄存器的复位标志位,可以判断上次重启的原因:
// 实测于 STM32F103C8T6, STM32Cube HAL 1.17.0
void CheckResetSource(void) {
if (RCC_CSR & RCC_CSR_PINRSTF) {
// NRST 引脚复位 → 冷启动
printf("Reset by NRST pin\n");
}
if (RCC_CSR & RCC_CSR_PORRSTF) {
// 上电/掉电复位 → 冷启动
printf("Reset by POR/PDR\n");
}
if (RCC_CSR & RCC_CSR_SFTRSTF) {
// 软件复位 → 热启动
printf("Reset by software\n");
}
if (RCC_CSR & RCC_CSR_IWDGRSTF) {
// 独立看门狗复位 → 热启动
printf("Reset by IWDG\n");
}
if (RCC_CSR & RCC_CSR_WWDGRSTF) {
// 窗口看门狗复位 → 热启动
printf("Reset by WWDG\n");
}
// 清除复位标志
RCC_CSR |= RCC_CSR_RMVF;
}
关键点:NRST 引脚复位和上电复位一定是冷启动,而软件复位和看门狗复位通常是热启动。但这个"通常"有例外——如果看门狗复位时 VDD 掉电又恢复,实际效果等同于冷启动。
SRAM 保留机制
热启动最核心的价值在于 SRAM 数据保留。STM32F1 系列在热启动时,SRAM 内容会被保留(前提是 VDD 保持在有效范围内)。这意味着你可以在 SRAM 中保存关键状态,重启后恢复。
但这里有个坑:SRAM 保留不是无条件的。手册规定 VDD 必须保持在 1.8V 以上(STM32F103 的最低工作电压),否则 SRAM 内容会丢失。在实际产品中,电源跌落的时序很难精确控制,所以不能 100% 依赖 SRAM 保留。
// 实测于 STM32F103C8T6
// 在 SRAM 末尾预留 1KB 用于状态保存
#define SRAM_PERSIST_ADDR ((uint32_t)0x20003C00) // SRAM 末尾 1KB
#define SRAM_PERSIST_SIZE 1024
typedef struct {
uint32_t boot_count;
uint32_t last_error;
uint8_t config[64];
} SystemState;
SystemState* pState = (SystemState*)SRAM_PERSIST_ADDR;
void SaveState(void) {
pState->boot_count++;
// 注意:这里没有写入 Flash,因为 Flash 写入速度慢且有寿命限制
}
void RestoreState(void) {
if (pState->boot_count > 0) {
// 热启动,恢复状态
printf("Warm boot, count: %lu\n", pState->boot_count);
} else {
// 冷启动,初始化状态
printf("Cold boot, initializing\n");
memset(pState, 0, SRAM_PERSIST_SIZE);
pState->boot_count = 1;
}
}
实测记录:
理论预期:热启动后 SRAM 内容保留,boot_count 递增。
实际结果:
- 正常热启动(软件复位):SRAM 保留,boot_count 正确递增
- 快速断电恢复(< 10ms):SRAM 部分保留,boot_count 有时递增有时归零
- 慢速断电(> 100ms):SRAM 丢失,等同于冷启动
偏差分析:快速断电时 SRAM 保留不稳定,怀疑是电源跌落过程中 VDD 在临界值附近波动,导致部分 SRAM 单元数据丢失。
AUTOSAR 中的应用
在 AUTOSAR 架构中,冷启动和热启动的处理有明确规范。ECU 状态管理器(EcuM)负责管理启动流程:
- 冷启动:执行完整的 ECU 初始化,包括所有 BSW 模块的初始化
- 热启动:跳过部分初始化,直接恢复到上次运行状态
实际项目中,热启动通常用于看门狗复位后的快速恢复。比如一个正在处理 CAN 报文的 ECU,如果看门狗触发复位,热启动可以在几十毫秒内恢复通信,而冷启动可能需要几百毫秒。
但热启动有个风险:如果上次运行状态本身就有问题(比如内存泄漏、状态机卡死),热启动会带着这些问题重启,可能再次触发看门狗。所以 AUTOSAR 规定,连续热启动超过 N 次(通常 3 次)后,必须执行冷启动。
选型建议
| 场景 | 推荐启动类型 | 理由 |
|---|---|---|
| 首次上电 | 冷启动 | 无历史状态可恢复 |
| 看门狗复位 | 热启动 | 快速恢复通信 |
| 软件异常复位 | 热启动 | 保留调试信息 |
| 电源跌落后恢复 | 冷启动 | SRAM 可能已丢失 |
| 量产测试 | 冷启动 | 确保每次测试条件一致 |
遗留问题
- STM32L4 系列支持 SRAM 保留模式(SRAM2 在低功耗模式下可保持),但 STM32F1 不支持。不同系列的 SRAM 保留机制差异较大,后续需要对比验证。
- 热启动时外设状态如何恢复?手册说 GPIO 会复位到默认状态,但 DMA 和定时器的行为未明确说明,待实测确认。
关联笔记
关联笔记:STM32 ADC 采样时间计算:从手册到实测 中关于 ADC 初始化时序的讨论