使用Rust編寫嵌入式韌體入門教程
微控制器 (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 等通訊協議外設。
...
更多點選標題見原文
相關文章
- Rust 編譯器入門Rust編譯
- spacejam/sled:使用Rust語言編寫的嵌入式資料庫Rust資料庫
- rust-raspberrypi-OS-tutorials:用Rust編寫樹莓派嵌入式作業系統的學習教程Rust樹莓派作業系統
- PHP入門教程之編寫自己的PHP框架PHP框架
- 使用 Rust + WebAssembly 編寫 crc32RustWeb
- ekzhang/rustpad:使用Rust編寫的高效程式碼編輯器Rust
- G6-Editor 編輯器入門使用教程
- sublimeText3編輯器 + 入門教程 + 使用大全
- 使用Lua編寫可嵌入式指令碼指令碼
- rust druid編寫第一個窗體RustUI
- CMake入門指南-編譯教程編譯
- 使用 Swift 語言編寫 Android 應用入門SwiftAndroid
- 使用 Rust 語言編寫 Java JNI 實現RustJava
- 使用 macro_rules 編寫生產 Rust 宏!MacRust
- Android入門教程 | RecyclerView使用入門AndroidView
- Go Web 程式設計入門--編寫 Web 中介軟體GoWeb程式設計
- Rust是如何用Rust編寫的? - RedditRust
- 寫一本Flask入門教程Flask
- 使用rust編寫dwm status-bar應用程式Rust
- 使用Rust編寫的各種遊戲 - GameDev#28Rust遊戲GAMdev
- 自己動手編譯NodeMCU韌體編譯
- 【保姆級教程】如何用Rust編寫一個ChatGPT桌面應用RustChatGPT
- scala入門之編寫scala指令碼指令碼
- iMovie 入門教程:影片編輯的利器
- Billy Belceb病毒編寫教程(DOS篇)---病毒編寫所需的軟體
- linux裝置驅動編寫入門Linux
- iMovie 入門教程:視訊編輯的利器
- Rust入門系列之切片Rust
- rust入門篇-hello worldRust
- Rust Rocket簡單入門Rust
- Python 系列教程(入門系列已寫完)Python
- gitbook 入門教程之快速體驗Git
- [譯]使用 Rust 編寫快速安全的原生 Node.js 模組RustNode.js
- glide從入門到使用教程IDE
- ABP入門系列(11)——編寫單元測試
- iOS彙編入門教程(一)ARM64彙編基礎iOS
- [編譯] 10、kconfig 入門指導教程編譯
- MATLAB程式設計與應用系列-關於MATLAB程式設計入門教程的總體編寫安排Matlab程式設計