关于 domain-embedded
面向嵌入式开发的 Rust 领域技能,梳理 no_std、无堆、实时性和中断安全系统的约束与设计模式,帮助开发者选择内存、并发和硬件访问方案。
主要功能
- 01no_std 与无堆约束
- 02中断安全与临界区
- 03外设所有权模式
- 04PAC、HAL 与框架分层
- 05嵌入式 crate 参考
适用场景
- 01为无分配目标选择静态集合
- 02规划 ISR 共享状态
- 03避免中断处理中的阻塞
- 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
分层结构
| 层 | 示例 | 用途 |
|---|---|---|
| PAC | stm32f4,esp32c3 | 寄存器访问 |
| HAL | stm32f4xx-hal | 硬件抽象 |
| 框架 | RTIC,Embassy | 并发 |
| Traits | embedded-hal | 可移植驱动 |
框架对比
| 框架 | 风格 | 适用场景 |
|---|---|---|
| RTIC | 基于优先级 | 中断驱动的应用 |
| Embassy | 异步 | 复杂状态机 |
| 裸机 | 手动 | 简单应用 |
常用 Crate
| 用途 | Crate |
|---|---|
| 运行时(ARM) | cortex-m-rt |
| Panic 处理程序 | panic-halt,panic-probe |
| 集合 | heapless |
| HAL traits | embedded-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