在最近的几篇文章中,我们开始探索嵌入式Rust。您已经看到的Cortex-M QuickStart模板是一个很好的开始。但是,通用模板并不能帮助您深入开发目标开发板上的LED。在今天的文章中,我们将仔细研究Cortex-M QuickStart模板以及如何添加对您自己的Cortex-M微控制器的支持。
如果您已经使用嵌入式系统一段时间,那么您可能已经研究过微控制器的链接器文件。链接器文件(通常称为链接器脚本)定义了嵌入式系统的内存布局,指定了在编译的链接阶段如何将代码和数据放置在内存中。
传统上,链接器脚本始终具有扩展名.ld。在Rust中,这一传统更加明显!在我们创建的Cortex-M QuickStart项目中,链接器脚本名为memory.x。默认情况下,它包含入门所需的最基本信息。例如,以下是默认的链接器脚本:
MEMORY
{
/* NOTE 1 K = 1 KiBi = 1024 bytes */
/* TODO Adjust these memory regions to match your device memory layout */
/* These values correspond to the LM3S6965, one of the few devices QEMU can emulate */
FLASH: ORIGIN = 0x00000000, LENGTH = 256K
RAM: ORIGIN = 0x20000000, LENGTH = 64K
}
从脚本中可以看出,默认链接器适用于德州仪器LM3S6965。您要执行的第一步是更新特定微控制器的FLASH和RAM部分。
您必须检查微控制器数据表,因为芯片供应商有时会根据自己的需求定制架构。对于任何STM32组件,您都需要将原点更新为0x08000000。闪存长度将根据您使用的特定组件而有很大不同。由于我开始本系列时考虑的是STM32U575,因此我将更新自己的链接器以匹配以下内容:
MEMORY
{
/* NOTE 1 K = 1 KiBi = 1024 bytes */
FLASH: ORIGIN = 0x08000000, LENGTH = 2M
RAM: ORIGIN = 0x20000000, LENGTH = 768K
}
我是如何得出这些值的?我查看了STM32U575xx的数据表。您可能还需要定义更多的部分,但只是为了让一些简单的功能启动和运行,这些就已经足够了。
为我们的目标设置好链接器脚本后,接下来要做的就是确保Rust支持微控制器架构。可通过两种方式添加对特定架构的支持。
首先,您需要打开.cargo/config.toml文件。通过该文件中的设置,你可以配置“cargo run”的行为方式、你需要的任何其他链接器标志以及构建目标架构!现在,我们先不配置运行器,但您能看到[build]下有几个选项:
[build]
# Pick ONE of these default compilation targets
# target = "thumbv6m-none-eabi" # Cortex-M0 and Cortex-M0+
target = "thumbv7m-none-eabi" # Cortex-M3
# target = "thumbv7em-none-eabi" # Cortex-M4 and Cortex-M7 (no FPU)
# target = "thumbv7em-none-eabihf" # Cortex-M4F and Cortex-M7F (with FPU)
# target = "thumbv8m.base-none-eabi" # Cortex-M23
# target = "thumbv8m.main-none-eabi" # Cortex-M33 (no FPU)
# target = "thumbv8m.main-none-eabihf" # Cortex-M33 (with FPU)
这些选项会告诉Rust工具链我们要针对哪种目标架构进行交叉编译。默认值为Cortex-M3。STM32U575微控制器是Cortex-M33,因此我的config.toml文件更新如下:
[build]
# Pick ONE of these default compilation targets
# target = "thumbv6m-none-eabi" # Cortex-M0 and Cortex-M0+
# target = "thumbv7m-none-eabi" # Cortex-M3
# target = "thumbv7em-none-eabi" # Cortex-M4 and Cortex-M7 (no FPU)
# target = "thumbv7em-none-eabihf" # Cortex-M4F and Cortex-M7F (with FPU)
# target = "thumbv8m.base-none-eabi" # Cortex-M23
# target = "thumbv8m.main-none-eabi" # Cortex-M33 (no FPU)
target = "thumbv8m.main-none-eabihf" # Cortex-M33 (with FPU)
如果您使用的是我们自己的开发板,您可以识别微控制器的架构并取消对相应架构的注释。
不幸的是,还有一些事您需要做。您需要执行最后一个简单的步骤,为您的架构添加组件,以便Rust可以在该架构下编译您的代码。您可以在命令行中运行如下命令来完成这项工作:
rustup target add thumbv8m.main-none-eabihf
您可以用您计划使用的任何架构来替换thumbv8m.main-none-eabihf。
完成后,您就可以使用以下命令编译代码了:
cargo build
当你编译时,会发现得到类似以下的结果:
如果你仔细检查了Cargo Build的输出,可能会好奇那些正在编译的包是什么。有几种方法可以让你学习和理解它们各自的功能。
首先,可以通过运行以下命令为您的项目构建文档:
cargo doc –open
该命令将为您的项目和应用使用的每个包构建文档。–open随后还会在Web浏览器中打开文档。然后,您可以浏览每个包以查看它是什么以及它的作用。
第二种选择是访问crates.io。Crates.io是Rust编程语言的官方软件包注册表。它的功能与其他编程生态系统中的存储库类似,例如Node.js的npm或Python的PyPI。如果您访问该网站,可以搜索单个软件包。例如,假设我搜索软件包cortex-m,我会看到如下结果:
我可以看到软件包名称、当前版本和简短的软件包描述。您可以单击cortex-m字样,它会将您带到一个更详细的页面,告诉您如何安装、版本历史,并提供指向文档的链接。
文档将进一步提供有关该软件包的信息,例如其他软件包依赖项、特征、结构、示例用途等等。当您陷入困境,无法弄清Rust代码无法运行的原因时,查看crates.io上的文档将帮助您找到所需的答案。
到目前为止,您已经了解了使用Cortex-M QuickStart模板启动和运行嵌入式Rust是多么容易。我们已经探讨了如何通过添加架构支持和配置链接器脚本来支持特定的微控制器。
从这里开始,您还可以采取一些步骤来继续您的嵌入式Rust之旅:
在下一篇文章中,我们将深入探讨如何设置Visual Studio Code启动配置和命令行运行器,以便调试应用。完成这些操作后,我们就可以在模板项目的基础上开发更复杂的Rust应用了。
(原文刊登于EDN姊妹网站Embedded,参考链接:Embedded Rust: Adding support for your target microcontroller,由Ricardo Xie编译。)