#[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 thestatic
across resets. See the section below for details.zeroed
: Initialize the memory of thestatic
to 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(rtc_fast)]
static mut SOME_INITED_DATA: [u8; 2] = [0xaa, 0xbb];
#[ram(rtc_fast, persistent)]
static mut SOME_PERSISTENT_DATA: [u8; 2] = [0; 2];
#[ram(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.