用途
Embedded Rust 技能面向裸机微控制器开发,指导代理完成嵌入式 Rust 开发流程,覆盖:使用 probe-rs / cargo-embed 进行烧录与调试、使用 defmt 进行结构化日志、使用 RTIC 并发框架、cortex-m-rt 启动流程、no_std 配置以及 panic 处理器选择。
触发场景
当出现以下问题时适用:如何把 Rust 固件烧录到 MCU;如何调试嵌入式 Rust 程序;如何在嵌入式 Rust 中使用 defmt 日志;如何使用 RTIC 进行中断驱动并发;#![no_std] #![no_main] 在嵌入式 Rust 中意味着什么;如何在 no_std 嵌入式 Rust 中处理 panic。
工作流程
- 项目设置
提供 Cargo.toml 示例,依赖包括 cortex-m(features: critical-section-single-core)、cortex-m-rt、defmt、defmt-rtt、panic-probe(features: print-defmt);注释中给出 Embassy(异步嵌入式)作为 RTIC 替代方案。release profile 建议 opt-level = "s"、lto = true、codegen-units = 1、debug = true。.cargo/config.toml 中设置 target = "thumbv7em-none-eabihf"(Cortex-M4F/M7),runner 使用 probe-rs run --chip STM32F411CEUx 实现构建后自动运行,rustflags 包含 -C link-arg=-Tlink.x(cortex-m-rt 链接脚本)。
- 最小裸机程序
给出 src/main.rs 示例:使用 #![no_std] 与 #![no_main],引入 cortex_m_rt::entry、defmt::info,以及 defmt_rtt as _ 和 panic_probe as _。main 函数标记 #[entry],返回 !,打印启动日志,通过 PAC 或 HAL 获取外设,在循环中打印运行日志并使用 cortex_m::asm::delay 做粗略延时。
常见 MCU 的目标三元组:Cortex-M0/M0+ 为 thumbv6m-none-eabi;Cortex-M3 为 thumbv7m-none-eabi;Cortex-M4(无 FPU)为 thumbv7em-none-eabi;Cortex-M4F/M7 为 thumbv7em-none-eabihf;Cortex-M33 为 thumbv8m.main-none-eabihf;RISC-V RV32IMAC 为 riscv32imac-unknown-none-elf。通过 rustup target add thumbv7em-none-eabihf 添加目标。
- probe-rs — 烧录与调试
安装命令使用官方安装脚本。可执行 probe-rs run --chip 烧录固件、probe-rs debug 进入交互式调试会话、probe-rs list 列出连接的调试探针、probe-rs chip list | grep STM32 查询支持的芯片。配合 cargo 时,可在 .cargo/config.toml 中配置 runner 后使用 cargo run --release(构建、烧录并流式输出 defmt 日志)或 cargo build --release(仅构建)。
- defmt — 高效日志
defmt(de-formatter)把日志字符串编码为整数,只传输最少字节,在主机端解码。支持 info、warn、error、debug、trace 以及 Format 派生;可对自定义类型使用 #[derive(Format)] 并配合 {:?} 输出;支持 defmt::assert_eq! 与 defmt::assert!。后端可选:defmt-rtt(最快,需连接调试探针)与 defmt-semihosting(较慢,无需 RTT 支持)。
- RTIC — 实时中断驱动并发
RTIC 2 需要在 Cargo.toml 中引入 rtic(features 含 thumbv7-backend)。示例使用 #[rtic::app] 属性,定义 #[shared] 与 #[local] 结构、#[init] 初始化函数、#[task] 异步周期任务(通过共享资源锁访问计数器,并用 rtic_monotonics::systick::Systick 延时),以及通过 binds = EXTI0 绑定中断并设置优先级的按钮 ISR。
- Panic 处理器
不同处理器行为与适用场景:panic-halt 为无限循环,用于生产环境、无调试探针;panic-probe 输出 defmt 消息并停机,用于配合 probe-rs 的开发;panic-semihosting 通过 GDB semihosting 输出,用于 GDB 开发;panic-reset 执行硬复位,用于看门狗式恢复。需恰好选择一种 panic 处理器。
相关技能
可使用 skills/embedded/openocd-jtag 作为基于 OpenOCD 的调试替代方案;使用 skills/rust/rust-no-std 了解 #![no_std] 模式与约束;使用 skills/embedded/linker-scripts 配置内存布局;使用 skills/rust/rust-cross 设置交叉编译工具链。