了解Rust工具鏈以及作為嵌入式軟件開發人員在嵌入式目標上使用Rust需要什么是很重要的。在本文中,我們將探索Rust的工具鏈和生態系統,以幫助你了解它如何提高生產力、確保安全和簡化開發過程。
Rust工具鏈簡介
Rust工具鏈包含各種各樣的工具,可用于構建、測試、格式化等等。然而,在工具鏈的根部只有幾個工具,可以在下圖中進行總結:
圖1–Rust工具鏈概述
Rustup
rustup.rs工具是一個用于管理Rust工具鏈和相關組件的命令行工具。它提供了一種簡單的方法來安裝、更新和管理Rust編程語言及其工具的多個版本。如果你想安裝Rust,你可以從訪問Rust-lang.org網站開始,并按照操作系統的說明進行操作。
Rustc
作為標準安裝的一部分安裝的另一個工具是rustc。rustc是Rust編程語言的官方編譯器。它把你的Rust源代碼編譯成可執行的二進制文件。例如,你可以使用以下命令編譯一個main.rs文件:
rustc main.rs
或者,由于我們對嵌入式軟件感興趣,你可以使用如下命令:
rustc–target = thumb v7m-none-eabi main . RS
結果是代碼被編譯并生成一個二進制文件,該文件可以直接在你的PC上執行,也可以閃存到你的嵌入式目標上。
Cargo
但是在很多情況下,我們并不直接使用rustc。相反,我們使用Rust工具Cargo。Cargo是Rust構建工具和包管理器。它內置了多種構建類型,例如:
構建–編譯你的項目
運行——執行項目(并在需要時構建)
測試–運行你的單元測試
文檔–生成你的文檔
publish——將你的板條箱發布到crate.io,它托管所有可用于Rust的庫。
Cargo在Cargo.toml配置文件中查找關于項目依賴項的信息。例如,如果你正在為Arm Cortex-M處理器編寫一個應用程序,你可能會有如下所示的依賴關系:
這些依賴項中的每一個都是一個庫箱。一般來說,一個crate是一個編譯單元,充當Rust代碼的基本構建塊。它可以是一個庫或二進制箱。庫箱通常有一個lib.rs文件,而二進制箱有一個main.rs文件。這有時會令人困惑,因為單個文件(*.rs)被認為是板條箱,即使你發布的多個文件可以組成一個板條箱。
如果你創建了一個有用的crate,你可以將它們發布到crate.io,供其他開發人員使用。他們使用Cargo.toml文件來指定他們希望在應用程序中使用的板條箱名稱和版本。
嵌入Rust的附加工具
Rust附加的基本工具非常適合開發應用程序,但如果你想編寫嵌入式Rust應用程序,它們并不是你需要的全部。你還需要包括一些額外的內容,如下所示:
l Cargo-Binutils
l LLVM工具
l Cargo-generate
l GNU Arm交叉編譯工具
l 交叉編譯的Rust目標
Cargo Binutils是Cargo子命令的集合,它使Rust工具鏈附帶的LLVM工具易于使用。這些工具包括objdump、nm和size的LLVM版本,用于檢查二進制文件。這些工具對于理解嵌入式應用程序的大小和檢查交叉編譯器生成的指令非常有用。
LLVM工具是模塊化和可重用的編譯器和工具鏈技術的集合。
Cargo-Generate是一個開發工具,通過利用預先存在的git存儲庫作為模板,幫助你快速啟動并運行一個新的Rust項目。有一個針對Cortex-M處理器的快速入門示例,通常用于啟動和運行嵌入式項目。
GNU Arm工具鏈是一個用于ARM Cortex-M處理器的交叉編譯工具鏈。它包括GCC編譯器和其他必要的工具,為基于ARM的微控制器編譯代碼。如果你是嵌入式開發人員,你可能已經對這些很熟悉了。
用于交叉編譯的Rust目標指的是特定的編譯配置,其允許Rust代碼被編譯用于不同的架構和平臺,而不是代碼被編譯的平臺。例如,如果我想針對Cortex-M33處理器進行編譯,我可以使用以下命令將目標添加到工具鏈中:
rustup target add thumbv8m.main-none-eabihf
有了這些工具,你就能像使用C或C++一樣開發嵌入式Rust代碼。
結論
Rust工具鏈和生態系統是獨一無二的,因為它們將開發Rust應用程序所需的一切打包在一起。社區開發包和工具,而在C/C++中,你依賴供應商或公司為你提供工具。例如,如果你想要測試你的代碼,你必須找到一個測試工具。每個嵌入式團隊都有自己的偏好,使用不同的。對于Rust,你可以使用Rust內置的貨物測試工具。