一、开发环境准备
在Linux系统(如Ubuntu/Debian)上搭建Rust嵌入式开发环境,需要完成以下基础配置步骤:

- 安装Rust工具链:通过
rustup安装最新稳定版Rust(包含rustc编译器、Cargo包管理器),执行命令如下:
验证安装是否成功:curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source $HOME/.cargo/env # 激活环境变量rustc --version(显示版本号即表示安装成功)。 - 配置国内镜像加速(可选但强烈推荐):编辑
~/.cargo/config,添加清华镜像源以提升依赖包下载速度:[source.crates-io] replace-with = 'tuna' [source.tuna] registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index" - 安装嵌入式开发工具链:根据目标硬件选择合适的工具链(例如Cortex-M系列需要
thumbv6m-none-eabi、thumbv7m-none-eabi等),并通过cargo安装相关工具:rustup target add thumbv7em-none-eabihf # 示例:Cortex-M4F/F7 cargo install cargo-binutils # 提供cargo objcopy/objdump等命令 rustup component add llvm-tools-preview # 支持LLVM工具链 - 安装系统工具:用于编译、烧写和调试,例如
build-essential(编译工具)、openocd(调试接口)、qemu-system-arm(模拟运行):sudo apt update && sudo apt install build-essential openocd qemu-system-arm gdb-multiarch
二、创建嵌入式项目
使用社区提供的开源模板快速生成嵌入式项目(以Cortex-M为例),避免手动配置繁杂的目录结构:
cargo generate --git https://github.com/rust-embedded/cortex-m-quickstart
按照提示输入项目名称(例如hello-embedded),生成的项目目录结构如下:
hello-embedded/
├── .cargo/ # Cargo配置目录
├── src/ # 源代码目录
│ ├── main.rs # 主程序入口
│ └── lib.rs # 库文件(可选)
├── Cargo.toml # 项目配置文件
├── memory.x # 内存布局脚本(定义Flash/RAM地址)
└── build.rs # 构建脚本(可选,用于自定义编译流程)
三、配置项目参数
- 修改
.cargo/config.toml:配置交叉编译目标、运行器(如QEMU)和调试工具,示例如下:[target.thumbv7em-none-eabihf] runner = "qemu-system-arm -cpu cortex-m4 -nographic -semihosting -kernel" # 使用QEMU运行 rustflags = ["-C", "linker=arm-none-eabi-gcc", # 指定链接器 "-C", "link-arg=-Tmemory.x", # 指定链接脚本 ] - 调整
memory.x:根据目标芯片的实际Flash/RAM起始地址和大小进行修改(以STM32F103ZET6为例):MEMORY { FLASH : ORIGIN = 0x08000000, LENGTH = 512K # Flash起始地址和大小 RAM : ORIGIN = 0x20000000, LENGTH = 64K # RAM起始地址和大小 }
四、编写嵌入式程序
嵌入式程序通常需要采用#和#,代码示例如下:
#![no_std] // 不使用标准库
#![no_main] // 自定义入口点
use panic_halt as _; // panic时停止程序(简单处理)
use cortex_m_rt::entry; // Cortex-M运行时入口宏
use cortex_m_semihosting::hprintln; // 半主机模式打印(通过调试器)
#[entry] // 标记入口函数
fn main() -> ! {
hprintln!("Hello, Embedded Rust World!".as_bytes()).unwrap(); // 打印消息
loop {} // 无限循环(嵌入式程序通常不退出)
}
五、构建与运行
- 构建项目:使用
cargo build编译,添加--release参数可优化代码体积与运行性能:
编译生成的二进制文件位于cargo build --releasetarget/thumbv7em-none-eabihf/release/目录下(例如hello-embedded)。 - 模拟运行:通过QEMU模拟执行(需提前安装QEMU):
若配置正确,终端将显示`Hello, Embedded Rust World!'。qemu-system-arm -cpu cortex-m4 -nographic -semihosting -kernel target/thumbv7em-none-eabihf/release/hello-embedded - 烧写到硬件:使用
cargo objcopy将二进制文件转换为适合目标芯片的格式(如HEX或BIN),再通过openocd进行烧写:
在另一个终端使用cargo objcopy --release -- -O ihex target/thumbv7em-none-eabihf/release/hello-embedded.hex # 转换为HEX格式 openocd -f interface/stlink.cfg -f target/stm32f1x.cfg # 启动OpenOCDtelnet或gdb烧写HEX文件(具体命令请参考对应芯片的文档)。
六、调试方法
- 使用GDB调试:通过
gdb-multiarch连接目标设备或模拟器,加载符号并进行调试:gdb-multiarch target/thumbv7em-none-eabihf/release/hello-embedded (gdb) target remote :3333 # 连接OpenOCD(端口需匹配) (gdb) load # 加载程序 (gdb) continue # 运行程序 - VSCode集成调试:安装
cortex-debug插件,在.vscode/launch.json中配置调试参数,即可通过点击调试按钮一键启动GDB和OpenOCD。
七、进阶技巧
- 交叉编译到其他平台:若需要编译到ARM Linux或其他架构,添加对应的目标平台(如
aarch64-unknown-linux-gnu),并在~/.cargo/config.toml中配置相应的链接器(例如aarch64-linux-gnu-gcc)。 - 使用HAL库:针对具体芯片(如STM32、RP2040),使用对应的HAL库(例如
stm32f1xx-hal、rp2040-hal)可以大幅简化外设操作(如GPIO、UART)。 - 条件编译:通过
#[cfg(target_arch = "arm")]等属性,针对不同硬件平台编写差异化的代码逻辑。
