mcpField
D
domain-embedded

domain-embedded

github.com/actionbook开发1.6k2.9k 次安装9 周前更新
代码仓库

关于 domain-embedded

面向嵌入式开发的 Rust 领域技能,梳理 no_std、无堆、实时性和中断安全系统的约束与设计模式,帮助开发者选择内存、并发和硬件访问方案。

主要功能

  1. 01no_std 与无堆约束
  2. 02中断安全与临界区
  3. 03外设所有权模式
  4. 04PAC、HAL 与框架分层
  5. 05嵌入式 crate 参考

适用场景

  1. 01为无分配目标选择静态集合
  2. 02规划 ISR 共享状态
  3. 03避免中断处理中的阻塞
  4. 04整理 HAL 外设访问方式

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/actionbook/rust-skills --skill domain-embedded

安装后在 Claude Code 中输入/domain-embedded确认已加载。

详细介绍

项目上下文(自动注入)

目标配置: !cat .cargo/config.toml 2>/dev/null || echo "No .cargo/config.toml found"


嵌入式领域

第 3 层:领域约束

领域约束 → 设计影响

领域规则设计约束Rust 影响
无堆栈分配heapless,不使用 Box/Vec
无 std仅使用 Core#![no_std]
实时时序可预测不进行动态分配
资源受限最小化内存静态缓冲区
硬件安全安全访问外设HAL + 所有权
中断安全ISR 中不阻塞Atomic,临界区

关键约束

不进行动态分配
RULE: Cannot use heap (no allocator)
WHY: Deterministic memory, no OOM
RUST: heapless::Vec<T, N>, arrays
中断安全
RULE: Shared state must be interrupt-safe
WHY: ISR can preempt at any time
RUST: Mutex<RefCell<T>> + critical section
硬件所有权
RULE: Peripherals must have clear ownership
WHY: Prevent conflicting access
RUST: HAL takes ownership, singletons

向下追踪 ↓

从约束到设计(第 2 层):

"Need no_std compatible data structures"
    ↓ m02-resource: heapless collections
    ↓ Static sizing: heapless::Vec<T, N>

"Need interrupt-safe state"
    ↓ m03-mutability: Mutex<RefCell<Option<T>>>
    ↓ m07-concurrency: Critical sections

"Need peripheral ownership"
    ↓ m01-ownership: Singleton pattern
    ↓ m12-lifecycle: RAII for hardware

分层结构

层示例用途
PACstm32f4,esp32c3寄存器访问
HALstm32f4xx-hal硬件抽象
框架RTIC,Embassy并发
Traitsembedded-hal可移植驱动

框架对比

框架风格适用场景
RTIC基于优先级中断驱动的应用
Embassy异步复杂状态机
裸机手动简单应用

常用 Crate

用途Crate
运行时(ARM)cortex-m-rt
Panic 处理程序panic-halt,panic-probe
集合heapless
HAL traitsembedded-hal
日志记录defmt
Flash/调试probe-run

设计模式

模式用途实现
no_std 配置裸机#![no_std] + #![no_main]
入口点启动#[entry] 或 embassy
静态状态ISR 访问Mutex<RefCell<Option<T>>>
固定缓冲区无堆heapless::Vec<T, N>

代码模式:静态外设

#![no_std]
#![no_main]

use cortex_m::interrupt::{self, Mutex};
use core::cell::RefCell;

static LED: Mutex<RefCell<Option<Led>>> = Mutex::new(RefCell::new(None));

#[entry]
fn main() -> ! {
    let dp = pac::Peripherals::take().unwrap();
    let led = Led::new(dp.GPIOA);

    interrupt::free(|cs| {
        LED.borrow(cs).replace(Some(led));
    });

    loop {
        interrupt::free(|cs| {
            if let Some(led) = LED.borrow(cs).borrow_mut().as_mut() {
                led.toggle();
            }
        });
    }
}

常见错误

错误违反的领域约束修复方法
使用 Vec堆分配heapless::Vec
无临界区与 ISR 发生竞争Mutex + interrupt::free
在 ISR 中阻塞错过中断延后到主循环处理
不安全的外设硬件冲突HAL 所有权

追踪到第 1 层

约束第 2 层模式第 1 层实现
无堆静态集合heapless::Vec<T, N>
ISR 安全临界区Mutex<RefCell>
硬件所有权单例take().unwrap()
no_std仅 Core#![no_std],#![no_main]

相关技能

场景参见
静态内存m02-resource
内部可变性m03-mutability
中断模式m07-concurrency
硬件相关的不安全代码unsafe-checker

评论

支持 Markdown