esp-idf-template
简介
既然我们已经了解了如何生成一个 std
项目,让我们看看生成的项目里有哪些东西,并尝试理解它的各个部分。
检查生成的项目
从 esp-idf-template
创建项目,使用以下配置:
- Which MCU to target? ·
esp32c3
- Configure advanced template options? ·
false
在本节中,我们使用默认配置。如果需要进一步修改,请参阅 additional prompts。
应该会生成类似这样的文件结构:
├── .cargo
│ └── config.toml
├── src
│ └── main.rs
├── .gitignore
├── build.rs
├── Cargo.toml
├── rust-toolchain.toml
└── sdkconfig.defaults
在进一步讨论之前,让我们看看这些文件的用途。
.cargo/config.toml
- Cargo 的配置
- 包含项目的目标
- 包含
runner = "espflash flash --monitor"
- 这意味着你可以用cargo run
来烧写并监视代码 - 包含要使用的链接器,在这里是
ldproxy
- 启用了不稳定的 Cargo 特性
build-std
- 包含
ESP-IDF-VERSION
环境变量,用于告知esp-idf-sys
本项目要使用哪个版本的 ESP-IDF
src/main.rs
- 项目的主要源文件
- 关于它的详细信息,请参阅下面的
main.rs
简介
.gitignore
- 指示
git
要忽略哪些目录和文件
- 指示
build.rs
- 将链接参数传递给
ldproxy
- 将链接参数传递给
Cargo.toml
- Cargo 清单(manifest),通常声明了一些元数据和项目的依赖项
rust-toolchain.toml
- 定义要使用的 Rust 工具链的种类
- 根据目标设备,工具链可以是
nightly
或esp
- 根据目标设备,工具链可以是
- 定义要使用的 Rust 工具链的种类
sdkconfig.defaults
- 包含一些配置,用于覆盖 ESP-IDF 的默认值
main.rs
简介
1 use esp_idf_sys as _; // If using the `binstart` feature of `esp-idf-sys`, always keep this module imported
2
3 fn main() {
4 // It is necessary to call this function once. Otherwise some patches to the runtime
5 // implemented by esp-idf-sys might not link properly. See https://github.com/esp-rs/esp-idf-template/issues/71
6 esp_idf_sys::link_patches();
7 println!("Hello, world!");
8 }
第一行是一个导入语句,定义了 ESP-IDF 的入口点(当根 crate 是定义了 main 函数的二进制 crate 时)。
然后,下面是一个普通的 main 函数,其中有几行代码:
- 调用
esp_idf_sys::link_patches
函数,确保一些用 Rust 实现的 ESP-IDF 补丁能够被链接到最终的可执行文件里。 - 在控制台里打印著名的 “Hello, world!”
运行代码
构建和运行这段代码只需:
cargo run
这会根据配置构建代码,并执行 espflash
将其烧写到板子上。
由于 runner
配置还会将 --monitor
参数传递给 espflash
,屏幕上将显示打印的内容。
确保已经安装了 espflash
,否则此步骤会失败。执行此命令以安装 espflash
:
cargo install espflash
屏幕上应该会显示类似这样的内容:
[2023-04-18T08:05:09Z INFO ] Connecting...
[2023-04-18T08:05:10Z INFO ] Using flash stub
[2023-04-18T08:05:10Z WARN ] Setting baud rate higher than 115,200 can cause issues
Chip type: esp32c3 (revision v0.3)
Crystal frequency: 40MHz
Flash size: 4MB
Features: WiFi, BLE
MAC address: 60:55:f9:c0:39:7c
App/part. size: 478,416/4,128,768 bytes, 11.59%
[00:00:00] [========================================] 13/13 0x0
[00:00:00] [========================================] 1/1 0x8000
[00:00:04] [========================================] 227/227 0x10000
[2023-04-18T08:05:15Z INFO ] Flashing has completed!
Commands:
CTRL+R Reset chip
CTRL+C Exit
...
I (344) cpu_start: Starting scheduler.
Hello, world!
如你所见,这些是第一和第二阶段 bootloader 产生的信息,然后是我们的 “Hello, world!”。
可以按 CTRL+R
重启,或按 CTRL+C
退出。
如果在构建项目时遇到了什么问题,请查看 Troubleshooting 章节。