#init #section #linker #memory #cortex-m #no-alloc

no-std linker-sections

Linker section memory initialization

1 unstable release

new 0.1.0 Feb 10, 2025

#500 in Embedded development

MIT/Apache

12KB
79 lines

This crate provides couple of macros for linker section memory initialization on cortex-m devices.

Example

Simple example defines a section .custom_data with start at 4-byte aligned __scustom_data and 4-byte aligned end at __ecustom_data. The initialization data goes at __sicustom_data.

MEMORY
{
    FLASH   : ORIGIN = 0x08000000, LENGTH = 32K
    RAM     : ORIGIN = 0x20000000, LENGTH = 16K
    DATA    : ORIGIN = 0x20004000, LENGTH = 16K
}

SECTIONS
{
    .custom_data : ALIGN(4)
    {
        . = ALIGN(4);
        __scustom_data = .;
        *(.custom_data .custom_data.*);

        . = ALIGN(4);
        __ecustom_data = .;
    } > DATA AT>FLASH

    __sicustom_data = LOADADDR(.custom_data);
} INSERT BEFORE .uninit;

In rust code it is needed to call macro init_sections with proper argument.

#![no_std]
#![no_main]

use linker_sections::init_sections;
use {defmt_rtt as _, panic_probe as _};

const INITIAL_VALUE: u32 = 0xDEAD_BEEF;

#[link_section = ".custom_data"]
static mut STATIC_VARIABLE: u32 = INITIAL_VALUE;

init_sections!(custom_data);

#[cortex_m_rt::entry]
fn main() -> ! {
    // print initialized variable value
    unsafe {
        defmt::info!("STATIC_VARIABLE = 0x{:08X}", STATIC_VARIABLE);
    }

    loop {}
}

Dependencies

~0.6–1MB
~22K SLoC