Rust 模板的創(chuàng)建 - 20240901

一、簡(jiǎn)要說明

本文主要是參考 Rust 官方的 探索之書 Discovery。

書中使用的開發(fā)板為 micro::bit,而我使用的開發(fā)板為 野火指南者,其使用的芯片為 stm32f103ve。

下文主要是根據(jù) 探索之書 的內(nèi)容,構(gòu)建屬于我們的開發(fā)環(huán)境。

二、 工具安裝

因?yàn)橐褂玫浇徊婢幾g的內(nèi)容,故先要為 rustup 安裝相應(yīng) target。

Arm 系列架構(gòu)的,可以參考 Build it - Discovery (rust-embedded.org)

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

其中,我現(xiàn)在安裝過了里面的兩個(gè)工具:

  1. cargo-binutils
  2. cargo-embed

文中還提到幾個(gè)工具,我還未用過,故先暫下不表。

其中 cargo-embed 是另一個(gè)項(xiàng)目 probe-rs 的一部分。probe-rs 的功能相當(dāng)于 pyOCD 和 openOCD,主要是提供下載、調(diào)試等功能。

三、項(xiàng)目的創(chuàng)建

在命令行里,使用 cargo 命令來創(chuàng)建一個(gè)空項(xiàng)目。

$ cargo new embed-study

因?yàn)槲覀冞\(yùn)行在祼機(jī)的環(huán)境下,所以我們需要自己實(shí)現(xiàn)一些最小的運(yùn)行時(shí)環(huán)境。幸運(yùn)的是,開源世界里提供了相應(yīng)的幫助。

# 在根目錄環(huán)境下
$ cargo add cortex-m-rt

cortex-m 表示我們的架構(gòu),rt 表示運(yùn)行時(shí)環(huán)境。

其工作原理,可參考下面兩個(gè)網(wǎng)站:

  1. Rust嵌入式開發(fā)入門(07)--鏈接腳本是如何串接起來的_嗶哩嗶哩_bilibili
  2. cortex_m_rt - Rust (docs.rs)

接著需要安裝另一個(gè)庫(kù)

$ cargo add panic-halt

此庫(kù)的主要功能是提供了 panic 產(chǎn)生后的處理方法。

接著實(shí)現(xiàn) src/main.rs 的內(nèi)容了。主要參考 LED roulette - Discovery (rust-embedded.org)

// ./src/main.rs

#![no_std]
#![no_main]

// 引入 panic 的處理,但因?yàn)椴皇俏覀兪褂茫?// 為了避免一些不必要的 `unuse` 警告,
// 所以把其定義為 前綴帶 下劃線
use panic_halt as _;

// 電腦環(huán)境下的 main 是根據(jù)相應(yīng)操作系統(tǒng)做了適配
// 而當(dāng)前是作為交叉編譯,而且目標(biāo)環(huán)境與電腦是不一樣
// 故上面使用 `#![no_main]` 。
// 但當(dāng)前 binary crate 總得有一個(gè)入口,
// 而 cortex-m-rt 提供一個(gè)宏 `entry` 來創(chuàng)建入口
use cortex_m_rt::entry;


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

    loop {}
}

三、 構(gòu)建、燒錄與調(diào)試

cortex-m-rt 的文檔里有提,我們需要提供一個(gè) memory.x 的文件,用于指明芯片的 FlashRam 的位置與大小。具體可以參考 Rust嵌入式開發(fā)入門(07)--鏈接腳本是如何串接起來的_嗶哩嗶哩_bilibili

/* 這里寫的可能不正確的 */

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

然后創(chuàng)建一個(gè)文件 .cargo/config.toml

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

注意,如果沒有 config.toml ,可以編譯成功,但燒錄時(shí),會(huì)出錯(cuò)??梢詤⒖?[src/05-led-roulette]No loadable ELF sections were found · Issue #452 · rust-embedded/discovery · GitHub

還有一個(gè)文件,就是 ./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 調(diào)試
[default.gdb]
enabled = true  

四、修改功能

為了能更直觀地看到程序是否正常燒錄至單片機(jī)上,我們把原程序修改下。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容