LED轮盘

好的,让我们从构建以下应用程序开始:

我将为您提供一个高级API来实现这个应用程序,但不要担心我们稍后会做一些低级的事情。本章的主要目标是熟悉闪烁和调试过程。

入门代码位于directory存储库src的目录中。在该目录中,还有更多以本书每一章命名的目录。这些目录中的大多数都是启动Cargo项目。

现在,跳转到src/05-led-roulette目录。检查src/main.rs文件:

#![deny(unsafe_code)]
#![no_main]
#![no_std]

use cortex_m_rt::entry;
use panic_halt as _;
use microbit as _;

#[entry]
fn main() -> ! {
    let _y;
    let x = 42;
    _y = x;

    // infinite loop; just so we don't leave this stack frame
    loop {}
}

微控制器程序在两个方面不同于标准程序:#![no_std]#![no_main]

no_std属性表示该程序不会使用std假定底层操作系统的crate;该程序将改为使用core crate,它 的一个子集std可以在裸机系统上运行(即,没有OS抽象的系统,如文件和套接字)。

no_main属性表示该程序不会使用标准main接口,该接口是为接收参数的命令行应用程序量身定制的。 main我们将使用crate中的entry属性cortex-m-rtcrate来定义自定义入口点,而不是标准。在这个程 序中,我们将入口点命名为"main",但也可以使用任何其他名称。入口点函数必须有签名fn() -> !;这种类型表示 函数不能返回--这意味着程序永远不会终止。

如果你是一个细心的观察者,你也会注意到Cargo项目中有一个.cargo目录。该目录包含一个Cargo配置文件 (.cargo/config),它调整链接过程以根据目标设备的要求调整程序的内存布局。这个修改后的链接过 程是cortex-m-rtcrate的要求。

此外,还有一个Embed.toml文件

[default.general]
# chip = "nrf52833_xxAA" # uncomment this line for micro:bit V2
# chip = "nrf51822_xxAA" # uncomment this line for micro:bit V1

[default.reset]
halt_afterwards = true

[default.rtt]
enabled = false

[default.gdb]
enabled = true

该文件提供cargo-embed

  • 我们正在使用nrf52833或nrf51822,您将再次必须从正在使用的芯片中删除注释,就像您在第3章中所做的那样。
  • 我们希望在闪存之后停止芯片,这样我们的程序就不会立即跳转到循环
  • 我们想禁用RTT,RTT是一种允许芯片向调试器发送文本的协议。您实际上已经看到了RTT的实际应用,它是在第3章中发送"Hello World"的协议。
  • 我们要启用GDB,这将是调试过程所必需的

好的,让我们从构建这个程序开始。