name: domain-embedded
description: “用于开发嵌入式/no_std Rust。关键词:嵌入式,no_std,微控制器,MCU,ARM,RISC-V,裸机,固件,HAL,PAC,RTIC,embassy,中断,DMA,外设,GPIO,SPI,I2C,UART,embedded-hal,cortex-m,esp32,stm32,nrf,嵌入式,单片机,固件,裸机”
globs: [“/Cargo.toml", "/.cargo/config.toml”]
user-invocable: false
项目上下文(自动注入)
目标配置:
!cat .cargo/config.toml 2>/dev/null || echo "未找到 .cargo/config.toml 文件"
嵌入式领域
第3层:领域约束
领域约束 → 设计影响
| 领域规则 |
设计约束 |
Rust 含义 |
| 无堆内存 |
栈分配 |
heapless,无 Box/Vec |
| 无标准库 |
仅核心库 |
#![no_std] |
| 实时性 |
可预测的时序 |
无动态分配 |
| 资源受限 |
最小内存 |
静态缓冲区 |
| 硬件安全 |
安全的外设访问 |
HAL + 所有权 |
| 中断安全 |
ISR 中无阻塞 |
原子操作,临界区 |
关键约束
无动态分配
规则:不能使用堆内存(无分配器)
原因:确定性内存,无内存不足(OOM)
RUST:heapless::Vec<T, N>,数组
中断安全
规则:共享状态必须是中断安全的
原因:ISR 可能在任何时候抢占
RUST:Mutex<RefCell<T>> + 临界区
硬件所有权
规则:外设必须有明确的所有权
原因:防止冲突访问
RUST:HAL 获取所有权,单例模式
向下追溯 ↓
从约束到设计(第2层):
“需要兼容 no_std 的数据结构”
↓ m02-资源:heapless 集合
↓ 静态大小:heapless::Vec<T, N>
“需要中断安全的状态”
↓ m03-可变性:Mutex<RefCell<Option<T>>>
↓ m07-并发:临界区
“需要外设所有权”
↓ m01-所有权:单例模式
↓ m12-生命周期:硬件的 RAII
层级栈
| 层级 |
示例 |
目的 |
| PAC |
stm32f4, esp32c3 |
寄存器访问 |
| HAL |
stm32f4xx-hal |
硬件抽象 |
| 框架 |
RTIC, Embassy |
并发 |
| 特质 |
embedded-hal |
可移植驱动 |
框架对比
| 框架 |
风格 |
最适合 |
| RTIC |
基于优先级 |
中断驱动应用 |
| Embassy |
异步 |
复杂状态机 |
| 裸机 |
手动 |
简单应用 |
关键 Crate
| 目的 |
Crate |
| 运行时(ARM) |
cortex-m-rt |
| Panic 处理 |
panic-halt, panic-probe |
| 集合 |
heapless |
| HAL 特质 |
embedded-hal |
| 日志 |
defmt |
| 闪存/调试 |
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<T>> |
| 硬件所有权 |
单例模式 |
take().unwrap() |
| no_std |
仅核心库 |
#![no_std], #![no_main] |
相关技能
| 当需要时 |
参见 |
| 静态内存 |
m02-资源 |
| 内部可变性 |
m03-可变性 |
| 中断模式 |
m07-并发 |
| 用于硬件的 Unsafe |
unsafe-checker |