#[ram]Expand description
Sets which segment of RAM to use for a function or static and how it should be initialized.
Requires the ram feature.
§Options
rtc_fast: Use RTC fast RAM.rtc_slow: Use RTC slow RAM. Note: not available on all targets.persistent: Persist the contents of thestaticacross resets. See the section below for details.zeroed: Initialize the memory of thestaticto zero. The initializer expression will be discarded. Types used must implementbytemuck::Zeroable.
Using both rtc_fast and rtc_slow or persistent and zeroed together
is an error.
§persistent
Initialize the memory to zero after the initial boot. Thereafter,
initialization is skipped to allow communication across software_reset(),
deep sleep, watchdog timeouts, etc.
Types used must implement bytemuck::AnyBitPattern.
§Warnings
- A system-level or lesser reset occurring before the ram has been zeroed could skip initialization and start the application with the static filled with random bytes.
- There is no way to keep some kinds of resets from happening while updating a persistent static—not even a critical section.
If these are issues for your application, consider adding a checksum alongside the data.
§Examples
#[ram(unstable(rtc_fast))]
static mut SOME_INITED_DATA: [u8; 2] = [0xaa, 0xbb];
#[ram(unstable(rtc_fast, persistent))]
static mut SOME_PERSISTENT_DATA: [u8; 2] = [0; 2];
#[ram(unstable(rtc_fast, zeroed))]
static mut SOME_ZEROED_DATA: [u8; 8] = [0; 8];See the ram example in the esp-hal repository for a full usage example.