Expand description
A no_std heap allocator for RISC-V and Xtensa processors from
Espressif. Supports all currently available ESP32 devices.
NOTE: using this as your global allocator requires using Rust 1.68 or
greater, or the nightly release channel.
§Using this as your Global Allocator
use esp_alloc as _;
fn init_heap() {
const HEAP_SIZE: usize = 32 * 1024;
static mut HEAP: MaybeUninit<[u8; HEAP_SIZE]> = MaybeUninit::uninit();
unsafe {
esp_alloc::HEAP.add_region(esp_alloc::HeapRegion::new(
HEAP.as_mut_ptr() as *mut u8,
HEAP_SIZE,
esp_alloc::MemoryCapability::Internal.into(),
));
}
}Alternatively, you can use the heap_allocator! macro to configure the
global allocator with a given size:
esp_alloc::heap_allocator!(size: 32 * 1024);§Using this with the nightly allocator_api-feature
Sometimes you want to have more control over allocations.
For that, it’s convenient to use the nightly allocator_api-feature,
which allows you to specify an allocator for single allocations.
NOTE: To use this, you have to enable the crate’s nightly feature
flag.
Create and initialize an allocator to use in single allocations:
static PSRAM_ALLOCATOR: esp_alloc::EspHeap = esp_alloc::EspHeap::empty();
fn init_psram_heap() {
unsafe {
PSRAM_ALLOCATOR.add_region(esp_alloc::HeapRegion::new(
psram::psram_vaddr_start() as *mut u8,
psram::PSRAM_BYTES,
esp_alloc::MemoryCapability::External.into(),
));
}
}And then use it in an allocation:
let large_buffer: Vec<u8, _> = Vec::with_capacity_in(1048576, &PSRAM_ALLOCATOR);Alternatively, you can use the psram_allocator! macro to configure the
global allocator to use PSRAM:
let p = esp_hal::init(esp_hal::Config::default());
esp_alloc::psram_allocator!(p.PSRAM, esp_hal::psram);You can also use the ExternalMemory allocator to allocate PSRAM memory
with the global allocator:
let p = esp_hal::init(esp_hal::Config::default());
esp_alloc::psram_allocator!(p.PSRAM, esp_hal::psram);
let mut vec = Vec::<u32>::new_in(esp_alloc::ExternalMemory);§allocator_api feature on stable Rust
esp-alloc implements the allocator trait from allocator_api2, which
provides the nightly-only allocator_api features in stable Rust. The crate
contains implementations for Box and Vec.
To use the allocator_api2 features, you need to add the crate to your
Cargo.toml. Note that we do not enable the alloc feature by default, but
you will need it for the Box and Vec types.
allocator-api2 = { version = "0.3", default-features = false, features = ["alloc"] }With this, you can use the Box and Vec types from allocator_api2, with
esp-alloc allocators:
let p = esp_hal::init(esp_hal::Config::default());
esp_alloc::heap_allocator!(size: 64000);
esp_alloc::psram_allocator!(p.PSRAM, esp_hal::psram);
let mut vec: Vec<u32, _> = Vec::new_in(esp_alloc::InternalMemory);
vec.push(0xabcd1234);
assert_eq!(vec[0], 0xabcd1234);Note that if you use the nightly allocator_api feature, you can use the
Box and Vec types from alloc. allocator_api2 is still available as
an option, but types from allocator_api2 are not compatible with the
standard library types.
§Heap stats
You can also get stats about the heap usage at anytime with:
let stats: HeapStats = esp_alloc::HEAP.stats();
// HeapStats implements the Display and defmt::Format traits, so you can
// pretty-print the heap stats.
println!("{}", stats);Example output:
HEAP INFO
Size: 131068
Current usage: 46148
Max usage: 46148
Total freed: 0
Total allocated: 46148
Memory Layout:
Internal | ████████████░░░░░░░░░░░░░░░░░░░░░░░ | Used: 35% (Used 46148 of 131068, free: 84920)§Feature Flags
-
nightly— Enable nightly rustc-only features, likefeature(allocator_api). -
defmt— Implementdefmt::Formaton certain types. -
internal-heap-stats— Enable this feature if you want to keep stats about the internal heap usage such as:- Max memory usage since initialization of the heap
- Total allocated memory since initialization of the heap
- Total freed memory since initialization of the heap
⚠️ Note: Enabling this feature will require extra computation every time alloc/dealloc is called.
-
compat(enabled by default) — Provide C-compatibility functions (malloc, free, …)
§Chip selection
One of the following features must be enabled to select the target chip:
esp32c2esp32c3esp32c6esp32h2esp32esp32s2esp32s3
Macros§
- heap_
allocator - Initialize a global heap allocator providing a heap of the given size in bytes. This supports attributes.
- psram_
allocator - Initialize a global heap allocator backed by PSRAM
Structs§
- AnyMemory
- An allocator that uses all configured, available memory.
- EspHeap
- A memory allocator
- External
Memory - An allocator that uses external (PSRAM) memory only.
- Heap
Region - A memory region to be used as heap memory
- Heap
Stats - Stats for a heap allocator
- Internal
Memory - An allocator that uses internal memory only.
- Region
Stats - Stats for a heap region
Enums§
- Memory
Capability - Describes the properties of a memory region
Statics§
- HEAP
- The global allocator instance