Rust 模板的创建 - 20240901

一、简要说明

本文主要是参考 Rust 官方的 探索之书 Discovery

书中使用的开发板为 micro::bit,而我使用的开发板为 野火指南者,其使用的芯片为 stm32f103ve

下文主要是根据 探索之书 的内容,构建属于我们的开发环境。

二、 工具安装

因为要使用到交叉编译的内容,故先要为 rustup 安装相应 target

Arm 系列架构的,可以参考 Build it - Discovery (rust-embedded.org)

然后需要添加一些辅助的工具,可参考 主要参考 Setting up a development environment - Discovery (rust-embedded.org)

其中,我现在安装过了里面的两个工具:

  1. cargo-binutils
  2. cargo-embed

文中还提到几个工具,我还未用过,故先暂下不表。

其中 cargo-embed 是另一个项目 probe-rs 的一部分。probe-rs 的功能相当于 pyOCD 和 openOCD,主要是提供下载、调试等功能。

三、项目的创建

在命令行里,使用 cargo 命令来创建一个空项目。

$ cargo new embed-study

因为我们运行在祼机的环境下,所以我们需要自己实现一些最小的运行时环境。幸运的是,开源世界里提供了相应的帮助。

# 在根目录环境下
$ cargo add cortex-m-rt

cortex-m 表示我们的架构,rt 表示运行时环境。

其工作原理,可参考下面两个网站:

  1. Rust嵌入式开发入门(07)--链接脚本是如何串接起来的_哔哩哔哩_bilibili
  2. cortex_m_rt - Rust (docs.rs)

接着需要安装另一个库

$ cargo add panic-halt

此库的主要功能是提供了 panic 产生后的处理方法。

接着实现 src/main.rs 的内容了。主要参考 LED roulette - Discovery (rust-embedded.org)

// ./src/main.rs

#![no_std]
#![no_main]

// 引入 panic 的处理,但因为不是我们使用,
// 为了避免一些不必要的 `unuse` 警告,
// 所以把其定义为 前缀带 下划线
use panic_halt as _;

// 电脑环境下的 main 是根据相应操作系统做了适配
// 而当前是作为交叉编译,而且目标环境与电脑是不一样
// 故上面使用 `#![no_main]` 。
// 但当前 binary crate 总得有一个入口,
// 而 cortex-m-rt 提供一个宏 `entry` 来创建入口
use cortex_m_rt::entry;


#[entry]
fn main() -> ! {
    

    loop {}
}

三、 构建、烧录与调试

cortex-m-rt 的文档里有提,我们需要提供一个 memory.x 的文件,用于指明芯片的 FlashRam 的位置与大小。具体可以参考 Rust嵌入式开发入门(07)--链接脚本是如何串接起来的_哔哩哔哩_bilibili

/* 这里写的可能不正确的 */

/* Linker script for the STM32F103C8T6 */
MEMORY
{
  FLASH : ORIGIN = 0x08000000, LENGTH = 64K
  RAM : ORIGIN = 0x20000000, LENGTH = 20K
}

然后创建一个文件 .cargo/config.toml

[target.'cfg(all(target_arch = "arm", target_os = "none"))']
rustflags = [
    "-C", "link-arg=-Tlink.x",
]

注意,如果没有 config.toml ,可以编译成功,但烧录时,会出错。可以参考 [src/05-led-roulette]No loadable ELF sections were found · Issue #452 · rust-embedded/discovery · GitHub

还有一个文件,就是 ./Embed.toml。此文件是提供给 cargo-embed 使用的。

[default.general]
# chip = "nrf52833_xxAA" # uncomment this line for micro:bit V2
# chip = "nrf51822_xxAA" # uncomment this line for micro:bit V1

# 可以在命令中,使用  `probe-rs chip list > chips.txt`
# 然后在生成的 `chips.txt` 里找到你的芯片类型
chip = "STM32F103VE"

[default.reset]
halt_afterwards = true

[default.rtt]
enabled = false

# 是否开启 gdb 调试
[default.gdb]
enabled = true  

四、修改功能

为了能更直观地看到程序是否正常烧录至单片机上,我们把原程序修改下。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容