2. 开发环境搭建:工具链、目标架构与调试器配置
说实话,嵌入式开发的环境搭建,往往是劝退新手的第一道坎。我见过太多人卡在「装了半天,最后编译出来的二进制跑不起来」这个环节。今天咱们就把这事捋清楚,一步到位。
2.1 安装 Rust 工具链
如果你还没装 Rust,打开终端,执行下面这行命令:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
装完之后,确认一下版本:
rustc --version
cargo --version
我个人习惯用 rustup 管理多版本工具链,因为后面调试不同架构的芯片时,切换起来特别方便。你想想看,一个命令就能在 stable、nightly 之间跳转,省心不少。
2.2 添加目标架构:thumbv7em-none-eabihf
咱们这次用的芯片是 Cortex-M4F 内核,支持硬件浮点。对应的目标架构就是 thumbv7em-none-eabihf。说白了,这个字符串告诉编译器:「我要编译成 ARM Thumb-2 指令集,带硬件浮点,没有操作系统。」
添加目标架构的命令:
rustup target add thumbv7em-none-eabihf
验证是否添加成功:
rustup target list --installed | grep thumbv7em
如果看到 thumbv7em-none-eabihf 出现在列表里,就说明搞定了。
eabihf 写成 eabi,结果编译出来的程序一跑浮点运算就崩。硬件浮点和软浮点,差的就是这个 hf。
2.3 安装调试器:OpenOCD 与 probe-rs
调试器是嵌入式开发的「眼睛」。没有它,你只能靠 LED 闪烁猜程序在干嘛。我推荐两种方案,你可以根据手头的硬件选一个。
| 调试器 | 适用场景 | 安装方式 |
|---|---|---|
| OpenOCD | ST-Link、J-Link 等传统调试器 | apt / brew / 源码编译 |
| probe-rs | CMSIS-DAP、ST-Link,纯 Rust 实现 | cargo install probe-rs-tools |
2.3.1 安装 OpenOCD
Ubuntu/Debian 用户:
sudo apt install openocd
macOS 用户:
brew install openocd
Windows 用户可以去官网下载预编译包,或者用 scoop 安装。我个人更推荐用 probe-rs,因为它是纯 Rust 写的,跟咱们的工具链更搭。
2.3.2 安装 probe-rs
一条命令搞定:
cargo install probe-rs-tools
装完之后,插上调试器,运行:
probe-rs list
如果能识别到你的调试器,就说明环境通了。我曾经在项目里用 probe-rs 配合 ST-Link 调试 STM32F4,烧录速度比 OpenOCD 快了一倍不止。
2.4 配置 VS Code 开发环境
编辑器这块,VS Code 是目前最主流的选择。我用了几年,插件生态确实丰富。下面是我每次搭建新环境必装的几个插件:
- rust-analyzer —— Rust 语言支持,代码补全、跳转、类型提示全靠它
- Cortex-Debug —— 配合 OpenOCD 或 probe-rs 做嵌入式调试
- Even Better TOML —— 高亮显示 Cargo.toml 文件
- Crates —— 检查依赖版本更新
装好插件后,还需要配置一下调试器。以 probe-rs 为例,在项目根目录创建 .vscode/launch.json:
{
"version": "0.2.0",
"configurations": [
{
"type": "probe-rs",
"request": "launch",
"name": "probe-rs Debug",
"cwd": "${workspaceFolder}",
"chip": "STM32F407VGTx",
"coreConfigs": [
{
"coreIndex": 0,
"programBinary": "${workspaceFolder}/target/thumbv7em-none-eabihf/debug/your-project"
}
]
}
]
}
记得把 chip 和 programBinary 换成你实际用的芯片和项目名。
probe-rs chip list | grep STM32F4 查一下支持的列表。我每次拿到新开发板,第一件事就是跑这个命令确认芯片型号。
2.5 验证环境:编译并烧录一个最小程序
环境搭好了,总得跑个程序验证一下。咱们创建一个新的 Rust 项目:
cargo new --bin blinky
cd blinky
修改 Cargo.toml,添加依赖:
[dependencies]
cortex-m-rt = "0.7"
cortex-m-semihosting = "0.5"
panic-halt = "0.2"
[[bin]]
name = "blinky"
path = "src/main.rs"
[profile.release]
opt-level = "s" # 优化体积
lto = true
在项目根目录创建 .cargo/config.toml:
[target.thumbv7em-none-eabihf]
runner = "probe-rs run --chip STM32F407VGTx"
[build]
target = "thumbv7em-none-eabihf"
然后写一个最简单的 src/main.rs:
#![no_std]
#![no_main]
use panic_halt as _;
use cortex_m_rt::entry;
#[entry]
fn main() -> ! {
loop {}
}
编译:
cargo build
如果编译通过,说明工具链和目标架构配置都没问题。接下来烧录:
cargo run
看到类似 Finished in 0.12s 的输出,就说明程序已经烧进芯片了。
#![no_std],结果链接器报了一堆找不到 memcpy 的错误。记住,嵌入式环境没有标准库,必须用 no_std。
2.6 知识体系总览
下面这张图把本章的核心流程串起来了,方便你对照检查:
这张图把整个流程分成了四个阶段:工具链、目标架构、调试器、编辑器。你按这个顺序走一遍,基本不会漏掉什么。
2.7 常见问题与避坑
- 编译报错:找不到链接脚本 —— 检查
.cargo/config.toml里是否指定了正确的目标架构,以及cortex-m-rt依赖是否添加。 - 烧录失败:无法连接调试器 —— 先确认驱动是否装好,Windows 下 ST-Link 需要装
stlink-tools驱动。我遇到过好几次,插上调试器但系统没识别,换个 USB 口就好了。 - 运行后芯片没反应 —— 检查启动文件是否正确,
#[entry]宏有没有加。我曾经漏掉这个宏,结果程序直接跑飞了。