使用Rust編寫嵌入式韌體入門教程

banq發表於2021-12-20

微控制器 (MCU) 在現代電子產品中無處不在。這些組合硬體/軟體的裝置稱為嵌入式裝置,它們的軟體通常是用 C 或 C++ 編寫的。Rust是一種現代語言,最近成為一種可行的替代方案。本文探討了 Rust 在嵌入式方面的功能,併為使用它編寫韌體提供了一個起點。它包含您可能已經熟悉的有關嵌入式程式設計和 Rust 的介紹性資訊;您可能希望向下滾動並跳至程式碼示例。

入門

  • 安裝Rust
  • 為您的 MCU 安裝編譯目標。即,執行rustup target add thumbv7em-none-eabihf。
  • 安裝快閃記憶體和除錯工具:cargo install flip-link, cargo install probe-run. 請注意,您也可以使用 OpenOCD,儘管我們認為此處的 Knurling 工具更易於使用。
  • 克隆STM32-HAL 快速入門儲存庫:git clone https://github.com/David-OConnor/stm32-hal-quickstart。請注意,這是對Knurling App Template的薄包裝。此處使用的特定硬體抽象層 (HAL) 庫將有助於我們處理更高階別的示例,但對前幾個示例沒有任何影響。

或者,您可以使用 建立一個新專案cargo new --lib projectname,並新增所需的程式碼。使用上述模板的一個優點是它提供了一些與嵌入式一起使用所需的樣板,例如.config.TOML指定編譯器目標,以及memory.x指定 MCU 的快閃記憶體和 RAM 量。您很可能最終會得到自己的模板或針對您的特定用例或 MCU 量身定製的模板。

主程式程式碼位於src/main.rs. 它包括使您的程式與 Knurling 除錯和快閃記憶體工具一起工作的設定程式碼,以及我們將在本文後面使用的高階 API 的示例匯入。

您不需要特殊的 IDE 來使用 Rust 編寫和快閃記憶體嵌入:您可以在您選擇的程式碼編輯器中編寫,並使用終端來編譯和快閃記憶體您的程式碼(執行cargo run --release)。在的IntelliJ Rust外掛是非常好的,並且與所有的IntelliJ IDE,包括克利翁和PyCharm相容。帶有rust-analyzer外掛的VsCode是另一個不錯的選擇。

 

刷機除錯

使用上面建立的設定時,要編譯和刷寫,請執行cargo run --release. 或簡寫:cargo r --release. 

與不使用release相比,使用釋出release模式需要更長的編譯時間,但使用非釋出模式韌體會導致效能和記憶體問題。

這是由於我們安裝了探針執行工具: cargo/config.toml以及模板中提供的檔案。

要為生產刷寫最終的韌體,您可能需要建立一個獨立的二進位制檔案。要做到這一點的方法之一是cargo binutils

你可以用這個命令來安裝:cargo install cargo-binutils。

然後,您可以用此命編譯一個獨立的二進位制檔案:cargo objcopy --release -- -O binary target/firmware.bin。

然後,您可以使用 Stm32CubeProgrammer 或 dfu-util 之類的工具來重新整理 MCU。

要使用上述設定列印到終端,我們可以使用如下defmt命令:defmt::println!("Pin state: {}", pin_state);, 或defmt::error!("Oh no!");。

有關除錯功能的詳細資訊,請檢視Defmt 的官方指南

 

直接寫暫存器

本示例中的主要程式邏輯將位於上面直接建立的專案中,在src/main.rs. 它使用Cortex-M 庫作為主幹,並且可以執行計算。為了與世界互動(輸入/輸出),您通常會使用 MCU 上的外設,包括通用輸入/輸出 (GPIO) 引腳、模數和數模(ADC 和 DAC)外設,以及SPI、I²C 和 UART 等通訊協議外設。

...

更多點選標題見原文

相關文章