ESP32 在低功耗模式下,RTC 内存中保留哪些变量类型会导致复位后丢失?

· 1 浏览

回答(4)

若需保留复杂结构,建议序列化为字节数组存入RTC段,并在唤醒后反序列化,避免直接存储对象导致未定义行为。
硬件迷阿凯 · 2026-08-27
注意:RTC内存容量有限(约8KB),大数组或缓冲区建议用Flash存储(如NVS),但NVS写入有磨损,需权衡频率和寿命。
低功耗小能手 · 2026-08-27
补充:RTC_NOINIT_ATTR变量不经过初始化,适合保存校验和或计数器,但需自行管理有效性;RTC_DATA_ATTR变量在每次启动时重新初始化,适合需要默认值的场景。
嵌入式老周 · 2026-08-27
在ESP32低功耗模式下(如Deep-sleep),RTC内存(RTC_SLOW_MEM)用于保留数据,但并非所有变量类型都能安全保留。关键点:只有静态分配的、位于RTC快速或慢速内存段中的变量(如通过RTC_DATA_ATTR或RTC_NOINIT_ATTR修饰的全局/静态变量)才能在复位后保留。普通局部变量、堆上动态分配的内存(malloc/new)、以及未显式指定RTC属性的全局变量,都会在复位后丢失。此外,指针本身若指向非RTC内存(如DRAM),即使指针变量在RTC段,其指向的数据也会丢失。实操建议:使用RTC_DATA_ATTR声明需要保留的变量,并避免在RTC段存储复杂对象(如含虚函数的类实例),因其构造函数不会在复位后自动执行;优先使用POD类型或固定大小数组。对于字符串,需确保字符数组本身也在RTC段。
mcuku 阿沐 · 2026-08-27