77 lines
1.8 KiB
Rust
77 lines
1.8 KiB
Rust
//! How to use the heap and a dynamic memory allocator
|
|
//!
|
|
//! To compile this example you'll need to build the alloc crate as part
|
|
//! of the Xargo sysroot. To do that change the Xargo.toml file to look like
|
|
//! this:
|
|
//!
|
|
//! ``` text
|
|
//! [dependencies.core]
|
|
//! stage = 0
|
|
//!
|
|
//! [dependencies.alloc] # NEW
|
|
//! stage = 0
|
|
//!
|
|
//! [dependencies.compiler_builtins]
|
|
//! stage = 1
|
|
//! ```
|
|
//!
|
|
//! This example depends on the alloc-cortex-m crate so you'll have to add it
|
|
//! to your Cargo.toml:
|
|
//!
|
|
//! ``` text
|
|
//! # or edit the Cargo.toml file manually
|
|
//! $ cargo add alloc-cortex-m
|
|
//! ```
|
|
//!
|
|
//! ---
|
|
|
|
#![feature(alloc)]
|
|
#![feature(used)]
|
|
#![feature(global_allocator)]
|
|
#![no_std]
|
|
#[allow(deprecated)]
|
|
|
|
// This is the allocator crate; you can use a different one
|
|
extern crate alloc_cortex_m;
|
|
#[macro_use]
|
|
extern crate alloc;
|
|
extern crate cortex_m;
|
|
extern crate cortex_m_rt;
|
|
extern crate cortex_m_semihosting;
|
|
|
|
use core::fmt::Write;
|
|
|
|
use cortex_m::asm;
|
|
use cortex_m_semihosting::hio;
|
|
use alloc_cortex_m::CortexMHeap;
|
|
|
|
#[global_allocator]
|
|
static ALLOCATOR: CortexMHeap = CortexMHeap::empty();
|
|
|
|
extern "C" {
|
|
static mut _sheap: u32;
|
|
static mut _eheap: u32;
|
|
}
|
|
|
|
fn main() {
|
|
// Initialize the allocator
|
|
let start = unsafe { &mut _sheap as *mut u32 as usize };
|
|
let end = unsafe { &mut _sheap as *mut u32 as usize };
|
|
unsafe { ALLOCATOR.init(start, end - start) }
|
|
|
|
// Growable array allocated on the heap
|
|
let xs = vec![0, 1, 2];
|
|
|
|
let mut stdout = hio::hstdout().unwrap();
|
|
writeln!(stdout, "{:?}", xs).unwrap();
|
|
}
|
|
|
|
// As we are not using interrupts, we just register a dummy catch all handler
|
|
#[link_section = ".vector_table.interrupts"]
|
|
#[used]
|
|
static INTERRUPTS: [extern "C" fn(); 240] = [default_handler; 240];
|
|
|
|
extern "C" fn default_handler() {
|
|
asm::bkpt();
|
|
}
|