#微控制器 #闪存 #内存

无标准库 emcell

为微控制器保留闪存内存区域,以安全地存储多个二进制和库二进制(单元)文件。单元可以调用其他单元中的函数。

3个版本

0.0.2 2024年8月21日
0.0.1 2024年5月29日
0.0.0 2024年5月28日

#280嵌入式开发

Download history 171/week @ 2024-05-23 73/week @ 2024-05-30 9/week @ 2024-06-06 2/week @ 2024-06-13 2/week @ 2024-07-04 73/week @ 2024-08-15

每月 75 次下载

MIT 许可证

19KB
330

emcell

emcell (EMbedded CELL) - 是一个库,它使得在单个微控制器上存储多个二进制文件变得非常简单。您只需创建一个具有 单元 定义的不同crate,并创建简单的 build.rs 文件,指定哪个 单元 是当前crate。

单元 是一个抽象词汇,用于表示具有特定闪存和RAM内存区域的二进制或库。您可以在单个微控制器上存储多个 单元,甚至为每个单元定义头文件以实现跨单元调用不同函数。

Emcell 还允许您定义一个特殊函数,其签名为 fn() -> !,该函数将执行向量表切换。例如,您可以在主代码中定义 run() -> ! 函数,并从引导单元中运行它。

用法

单元定义crate的lib.rs示例

#![no_std]

#[macro_use]
extern crate emcell_macro;

emcell_configuration! {
    device!{
        initial_stack_ptr: 0x2000_6000,

        ram_range_start: 0x2000_0000,
        ram_range_end: 0x2001_8000, // 96Kb RAM

        flash_range_start: 0x0800_0000,
        flash_range_end: 0x0810_0000, // 1Mb flash
    }

    #[cell(primary)]
    #[ram_region(0x6000, 0x6400)]
    #[flash_region(0x0, 0x4000)]
    pub struct Cell1 {
    }

    #[cell]
    #[ram_region(0x6400, 0xA000)]
    #[flash_region(0x0_4000, 0xF_1000)]
    pub struct Cell2 {
        #[switch_vectors]
        pub run: fn() -> !,
        pub a: u32,
        pub print_some_value: fn(u32),
    }

    #[cell]
    #[ram_region(0xA000, 0x1_0000)]
    #[flash_region(0xF_1000, 0x10_0000)]
    pub struct Cell3 {
        pub b: u32,
        pub run_some_code: fn(),
        pub access_static: fn() -> u32,
    }
}

在此示例中,您定义了3个单元:Cell1Cell2Cell3。每个单元都有自己的crate,并且可以使用自动创建的宏创建的安全包装器调用其他crate中的函数。

单元1 crate的main.rs示例

#![no_std]
#![no_main]

#![feature(const_refs_to_static)]
use emcell_macro::{define_primary_header, extern_header_forward};
use cells_defs::{Cell1, Cell2};
use cortex_m::asm::delay;

extern crate panic_halt;

define_primary_header!{
    Cell1 {
    }
}

extern_header_forward!(Cell2Wrapper: Cell2);

#[cortex_m_rt::entry]
unsafe fn main() -> ! {
    gpio_cfgr();
    led_on();

    if let Some(cell2) = Cell2Wrapper::new() {
        cell2.switch_vectors_and_run() // execute run() -> ! for cell2
    }
    else {
        loop {
            delay(1_000_000);
        }
    }
}

build.rs

fn main() {
    emcell::build_rs::<cells_defs::Cell1>();
}

Cell2Wrapper::new() 将自动创建并执行额外的检查,以确保单元2的头文件没有被修改(通过比较哈希值)并且与当前crate兼容。

夜间工具链

由于 const_refs_to_static 功能,emcell目前需要夜间版本。您可以使用 rustup override set nightly 为当前目录设置夜间版本。

依赖项

~135KB