嵌入式Rust开发与神经网络图像分类器实践
立即解锁
发布时间: 2025-09-04 01:52:05 阅读量: 24 订阅数: 32 AIGC 


Rust编程核心概念精讲
### 嵌入式Rust开发与神经网络图像分类器实践
#### 1. 嵌入式Rust基础项目:Hello World
嵌入式编程是针对微控制器或运行其他设备的小型计算机的特定编程类型,有托管和裸机两种编程环境。托管环境接近我们熟悉的普通计算机环境,有系统接口可与文件系统、内存、网络、线程等各种系统进行交互;而裸机环境在程序运行前没有加载任何代码,也无法加载标准库。Rust的标准库需要其主机系统支持各种功能,裸机系统不具备这些功能,但Rust仍可在这些系统上工作,只需在 crate 根目录添加 `#![no_std]` 属性,告诉Rust不使用标准库。
以下是创建嵌入式Rust项目的步骤:
1. **安装 `cargo-generate` 工具**:
```bash
cargo install cargo-generate
```
2. **使用 `cargo-generate` 工具和 `cortex-m-quickstart` 模板创建新项目**:
```bash
cargo generate --git https://github.com/rust-embedded/cortex-m-quickstart
```
在提示时输入项目名称为 `embedded-rust`。
3. **进入项目目录并查看目录结构**:
```bash
cd embedded-rust
```
项目生成后,我们来看一下 `src/main.rs` 源文件,它与我们常见的标准Rust程序有所不同:
```rust
#![no_main]
#![no_std]
use cortex_m_rt::entry;
use panic_halt as _;
// Entry point of the program
#[entry]
fn main()->!{
loop {
// rest of the code
}
}
```
在上述代码中,程序使用了 `#![no_std]` 属性,这意味着程序将不链接到 `std` crate,而是链接到 `core` crate;`#![no_main]` 属性表示程序不会使用 `main` 函数作为入口点;`panic_halt` crate 用于为程序提供一个 panic 处理程序;`#[entry]` 属性由 `cortex-m-rt` crate 提供,用于标记程序的入口点。由于 `main` 函数是目标硬件上运行的唯一进程,所以将其设为发散函数(返回类型为 `!`,这是一个空类型)。
为了在 Cortex - M3 平台上交叉编译我们的程序,我们可以使用 `thumbv7m-none-eabi` 目标。添加该目标到 Rust 工具链的命令如下:
```bash
rustup target add thumbv7m-none-eabi
```
编译程序的命令为:
```bash
cargo build --target thumbv7m-none-eabi
```
编译后会生成一个 ELF 二进制文件 `target/thumbv7m-none-eabi/debug/embedded-rust`。我们可以使用以下命令打印 ELF 头信息:
```bash
cargo readobj --bin embedded-rust -- --file-headers
```
使用以下命令打印二进制文件链接器部分的大小:
```bash
cargo size --bin embedded-rust --release -- -A
```
反汇编二进制文件的命令为:
```bash
cargo objdump --bin embedded-rust --release -- --disassemble --no-show-raw-insn --print-imm-hex
```
#### 2. 运行嵌入式程序
我们尝试在 QEMU 硬件模拟器上运行 `examples/hello.rs` 嵌入式程序,该程序使用半主机机制将文本输出到主机计算机的控制台。半主机是一种机制,它使运行在嵌入式系统或目标(如 ARM 目标)上的代码能够与主机计算机通信并使用其输入/输出设施。
编译 `hello.rs` 示例的命令为:
```bash
cargo build --example hello
```
编译后会生成一个输出二进制文件 `target/thumbv7m-none-eabi/debug/examples/hello`。在 QEMU 上运行该二进制文件的命令为:
```bash
qemu-system-arm -machine lm3s6965evb -cpu cortex-m3 -semihosting-config enable=on,target=native -nographic -kernel target/thumbv7m-none-eabi/debug/examples/hello
```
运行该命令后,会在控制台打印出消息 `Hello, world!`。
#### 3. 调试嵌入式程序
由于我们要调试的嵌入式程序运行在与调试器(如 GDB 或 LLDB)不同的机器上,所以这种调试是在客户端 - 服务器设置中进行的远程调试。在我们的设置中,GDB 进程充当客户端,运行嵌入式程序的进程充当服务器。
以下是调试程序的步骤:
1. **以调试模式启动 QEMU**:
```bash
qemu-system-arm -machine lm3s6965evb -cpu cortex-m3 -semihosting-config enable=on,target=native -nographic -
```
0
0
复制全文
相关推荐










