July 28, 2025

Rust进阶日记

环境搭建

安装RUST

1
rustup target add thumbv7em-none-eabihf # 添加target STM32F4/F7/H7 → Cortex-M4/M7 (有FPU)

Arm GNU Toolchain 下载

1
arm-none-eabi-ld --version # 检查arm gun toolchain版本
1
2
3
# 选择宿主 Rust 工具链
rustup toolchain install stable-x86_64-pc-windows-gnu
rustup default stable-x86_64-pc-windows-gnu
1
2
3
# 创建裸机项目
cargo install cargo-generate
cargo generate --git https://github.com/rust-embedded/cortex-m-quickstart

RUST代理设置

image-20250728210000497

常用命令

rustup

1
rustup target list # 列出所有可用的编译目标(target triples)(运行环境),并显示当前是否已经安装。

cargo

语法解析

unsafe

unsafe 是一个 显式标记“编译器无法自动保证安全”的代码块或函数 的关键字。Rust 默认所有代码都是“安全的”,unsafe 是用来做底层操作、和硬件交互、调用 C 接口、手动管理内存的“逃生舱”。

Rust 的核心目标是内存安全和数据竞争安全。编译器默认禁止:

但裸机开发、操作系统、驱动程序必须做这些操作,所以 Rust 提供了 unsafe 作为显式承诺:“我知道自己在干什么,编译器不用再检查这一块。”

safe Rust 永远安全,unsafe Rust 需要你自己保证安全。

解引用裸指针

1
2
3
4
let ptr: *const u32 = 0x2000_0000 as *const u32;
unsafe {
let value = *ptr; // 读取裸指针
}

修改可变静态变量

1
2
3
4
static mut COUNTER: u32 = 0;
unsafe {
COUNTER += 1;
}W

**调用 unsafe fn**(例如 FFI、裸机寄存器访问)

1
2
3
4
5
6
extern "C" {
fn my_c_func();
}
unsafe {
my_c_func(); // FFI 是不安全的
}

实现不安全 trait

1
2
unsafe trait MyTrait {}
unsafe impl MyTrait for MyType {}W

访问/修改联合体字段

1
2
3
4
5
union U { a: u32, b: f32 }
let u = U { a: 42 };
unsafe {
println!("{}", u.b);
}W

STM32F103裸机开发

1
cargo new stm32f103 # 创建工程

STM32F4裸机开发

1
rustup target add thumbv7em-none-eabihf # 添加交叉编译目标
1
2
3
# 安装 cargo-binutils 和 llvm-tools(用于链接和 objdump)
cargo install cargo-binutils
rustup component add llvm-tools-preview
1
2
3
# 创建裸机项目
cargo install cargo-generate
cargo generate --git https://github.com/rust-embedded/cortex-m-quickstart

关于本文

由 Shane 撰写, 采用 CC BY-NC 4.0 许可协议.

#Rust#嵌入式