我试图了解 RTC_NOINIT_ATTR 与 RTC_DATA_ATTR(慢速内存与快速内存)之间的区别,但无法看到明确的定义和何时使用哪个示例 - 即使在原始的 espressif 网站上也没有:https://docs.espressif.com/项目/esp-idf/en/stable/esp32/api-guides/memory-types.html
有人可以用具体例子来澄清吗?
就我而言,我需要在进入深度睡眠之前将一个结构存储到 RTC 内存中,并且在唤醒后应该可以使用相同的结构值(无论它是基于计时器、外部事件还是 WDT)。我应该使用 RTC_NOINIT_ATTR 或 RTC_DATA_ATTR 哪一个?为什么?
我认为该页面上的文档有点误导/不完整。它需要与有关 深度睡眠存根 的页面一起阅读,即便如此,这似乎与定义这些前缀的 SDK 源文件
espattr.h
的内容不一致。
让我们看看针对 RTC 内存的可用前缀,以及来源和文档的内容:
前缀 | 说 |
文档说 |
---|---|---|
RTC_DATA_ATTR | 慢 | 快或慢取决于菜单配置选项 和 。默认为慢。 |
RTC_FAST_ATTR | 快 | 快 |
RTC_IRAM_ATTR | 快 | 快速(用于唤醒存根函数,而不是变量) |
RTC_NOINIT_ATTR | 慢 | 慢 |
RTC_RODATA_ATTR | 没说,只是“RTC” | 与 RTC_DATA_ATTR 相同 |
RTC_SLOW_ATTR | 慢 | 慢 |
所有都将在正常的深度睡眠/唤醒周期中保持其先前的值。与 SLOW 或 DATA 相比,NOINIT 的额外之处在于它不会在冷启动时初始化。这是否意味着它可以在看门狗重新启动或崩溃(甚至固件升级后重新启动)期间保持其值,我不确定 - 如果这是您真正需要的,您可以进行这些实验。
我个人认为,当看门狗重置或崩溃发生时,最好重置所有内容,因为从头开始似乎更安全。否则,您将需要某种检查来确保数据是否有效,因为即使在初始通电时也缺乏初始化意味着您很可能会读取垃圾。
如果您确实想确保数据在所有可能的情况下都保留,我建议您应该将其保存到闪存或外部电池支持的 SRAM(例如 DS1307 和 DS3232 等一些 RTC 中),然后从冷启动。
具体规则如下: