#allocator #bare-metal #nightly #no-std

nightly no-std palloc

portable linked-list allocator for baremetal systems

4 releases

0.1.3 Nov 11, 2021
0.1.2 Nov 11, 2021
0.1.1 Nov 11, 2021
0.1.0 Nov 11, 2021

#1745 in Embedded development

Custom license

26KB
480 lines

Palloc

docs.rs crates.io

Portable linked-list allocator for embedded / baremetal systems.

Using the crate

Include this in the [dependencies] section of Cargo.toml

palloc = "0.1.0"

This crate uses unstable features of Rust, so it requires the nightly update channel. Update the toolchain for your project folder with:

rustup override set nightly

Crate features

  • spin (default): provides a GlobalAllocator implementation using a spin lock.
  • allocator_api (default): enables the Allocator trait and implements it on all global allocators.

Example

#![no_std]

use core::ptr::NonNull;
use palloc::{GlobalPalloc, SpinPalloc};

// the allocator is initialized using a const empty function, but it is
// not ready yet, we must initialize it first in main.
#[global_allocator]
static mut ALLOCATOR: SpinPalloc = SpinPalloc::empty();

fn main() {
    // First of all we must define the bounds of our heap. Check
    // Palloc or GlobalPalloc documentation for informations.

    // Heap starting address
    let heap_start = 0x8000 as *mut u8;
    // Heap size
    let heap_size = 0xF000;

    // accessing statics is an unsafe operation
    // so it must be sorrounded by an unsafe block
    unsafe { ALLOCATOR.init(NonNull::new(heap_start).unwrap(), heap_size) };

    // we can now use the heap!
    // ...
}

Documentation

Everything you need to know is already written in the rustdocs. Click on the badge under the readme's title or click here to read the full documentation.

Dependencies

~150KB