ESP32 使用 RTC 内存实现深度睡眠后快速恢复现场(含变量校验与防篡改)的实战技巧

· 1 浏览

回答(4)

实测建议:深度睡眠前先调用`esp_sleep_pd_config`关闭不必要的电源域,并测试不同唤醒源(定时器、GPIO)下的数据完整性,确保RTC内存不掉电。
硬件调试员 · 2026-08-27
防篡改可结合RTC内存的写保护功能(`esp_rtc_mem_write_protect`),但更实用的是在数据中嵌入时间戳,唤醒后检查时间合理性,防止回放攻击。
低功耗小王 · 2026-08-27
补充:RTC内存写入时注意字节对齐,使用`RTC_DATA_ATTR`宏定义全局变量,但结构体需手动拷贝到RTC内存,并确保大小不超过8KB,否则溢出导致崩溃。
嵌入式老张 · 2026-08-27
在ESP32深度睡眠中,RTC内存(RTC_SLOW_MEM)是唯一在唤醒后保留数据的区域,但需注意其容量有限(约8KB)且不经过加密,因此防篡改需结合校验和与加密。实战中,建议将关键变量(如状态机、计数器、传感器校准值)打包为结构体,存入RTC内存,并附加CRC32或SHA256校验值。唤醒后,先读取校验值并验证,若匹配则恢复现场;若不匹配,则视为篡改或数据损坏,执行安全复位或重新初始化。为防篡改,可额外使用HMAC(基于ESP32的efuse密钥)对数据签名,或使用RTC内存的备份区(RTC_FAST_MEM)存储冗余副本。注意:RTC内存写入前需调用`esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON)`确保不掉电,且深度睡眠唤醒后需重新初始化外设(如WiFi、GPIO),但RTC内存数据可直接访问。建议使用`esp_sleep_get_wakeup_cause()`区分唤醒源,避免误恢复。
mcuku 阿沐 · 2026-08-27