alloc
Para utilizar alloc, debes implementar un asignador global (de heap).
#![no_main] #![no_std] extern crate alloc; extern crate panic_halt as _; use alloc::string::ToString; use alloc::vec::Vec; use buddy_system_allocator::LockedHeap; #[global_allocator] static HEAP_ALLOCATOR: LockedHeap<32> = LockedHeap::<32>::new(); static mut HEAP: [u8; 65536] = [0; 65536]; pub fn entry() { // Safe because `HEAP` is only used here and `entry` is only called once. unsafe { // Give the allocator some memory to allocate. HEAP_ALLOCATOR.lock().init(HEAP.as_mut_ptr() as usize, HEAP.len()); } // Now we can do things that require heap allocation. let mut v = Vec::new(); v.push("A string".to_string()); }
buddy_system_allocatores un crate de terceros que implementa un buddy system allocator (una técnica de asignación de memoria) básico. Hay otros crates disponibles, pero también puedes escribir el tuyo propio o conectarte a tu asignador.- El parámetro const de
LockedHeapes el orden máximo del asignador. Es decir, en este caso, puede asignar regiones de hasta 2**32 bytes. - Si algún crate del árbol de dependencias depende de
alloc, debes tener exactamente un asignador global definido en el binario. Esto se suele hacer en el crate binario de nivel superior. extern crate panic_halt as _es necesario para asegurar que el cratepanic_haltesté vinculado y así podamos obtener su controlador de panic.- Este ejemplo se compilará pero no se ejecutará, ya que no cuenta con un punto de entrada.