3个版本
新 0.0.2 | 2024年8月21日 |
---|---|
0.0.1 | 2024年5月29日 |
0.0.0 | 2024年5月28日 |
#280 在 嵌入式开发
每月 75 次下载
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个单元:Cell1
、Cell2
和Cell3
。每个单元都有自己的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