Crates.io | emballoc |
lib.rs | emballoc |
version | 0.3.0 |
source | src |
created_at | 2022-08-20 23:31:12.314891 |
updated_at | 2024-09-17 17:53:15.699363 |
description | Simple but reliable memory allocator for embedded Rust and #![no_std] |
homepage | |
repository | https://github.com/jfrimmel/emballoc |
max_upload_size | |
id | 649542 |
size | 85,572 |
emballoc
— Embedded Memory AllocatorThis repository provides the emballoc
crate: a simple memory allocator developed for usage in small embedded systems.
It is one possible way to support dynamic memory on targets without the standard library, i.e. ones with #![no_std]
.
This is achieved by providing a type Allocator
which can be registered as the global allocator for the binary.
See the usage description below.
An allocator is a rather critical part of a software project: when using dynamic memory many operations implicitly can or will allocate, sometimes unexpectedly. Therefore a misbehaving allocator can "randomly" crash the program in very obscure ways. As such an allocator has to be well-tested and battle-proven (see more information here and a real world example). Furthermore it has to be simple: the simpler the algorithm is, the more likely is a correct implementation.
Refer to the crate-documentation for details on the algorithm and usage hints.
Copy the following snippet to your Cargo.toml
to pull the crate in as one of your dependencies.
[dependencies.emballoc]
version = "*" # replace with current version from crates.io
After that the usage is very simple: just copy the following code to the binary crate of the project.
Substitute the 4096
with the desired heap size in bytes.
#[global_allocator]
static ALLOCATOR: emballoc::Allocator<4096> = emballoc::Allocator::new();
extern crate alloc;
Now the crate can use the std
collections such as Vec<T>
, BTreeMap<K, V>
, etc. together with important types like Box<T>
and Rc<T>
.
Note, that things in the std
-prelude (e.g. Vec<T>
, Box<T>
, ...) have to be imported explicitly.
This crate started as part of an embedded project, but was extracted to make it usable in other projects and for other users. This sections answers the question:
Why should you consider using this crate in your project?
miri
spin
-crate (without any transitive dependencies)I'm glad, if that convinced you, but if you have any questions simply open an issue.
A note to users on systems with advanced memory features like MMUs and MPUs:
This crate does not use any platform-specific features (e.g. an MMU or specific instructions), except for the requirement for a atomic compare-and-swap-instruction (CAS), which is widely available. Therefore this crate works out-of-the-box on most architectures.
Some platforms however don't provide such an instruction (e.g. thumbv6m-none-eabi
or the RISC-V OpenTitan) or totally lack atomic instructions (e.g. AVR) due to only a single-core nature.
On those platforms, where the CAS instruction is not available, one can use the workaround, that spin
use: you can enable the portable_atomic
-feature in your Cargo.toml
, like this:
[dependencies.emballoc]
version = "*" # replace with current version from crates.io
features = ["portable_atomic"]
This enables the use of the portable_atomic
instead of the core
-atomics.
This is safe on any platform.
To actually enable atomics support on platforms without hardware support, the --cfg portable_atomic_unsafe_assume_single_core
-option needs to be explicitly enabled when compiling.
For more details see the documentation of spin
.
This crate has a stability guarantee about the compiler version supported.
The so-called minimum supported Rust version is currently set to 1.57 and won't be raised without a proper increase in the semantic version number scheme.
This MSRV is specified in Cargo.toml
and is tested in CI.
Licensed under either of
at your option.