项目设置

首先,我们将通过运行来创建一个新的 cargo 项目:

我们需要为 avr 目标(目标三元组:avr-unknown-unknown)交叉编译我们的项目。为此,我们需要切换到 nightly 工具链,因为一些依赖包使用不稳定的功能来实现所有这些。所以我们将运行:

https://embed.notionlytics.com/wt/ZXlKd1lXZGxTV1FpT2lJNFlUZ3lZak13TVdRMlpUTTBOR014WWprMlpUSmpOamt3TUdZeE9EWXdPU0lzSW5kdmNtdHpjR0ZqWlZSeVlXTnJaWEpKWkNJNklsZHNTR2hsVEZSUFdXeHpaVmRhUW1ZNU1YQmxJbjA9

上面的命令覆盖了选择的工具链,只有我们当前的目录是 nightly。

然后我们将安装所需的软件包:

需要 avr-gcc 包才能使用链接器。

arduino-avr-core 包包含实用程序,例如 avrdude,它是一种使用系统内编程技术上传和操作微控制器的 ROM 和 EEPROM 内容的工具。

我在 arch linux 发行版(努力操作系统)上,其中 pacman 是我们的包管理器。

编写代码

抛开依赖,让我们在 main.rs 下添加代码并逐步进行:

(快速提示:您可以在您的目录中运行 cargo doc --open 并拥有该项目的文档及其依赖项以供参考)

首先我们需要指定一些全局属性,让编译器知道我们在不同的环境中。 我们处于一个嵌入式环境中,它没有 Rust 的标准库 crate 所依赖的功能,例如堆分配 API、线程、网络 API 等。所以我们需要在顶部添加 #[no_std] 属性。 我们还需要使用 #[no_main] 覆盖默认入口点 (fn main()),因为我们将提供和定义我们自己的程序入口点。 为了定义我们的入口点,我们将使用来自 arduino_uno crate 的入口属性宏来定义一个自定义入口点。 通常,您使用的板子的 crate 会为您提供一个入口宏。

源代码