学习嵌入式Rust需要理解高级语言概念和与硬件交互的低级细节。我建议从阅读《Rust编程语言》一书开始。一旦理解了这些概念,再深入学习嵌入式方面的知识就容易多了。
不过,在本系列文章中,我们不会采用这种方法。当然,我假设您会阅读这些材料,但我知道其实您已经迫不及待地想使用Rust在开发板上点亮LED了。我们将从底层(硅片)开始研究Rust,从如何启动和运行项目开始。为此,我将在这篇文章中向您介绍Cortex-M QuickStart模板,它可以让您在设置嵌入式Rust项目时更加轻松。
在我们开始使用Cortex-M QuickStart模板创建嵌入式Rust项目之前,了解在哪里可以找到有关嵌入式Rust的资源非常重要。我们将要使用的QuickStart模板由嵌入式设备Rust工作组提供。如果你查看一下他们的GitHub页面,就会发现这里有大量资源,例如:
他们目前有超过50个资源库,旨在帮助开发人员快速掌握Rust。虽然并不完美,但它们可以帮助您立即开始工作。
这篇文章中我们主要研究的资源是Cortex-M QuickStart模板。
Cortex-M QuickStart模板是为使用STM32F3 Discovery开发板的Arm Cortex-M处理器设计的嵌入式Rust项目的示例。在所有项目中,都必须遵循几个步骤才能完成设置,不过该模板会为您处理大部分步骤。让我们来看看模板已经为您管理的一些关键任务。
首先,您将获得一个项目结构,该结构非常简单,但会将配置、示例和应用分开。下面是为blinky应用设置的项目结构:
接下来,模板设置了启动所需的所有依赖项和工具链。Cargo.toml文件已预先配置为支持常见的crate,如cortex-m、cortex-m-rt和panic-halt。我们将在以后的文章中更详细地探讨这一点。
接下来,项目已经配置好了编译和调试。配置文件允许您选择要编译的Arm架构,以及它是针对目标还是QEMU仿真。
如果仔细查看目录结构,您还会看到openocd的配置。可以自定义VS Code的预配置启动文件以使用SEGGER J-Link、STLink或您感兴趣的任何调试服务器。
最后,还有示例应用程序。默认的main.rs只是为了说“Hello World!”。不过,还有一个示例文件夹,该文件夹包含用于测试常见嵌入式需求的其他应用,例如:
现在,您对模板提供的功能有了一定的了解,让我们看看如何利用此模板快速启动并运行应用。
使用快速启动模板创建嵌入式Rust项目非常简单。首先,您必须确保已安装生成工具。Generate是一种实用程序,用于从现有模板快速创建新的Rust项目,它允许开发人员使用包含样板代码和项目结构的预定义模板,从而简化了启动新项目的过程。可使用以下命令从终端安装它:
cargo install cargo-generate
安装该工具后,您可以通过执行以下命令创建一个新的嵌入式Rust应用:
cargo generate --git https://github.com/rust-embedded/cortex-m-quickstart
我们使用generate关键字调用Cargo、Rust包管理器和编译系统。然后我们告诉Cargo我们想要从Git代码库创建一个应用,并提供代码库URL,即Cortex-M QuickStart代码库。
运行命令后,系统会提示您输入一些有关项目的信息。最基本的信息是决定项目的名称。如果您想探索模板项目,它是为STM32F3 Discovery开发板设置的,您可以将项目命名为stm32f3_blinky。
我将向您展示一个使用名为stm32u575_blinky的STM32U575 Nucleo开发板的示例。调用生成命令并提供我的项目名称后,我得到如下所示的输出:
它从模板创建了几个文件,这些文件就是我们在上一节讨论过的文件。
您可以运行cargo build,然后运行cargo run来执行默认应用,或者您也可以只使用cargo run,它将编译并运行该应用。
Cortex-M QuickStart模板是启动和运行嵌入式项目的简便方法。但请记住,默认情况下它是为STM32F3 Discovery开发板设置的。在今天的文章中,我们讨论了模板以及如何使用Cargo Generate在其基础上创建新项目。
你可以按照以下几个步骤继续你的嵌入式Rust之旅:
在下一篇文章中,我们将深入探讨如何修改我们可能感兴趣的所有微控制器的默认项目。这将涉及修改目标架构的配置文件和修改链接器文件。
(原文刊登于EDN姊妹网站Embedded,参考链接:Embedded Rust: The Cortex-M QuickStart Template,由Ricardo Xie编译。)