在上一篇文章《嵌入式Rust:你好,世界!》中,我们探讨了基本的Rust应用是什么样子以及如何使用Rust函数。在了解“Hello Blinky”应用程序之前,还有非常重要的一点就是要了解Rust工具链以及作为嵌入式软件开发人员在嵌入式目标上使用Rust需要什么。
在这篇文章中,我们将探索Rust的工具链和生态系统,以帮助您了解它如何提高生产力、确保安全性并简化开发过程。
Rust工具链包含各种工具,可用于编译、测试、格式化等。然而,工具链的根基只有几个工具,可以用下图来概括:
图1:Rust工具链概述。
rustup.rs工具是一个用于管理Rust工具链和相关组件的命令行工具。它提供了一种安装、更新和管理多个版本的Rust编程语言及其工具的简单方法。如果要安装Rust,请先访问rust-lang.org网站并按照操作系统的说明进行操作。例如,在我的Mac/Linux上,我使用以下命令:
curl –proto ‘=https’ –tlsv1.2 -sSf https://sh.rustup.rs | sh
该命令会与其他标准Rust工具一起安装rustup。通常在安装后,我会使用以下rustup命令来验证已安装的版本:
rustup –version
作为标准安装的一部分安装的另一个工具是rustc。rustc是Rust编程语言的官方编译器。它会将您的Rust源代码编译为可执行的二进制文件。例如,您可以使用以下命令编译单个main.rs文件:
rustc main.rs
或者,如果我们对嵌入式软件感兴趣,您可以使用如下命令:
rustc –target=thumbv7m-none-eabi main.rs
其结果是代码被编译并生成一个二进制文件,该二进制文件可以直接在您的PC上执行,也可以传输到您的嵌入式目标上。
不过,在很多情况下,我们并不直接使用rustc。我们会使用Rust工具Cargo。Cargo是Rust编译工具和包管理器。它内置了几种编译类型,例如:
Cargo会查看Cargo.toml配置文件以获取有关项目依赖项的信息。例如,如果您正在为Arm Cortex-M处理器编写应用,则可能具有如下所示的依赖项:
[dependencies]
critical-section = { version = "1.1.2", optional = true }
cortex-m = "0.7.7"
cortex-m-rt = { version = "0.7.3", optional = true }
这些依赖项中的每一个都是一个库crate。通常,crate是一个编译单元,是Rust代码的基本编译块。它可以是库或二进制crate。库crate通常有一个lib.rs文件,而二进制crate有一个main.rs文件。有时可能会造成混淆,因为单个文件(*.rs)被视为crate,即使您发布的crate可能由多个文件组成。
如果您创建了一个有用的crate,您可以将其发布到crate.io供其他开发人员使用。他们使用Cargo.toml文件来指定他们想要在其应用中使用的crate名称和版本。
Rust附带的基本工具非常适合开发应用,但如果您想编写嵌入式Rust应用,它们还不够。您还需要添加一些其他工具,如下所示:
Cargo-Binutils是Cargo子命令的集合,可让您轻松使用Rust工具链附带的LLVM工具。这些工具包括objdump、nm和size的LLVM版本,用于检查二进制文件。这些工具可用于了解嵌入式应用的大小并检查交叉编译器生成的指令。
LLVM工具是模块化、可重用的编译器和工具链技术的集合。
Cargo-Generate是一款开发人员工具,可利用已有的git存储库作为模板,帮助您快速启动和运行新的Rust项目。其中有一个Cortex-M处理器的快速入门示例,通常用于启动和运行嵌入式项目。我们将在下一篇文章中介绍如何使用它。
GNU Arm Toolchain是ARM Cortex-M处理器的交叉编译工具链。它包括GCC编译器和其他必要的工具,用于编译基于ARM的微控制器的代码。如果您是嵌入式开发人员,您可能已经对这些有所了解。
Rust targets for cross-compilation是指特定的编译配置,允许Rust代码针对除编译代码的架构和平台之外的其他架构和平台进行编译。例如,如果我想针对Cortex-M33处理器进行编译,我可以使用以下命令将目标添加到工具链中:
rustup target add thumbv8m.main-none-eabihf
有了这些工具,您将能够像使用C或C++一样开发嵌入式Rust代码。
Rust工具链和生态系统非常独特,因为它们将开发Rust应用所需的一切打包在一起。社区开发了软件包和工具,而在C/C++中,您要依赖供应商或相关企业为您提供工具。例如,如果您想测试代码,就必须找到测试工具,每个团队都有自己的偏好并使用不同的工具。对于Rust,您可以使用内置于Rust中的Cargo测试工具。
在下一篇文章中,我们将探讨如何结合使用Cargo Generate和Cortex-M快速入门示例来启动和运行嵌入式Rust项目。
(原文刊登于EDN姊妹网站Embedded,参考链接:Embedded Rust: learning the toolchain,由Ricardo Xie编译。)