了解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内置的货物测试工具。