RTC_NOINIT_ATTR 与 RTC_DATA_ATTR(慢速内存与快速内存)

问题描述 投票:0回答:1

我试图了解 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 哪一个?为什么?

esp32 arduino-esp32 sleep-mode
1个回答
0
投票

我认为该页面上的文档有点误导/不完整。它需要与有关 深度睡眠存根 的页面一起阅读,即便如此,这似乎与定义这些前缀的 SDK 源文件

espattr.h
的内容不一致。

让我们看看针对 RTC 内存的可用前缀,以及来源和文档的内容:

前缀
espattr.h
文档说
RTC_DATA_ATTR 快或慢取决于菜单配置选项
CONFIG_ESP32_RTCDATA_IN_FAST_MEM
CONFIG_FREERTOS_UNICORE
。默认为慢。
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 中),然后从冷启动。

具体规则如下:

  • A 深度睡眠唤醒存根使用RTC快速内存(但可以访问RTC慢速内存中的变量)

  • ULP只能访问RTC慢速内存 - 它的代码和数据必须在那里。

  • RTC 快速内存只能由“PRO”核心 (#0) 访问,因此在双核 ESP32 上,任何在“APP”核心 (#1) 上运行的 FreeRTOS 任务都无法使用它。这意味着,如果您使用主代码在 APP 核心上运行的 Arduino 框架,您实际上只能使用 Slow(Wake Stubs 除外),而 RTC_DATA_ATTR 对此效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.