广告

嵌入式Rust:添加对目标微控制器的支持

2025-02-10 17:51:19 Jacob Beningo 阅读:
在今天的文章中,我们将仔细研究Cortex-M QuickStart模板以及如何添加对您自己的Cortex-M微控制器的支持···

在最近的几篇文章中,我们开始探索嵌入式Rust。您已经看到的Cortex-M QuickStart模板是一个很好的开始。但是,通用模板并不能帮助您深入开发目标开发板上的LED。在今天的文章中,我们将仔细研究Cortex-M QuickStart模板以及如何添加对您自己的Cortex-M微控制器的支持。rb6ednc

配置目标链接器文件memory.x

如果您已经使用嵌入式系统一段时间,那么您可能已经研究过微控制器的链接器文件。链接器文件(通常称为链接器脚本)定义了嵌入式系统的内存布局,指定了在编译的链接阶段如何将代码和数据放置在内存中。rb6ednc

传统上,链接器脚本始终具有扩展名.ld。在Rust中,这一传统更加明显!在我们创建的Cortex-M QuickStart项目中,链接器脚本名为memory.x。默认情况下,它包含入门所需的最基本信息。例如,以下是默认的链接器脚本:rb6ednc

MEMORYrb6ednc

{rb6ednc

  /* NOTE 1 K = 1 KiBi = 1024 bytes */rb6ednc

  /* TODO Adjust these memory regions to match your device memory layout */rb6ednc

  /* These values correspond to the LM3S6965, one of the few devices QEMU can emulate */rb6ednc

  FLASH: ORIGIN = 0x00000000, LENGTH = 256Krb6ednc

  RAM: ORIGIN = 0x20000000, LENGTH = 64Krb6ednc

}rb6ednc

从脚本中可以看出,默认链接器适用于德州仪器LM3S6965。您要执行的第一步是更新特定微控制器的FLASH和RAM部分。rb6ednc

您必须检查微控制器数据表,因为芯片供应商有时会根据自己的需求定制架构。对于任何STM32组件,您都需要将原点更新为0x08000000。闪存长度将根据您使用的特定组件而有很大不同。由于我开始本系列时考虑的是STM32U575,因此我将更新自己的链接器以匹配以下内容:rb6ednc

MEMORYrb6ednc

{rb6ednc

  /* NOTE 1 K = 1 KiBi = 1024 bytes */rb6ednc

  FLASH: ORIGIN = 0x08000000, LENGTH = 2Mrb6ednc

  RAM: ORIGIN = 0x20000000, LENGTH = 768Krb6ednc

}rb6ednc

我是如何得出这些值的?我查看了STM32U575xx的数据表。您可能还需要定义更多的部分,但只是为了让一些简单的功能启动和运行,这些就已经足够了。rb6ednc

为你的Rust环境添加目标支持

为我们的目标设置好链接器脚本后,接下来要做的就是确保Rust支持微控制器架构。可通过两种方式添加对特定架构的支持。rb6ednc

首先,您需要打开.cargo/config.toml文件。通过该文件中的设置,你可以配置“cargo run”的行为方式、你需要的任何其他链接器标志以及构建目标架构!现在,我们先不配置运行器,但您能看到[build]下有几个选项:rb6ednc

[build]rb6ednc

# Pick ONE of these default compilation targetsrb6ednc

# target = "thumbv6m-none-eabi"        # Cortex-M0 and Cortex-M0+rb6ednc

target = "thumbv7m-none-eabi"        # Cortex-M3rb6ednc

# target = "thumbv7em-none-eabi"       # Cortex-M4 and Cortex-M7 (no FPU)rb6ednc

# target = "thumbv7em-none-eabihf"     # Cortex-M4F and Cortex-M7F (with FPU)rb6ednc

# target = "thumbv8m.base-none-eabi"   # Cortex-M23rb6ednc

# target = "thumbv8m.main-none-eabi"   # Cortex-M33 (no FPU)rb6ednc

# target = "thumbv8m.main-none-eabihf" # Cortex-M33 (with FPU)rb6ednc

这些选项会告诉Rust工具链我们要针对哪种目标架构进行交叉编译。默认值为Cortex-M3。STM32U575微控制器是Cortex-M33,因此我的config.toml文件更新如下:rb6ednc

[build]rb6ednc

# Pick ONE of these default compilation targetsrb6ednc

# target = "thumbv6m-none-eabi"        # Cortex-M0 and Cortex-M0+rb6ednc

# target = "thumbv7m-none-eabi"        # Cortex-M3rb6ednc

# target = "thumbv7em-none-eabi"       # Cortex-M4 and Cortex-M7 (no FPU)rb6ednc

# target = "thumbv7em-none-eabihf"     # Cortex-M4F and Cortex-M7F (with FPU)rb6ednc

# target = "thumbv8m.base-none-eabi"   # Cortex-M23rb6ednc

# target = "thumbv8m.main-none-eabi"   # Cortex-M33 (no FPU)rb6ednc

target = "thumbv8m.main-none-eabihf" # Cortex-M33 (with FPU)rb6ednc

如果您使用的是我们自己的开发板,您可以识别微控制器的架构并取消对相应架构的注释。rb6ednc

不幸的是,还有一些事您需要做。您需要执行最后一个简单的步骤,为您的架构添加组件,以便Rust可以在该架构下编译您的代码。您可以在命令行中运行如下命令来完成这项工作:rb6ednc

rustup target add thumbv8m.main-none-eabihfrb6ednc

您可以用您计划使用的任何架构来替换thumbv8m.main-none-eabihf。rb6ednc

完成后,您就可以使用以下命令编译代码了:rb6ednc

cargo buildrb6ednc

当你编译时,会发现得到类似以下的结果:rb6ednc

 rb6ednc

这些Rust包是什么?

如果你仔细检查了Cargo Build的输出,可能会好奇那些正在编译的包是什么。有几种方法可以让你学习和理解它们各自的功能。rb6ednc

首先,可以通过运行以下命令为您的项目构建文档:rb6ednc

cargo doc –openrb6ednc

该命令将为您的项目和应用使用的每个包构建文档。–open随后还会在Web浏览器中打开文档。然后,您可以浏览每个包以查看它是什么以及它的作用。rb6ednc

第二种选择是访问crates.io。Crates.io是Rust编程语言的官方软件包注册表。它的功能与其他编程生态系统中的存储库类似,例如Node.js的npm或Python的PyPI。如果您访问该网站,可以搜索单个软件包。例如,假设我搜索软件包cortex-m,我会看到如下结果:rb6ednc

rb6ednc

我可以看到软件包名称、当前版本和简短的软件包描述。您可以单击cortex-m字样,它会将您带到一个更详细的页面,告诉您如何安装、版本历史,并提供指向文档的链接。rb6ednc

文档将进一步提供有关该软件包的信息,例如其他软件包依赖项、特征、结构、示例用途等等。当您陷入困境,无法弄清Rust代码无法运行的原因时,查看crates.io上的文档将帮助您找到所需的答案。rb6ednc

结论

到目前为止,您已经了解了使用Cortex-M QuickStart模板启动和运行嵌入式Rust是多么容易。我们已经探讨了如何通过添加架构支持和配置链接器脚本来支持特定的微控制器。rb6ednc

从这里开始,您还可以采取一些步骤来继续您的嵌入式Rust之旅:rb6ednc

  • 检查您的开发板文档并更新您的memory.x链接器脚本。
  • 检查您的config.toml文件并设置您的目标架构。
  • 使用rustup添加目标支持,并验证您是否可以构建项目。

在下一篇文章中,我们将深入探讨如何设置Visual Studio Code启动配置和命令行运行器,以便调试应用。完成这些操作后,我们就可以在模板项目的基础上开发更复杂的Rust应用了。rb6ednc

(原文刊登于EDN姊妹网站Embedded,参考链接:Embedded Rust: Adding support for your target microcontroller,由Ricardo Xie编译。)rb6ednc

相关阅读:

嵌入式Rust系列教程rb6ednc

责编:Ricardo
本文为电子技术设计原创文章,未经授权禁止转载。请尊重知识产权,违者本司保留追究责任的权利。
  • 微信扫一扫
    一键转发
  • 最前沿的电子设计资讯
    请关注“电子技术设计微信公众号”
广告
热门推荐
广告
广告
广告
EE直播间
在线研讨会
广告
面包芯语
广告
向右滑动:上一篇 向左滑动:下一篇 我知道了