Rust in Everything
基于 probe-rs 0.32.0

The requested chip 'esp32c3' was not found in the list of known targets.

主线位置:命令主线第一步「注册插件」。probe-rs 的 main 第一行是 probe_rs_espressif::register_plugin();直接用库的程序没有这一行,后面按芯片名查目标、按 USB 枚举探针、按格式名找镜像加载器,都少了 ESP 那一份。插件机制见源码地图,ESP 插件里有什么见 Xtensa 与 ESP 插件。

flowchart TB
  main["probe-rs 命令行 main"] -->|"第一行"| reg["probe_rs_espressif::register_plugin"]
  reg --> t["目标表:12 个 ESP 家族"]
  reg --> v["厂商表:Espressif 序列"]
  reg --> d["驱动表:EspUsbJtag"]
  reg --> f["镜像格式表:idf"]
  lib["自己的工具:只依赖 probe-rs"] -.->|"没调用"| miss["四张表里都没有 ESP"]
  miss --> e1["按名字查:ChipNotFound"]
  miss --> e2["内置 USB-JTAG:列不出探针"]

现象

同一台机器,同一个 0.32.0。命令行:

$ probe-rs chip info esp32s3
esp32s3
Cores (2):
    - cpu0 (Xtensa)
    - cpu1 (Xtensa)
...

只依赖 probe-rs =0.32.0 的实验程序:

== registry.get_target_by_name(esp32c3) -> Err("The requested chip 'esp32c3' was not found in the list of known targets.")
== registry.get_target_by_name(esp32s3) -> Err("The requested chip 'esp32s3' was not found in the list of known targets.")
== registry.get_target_by_name(STM32L475VGTx) -> Ok("STM32L475VGTx")

Probe::attach("esp32c3", ..) 内部也是先建注册表、按名字查(probe.rs:351),得到同一个错误。报错文字是 RegistryError::ChipNotFound 的文档注释,没有任何「你是不是忘了注册插件」的提示:对库来说,它分不清「拼错了」和「插件没注册」。

从哪来

0.32 把 ESP 支持整体搬进 probe-rs-espressif(#3813),注册入口是一个函数(probe-rs-espressif/src/lib.rs:32),它调核心库的 plugin::register_plugin,往四张全局表里各加一样:

表少了它的后果
目标(BUILTIN_TARGETS)任何 ESP 芯片名都是 ChipNotFound:本页的报错
厂商(VENDORS)就算用 --chip-description-path 自己补上目标描述,也没有 ESP 的调试序列(关看门狗、按 ROM 魔数识别型号)
探针驱动(DRIVERS)ESP32-C3 / S3 这类芯片自带的 USB-JTAG 不在任何内置驱动的认领范围里,枚举不到,报的是 No connected probes were found.
镜像格式(LOADERS)没有 idf 格式,ESP 的应用镜像(二级 bootloader、分区表)做不出来

命令行不会遇到,因为 main 第一行就注册了(main.rs:537)。

注册还得赶早

目标表的注册是往全局 Vec 里追加;而 Registry::from_builtin_families 在创建时把全局表克隆一份(registry.rs:184)。所以在注册之前建好的 Registry 永远看不到 ESP:

// 本站示例:顺序决定结果(需要依赖 probe-rs-espressif =0.32.0)
let early = Registry::from_builtin_families();
probe_rs_espressif::register_plugin();
let late = Registry::from_builtin_families();
// early.get_target_by_name("esp32c3") -> ChipNotFound
// late.get_target_by_name("esp32c3")  -> Ok

这段只按源码推断:本机的依赖缓存里没有 probe-rs-espressif,没有编译运行。Probe::attach 每次调用都新建注册表,不受这个问题影响;自己持有一个长期 Registry 的工具(比如 GUI、服务端)要注意。另外 register_plugin 没有防重入,调两次会在表里留下两份同样的条目;按名字查时两个都是精确匹配,选中后一个,不报错。

怎么办

  • 库用户:依赖 probe-rs-espressif(版本与 probe-rs 一致),在程序启动的第一时间调 probe_rs_espressif::register_plugin(),早于任何 Registry、Lister 的使用。Linux 上要用 GPIO / SPI 直接驱动 SWD 的,同样调 probe_rs_linux::register_plugin()。
  • 不需要 ESP 的工具不必加这个依赖:这正是拆成插件的好处(设计取舍)。
  • 报 ChipNotFound 时先用命令行 probe-rs chip info <名字> 对照:命令行认得而库不认得,几乎就是插件没注册。

小结

  • 0.32 起 ESP 的目标、序列、USB-JTAG 驱动、IDF 镜像格式都在 probe-rs-espressif 插件里,命令行在 main 第一行注册,库用户要自己注册。
  • 不注册时按名字查 ESP 芯片得到 ChipNotFound,报错里不提插件;内置 USB-JTAG 也枚举不到。
  • Registry 在创建时克隆全局表,注册必须早于建注册表。

💬 关联讨论

发起讨论
加载中...