JLink驱动读取ESP32-S3芯片ID和MAC地址方法

AI助手已提取文章相关产品:

如何用 JLink 从 ESP32-S3 读出 Chip ID 和 MAC 地址?这招太硬核了 💥

你有没有遇到过这样的情况:产线上一批模块烧录失败,串口没引出来, esptool.py 根本连不上;或者设备死机了,但你还得知道它是哪一块板子、是不是重复烧录的“克隆货”?

这时候,别再盯着 UART 接口干瞪眼了。我们换个思路—— 直接上 JTAG,通过 JLink 调试器,穿透芯片物理层,把 Chip ID 和 MAC 地址“抠”出来!

是的,哪怕芯片是空的、固件跑不起来、Bootloader 挂了,只要硬件通电、JTAG 引脚可用,我们就能拿到这些关键身份信息。😎

这不是玄学,而是基于 eFuse + JTAG + OpenOCD 的真实技术组合拳。今天我就带你一步步拆解这个“无损读取”的全流程,让你在调试和量产中多一张王牌。


为什么选 JLink?串口不行吗?

说实话,大多数开发者第一反应都是 esptool.py read_mac ——简单粗暴,确实好用。但它有几个致命弱点:

  • 依赖串口通信 :如果硬件设计时没引出 RX/TX,或者串口被占用/损坏,你就彻底抓瞎;
  • 需要芯片能启动 :必须进入下载模式(Download Mode),一旦 Secure Boot 锁死或 Flash 损坏,命令直接失效;
  • 速度慢、易超时 :尤其在自动化测试场景下,每台设备等几秒响应,效率直线下降。

而 JLink 呢?它走的是 JTAG/SWD 调试通道 ,本质上是一个硬件级的“后门”。只要芯片还没物理损坏,哪怕程序卡死,只要你能让 CPU 进入调试状态,就可以暂停运行、访问内存、读写寄存器。

更狠的是:
👉 不需要任何固件支持
👉 绕过整个软件栈
👉 直接操作 eFuse 控制器

换句话说,这是对芯片的一次“裸体扫描”——你想看啥就看啥,没人拦得住。


ESP32-S3 的身份数据藏在哪?

先搞清楚一件事:Chip ID 和 MAC 地址不是随机生成的,它们出厂时就被烧进 eFuse(电子熔丝) 里了,属于一次性编程区域,只能读不能改。

Chip ID:真正的“DNA”

ESP32-S3 的 Chip ID 是一个 64位唯一标识符 ,存储在 eFuse BLOCK0 的 USR_DATA0 USR_DATA1 字段中。这个值由晶圆厂写入,全球几乎不可能重复,冲突概率低于 $2^{-64}$,比你中彩票还低 😅。

你可以把它理解为芯片的“身份证号”,比软件生成的 UUID 可信一万倍。

MAC 地址:Wi-Fi 和蓝牙的身份凭证

MAC 地址则是 48 位(6字节),同样固化在 eFuse 中,位于 EFUSE_BLK_MAC 区域(通常是 BLOCK1)。每个芯片都有两个默认 MAC:

  • Station MAC :用于 Wi-Fi 客户端连接
  • SoftAP MAC :热点模式使用,等于 Station MAC + 1
  • 如果启用了蓝牙,还会有一个 BLE MAC(Station MAC + 2)

这些地址也都是出厂预设,除非你主动修改 NVS 配置,否则永远不变。

⚠️ 注意:如果你启用了 DIS_DOWNLOAD_MANUAL_ENCRYPT 或者设置了 JTAG_DISABLE 这类 eFuse 位,那不好意思,JTAG 就被永久禁用了。所以我们在产品设计阶段就得权衡安全性和可维护性。


怎么动手?硬件准备第一步 🔧

别急着敲代码,先把硬件搭好。

你需要:

  • 一块带 JTAG 接口的 ESP32-S3 模块(比如 ESP32-S3-DevKitC)
  • 一个 SEGGER J-Link 调试器(推荐 J-Link PRO 或 EDU Mini)
  • 杜邦线若干
  • 稳定的 3.3V 电源(建议用 LDO 供电,避免开关噪声干扰)

关键引脚怎么接?

J-Link 引脚 ESP32-S3 引脚 功能说明
JTCK MTCK JTAG 时钟
JTMS MTDI 模式选择
JTDI MTMS 数据输入
JTDO MTDO 数据输出
GND GND 公共地线
VREF(可选) 3.3V 提供参考电压

📌 特别提醒:
- ESP32-S3 的 JTAG 引脚复用了 GPIO10~13,默认功能是 SPI Flash 控制信号,所以在启用 JTAG 前要确保没有其他外设争抢。
- 推荐在 TMS 和 TCK 上加上 10kΩ 上拉电阻,防止浮空导致误触发。
- 供电一定要稳!电压波动超过 ±5% 可能导致 JTAG 同步失败。

接完之后,可以用万用表测一下短路和压降,确认没问题再上电。


软件环境搭建:OpenOCD 是核心枢纽 🧩

光有硬件还不够,我们需要一个中间代理来翻译指令——这就是 OpenOCD(Open On-Chip Debugger)

它就像个“协议网关”,一边连着 J-Link 驱动,另一边连着目标芯片,还能对外提供 GDB Server 接口,让我们远程控制 CPU。

安装要点

# 下载 Espressif 维护的 OpenOCD 分支(支持 ESP32-S3)
git clone https://github.com/espressif/openocd-esp32.git
cd openocd-esp32
./bootstrap
./configure --enable-jlink
make -j$(nproc)
sudo make install

为什么要用 Espressif 的 fork?因为官方 OpenOCD 还没完全支持 ESP32-S3 的特殊命令(比如 dump_efuse_blocks ),必须打补丁才行。

安装完成后验证一下:

openocd --version
# 输出应包含 "EspCommand" 支持字样

同时确保你的 J-Link 驱动是最新的(V7.80+),老版本可能识别不了 ESP32-S3 的 JTAG ID。


实战一:用 Tcl 脚本读取 Chip ID 🛠️

现在开始真正干活。

我们要做的,是让 OpenOCD 初始化 J-Link,连接到 ESP32-S3,然后下发命令读取 eFuse 数据块。

配置文件: esp32s3-jlink.cfg

# 使用 J-Link 作为调试适配器
interface jlink

# 启用 JTAG 模式(4线)
transport select jtag

# 设置目标芯片型号
set CHIP_NAME esp32s3

# 加载 ESP32-S3 的 target 定义(含内存映射、复位逻辑等)
source [find target/esp32s3.cfg]

# 设置 JTAG 时钟频率(太高不稳定,建议 400kHz~1MHz)
adapter speed 1000

保存为 esp32s3-jlink.cfg ,这就是我们的“调试蓝图”。

执行读取命令

打开终端,运行:

openocd -f esp32s3-jlink.cfg \
        -c "init" \
        -c "halt" \
        -c "esp32s3 dump_efuse_blocks" \
        -c "shutdown"

解释一下这几个命令:

  • init :初始化所有适配器和目标设备
  • halt :强制暂停 CPU 执行,进入调试模式
  • esp32s3 dump_efuse_blocks :Espressif 特有的命令,打印所有 eFuse 块内容
  • shutdown :执行完毕退出

如果一切正常,你会看到类似输出:

...
== BLOCK0 (ROM_VER)(11) ==
  ...
== BLOCK0 (USR_DATA)(4) ==
  USR_DATA0: 0x1a2b3c4d
  USR_DATA1: 0x5e6f7081
...

其中 USR_DATA0 USR_DATA1 拼起来就是你的 Chip ID!

格式化一下:

Chip ID = 5E6F70811A2B3C4D

注意这里是小端序存储,高位在后,低位在前,拼接时要反过来。


实战二:Python 自动化提取 Chip ID 🐍

手动看日志太麻烦?咱们写个脚本来自动解析。

import subprocess
import re
import sys

def read_chip_id():
    cmd = [
        "openocd",
        "-f", "esp32s3-jlink.cfg",
        "-c", "init",
        "-c", "halt",
        "-c", "esp32s3 dump_efuse_blocks",
        "-c", "shutdown"
    ]

    try:
        result = subprocess.run(cmd, capture_output=True, text=True, timeout=15)
        output = result.stdout + result.stderr

        # 正则匹配 USR_DATA0 和 USR_DATA1
        pattern = r"USR_DATA0:\s+0x([0-9a-fA-F]+)\s+USR_DATA1:\s+0x([0-9a-fA-F]+)"
        match = re.search(pattern, output)

        if match:
            low_32 = match.group(1).zfill(8)  # 低32位
            high_32 = match.group(2).zfill(8) # 高32位
            chip_id = (high_32 + low_32).upper()
            print(f"✅ 成功读取 Chip ID: {chip_id}")
            return chip_id
        else:
            print("❌ 未找到 Chip ID,请检查连接或 eFuse 是否已读取")
            return None

    except subprocess.TimeoutExpired:
        print("❌ OpenOCD 超时!请检查 J-Link 连接或供电稳定性")
        return None
    except FileNotFoundError:
        print("❌ 找不到 openocd,请确认已安装并加入 PATH")
        return None
    except Exception as e:
        print(f"❌ 意外错误: {type(e).__name__}: {e}")
        return None

if __name__ == "__main__":
    chip_id = read_chip_id()
    if chip_id:
        sys.exit(0)
    else:
        sys.exit(1)

把这个脚本丢进自动化测试平台,配合多线程或队列管理,轻松实现“一键扫十板”。

💡 小技巧:可以在 CI/CD 流水线中加入这一步,每次烧录前先校验 Chip ID 是否重复,防止产线混料。


再进一步:直接读 MAC 地址 📡

除了 Chip ID,我们还能从 eFuse 里挖出 MAC 地址。

虽然 esptool.py 也能读 MAC,但那是通过 ROM 函数调用实现的,依赖芯片能正常响应命令。而我们现在要玩点更底层的—— 直接读 eFuse 寄存器

关键寄存器地址

根据《ESP32-S3 技术参考手册》,MAC 地址分布在以下三个寄存器中:

寄存器 地址 描述
EFUSE_RD_MAC_SPI_SYS_0 0x600070B0 字节 0~3
EFUSE_RD_MAC_SPI_SYS_1 0x600070B4 字节 4~5
EFUSE_RD_MAC_SPI_SYS_2 0x600070B8 保留

注意:这些是只读寄存器,反映的是当前 eFuse 的实际内容。

编写 Tcl 脚本读取 MAC

新建一个 read_mac.tcl

echo "=== 开始读取 ESP32-S3 MAC 地址 ==="

# 停止 CPU
halt

# 从 eFuse 寄存器读取原始数据
set val0 [mem2array _data 32 0x600070B0 1]  ;# 读取第一个寄存器
set val1 [mem2array _data 32 0x600070B4 1]  ;# 第二个
# val2 不用于 MAC,跳过

# 解析字节(小端序)
set b0 [expr ($_data(0) >>  0) & 0xFF]
set b1 [expr ($_data(0) >>  8) & 0xFF]
set b2 [expr ($_data(0) >> 16) & 0xFF]
set b3 [expr ($_data(0) >> 24) & 0xFF]
set b4 [expr ($_data(1) >>  0) & 0xFF]
set b5 [expr ($_data(1) >>  8) & 0xFF]

# 格式化输出
echo "📍 Wi-Fi MAC 地址: [format %02X:%02X:%02X:%02X:%02X:%02X $b0 $b1 $b2 $b3 $b4 $b5]"

运行方式:

openocd -f esp32s3-jlink.cfg -f read_mac.tcl

输出示例:

📍 Wi-Fi MAC 地址: 5C:F1:AB:23:45:67

完美!而且全程无需任何固件参与。


生产级优化:批量处理与防重码机制 🏭

当你把这个方案搬到产线,问题就变了:不是“能不能读”,而是“怎么读得快、准、稳”。

多 J-Link 并行控制

一台 J-Link 对应一条产线?太奢侈了。我们可以用 Python 多进程 + USB 设备编号区分多个 J-Link:

from multiprocessing import Pool
import os

def worker(device_id):
    os.environ['JLINK_DEVICE'] = f'ESP32-S3_{device_id}'
    print(f"[工位{device_id}] 开始检测...")
    chip_id = read_chip_id()  # 调用前面定义的函数
    return device_id, chip_id

if __name__ == '__main__':
    with Pool(4) as p:  # 同时检测4块板子
        results = p.map(worker, [1,2,3,4])

    for dev, cid in results:
        print(f"工位 {dev} -> {cid or 'FAIL'}")

当然,前提是你得有多个 J-Link,并且系统能正确识别各自的 USB 序列号。

防重码数据库校验

最怕什么?同一 Chip ID 被反复烧录。所以我们可以在读取后立即查数据库:

import sqlite3

def is_duplicate(chip_id):
    conn = sqlite3.connect('devices.db')
    c = conn.cursor()
    c.execute("SELECT COUNT(*) FROM devices WHERE chip_id=?", (chip_id,))
    count = c.fetchone()[0]
    conn.close()
    return count > 0

def register_device(chip_id, mac):
    if is_duplicate(chip_id):
        print("🚨 检测到重复 Chip ID!可能存在克隆风险")
        return False

    # 记录到数据库
    conn = sqlite3.connect('devices.db')
    c = conn.cursor()
    c.execute("INSERT INTO devices (chip_id, mac, timestamp) VALUES (?, ?, datetime('now'))",
              (chip_id, mac))
    conn.commit()
    conn.close()
    print("📦 新设备注册成功")
    return True

这样,哪怕有人拿旧板子冒充新品,系统也能立刻报警。


常见坑点与解决方案 🚧

别以为这条路一帆风顺,实战中踩过的坑比代码还多。

❌ 问题1:OpenOCD 提示 “Cannot connect to target”

常见原因:

  • 供电不足(<3.0V)
  • JTAG 引脚接触不良
  • 复位电路异常导致芯片不断重启

✅ 解决方案:

  • 用示波器看 MTCK 波形是否稳定
  • 检查是否有外部复位信号干扰
  • 尝试降低 JTAG 时钟到 200kHz 观察是否恢复

❌ 问题2:eFuse 数据全为 0

这说明要么芯片没激活 eFuse 控制器,要么已经被加密锁死。

✅ 检查项:

  • 是否启用了 JTAG_DISABLE eFuse?
  • 是否开启了 Flash Encryption 且未配置调试权限?
  • 使用 efuse_summary 命令查看保护状态:
-c "init" -c "halt" -c "esp32s3 efuse_summary"

如果看到 JTAG disabled permanently ,那就真的没救了……

❌ 问题3:读出来的 MAC 和 esptool 不一致

有可能你在固件中调用了 esp_base_mac_addr_set() 修改了默认 MAC,但这只是临时覆盖。eFuse 里的原始值始终不变。

所以你要明确:你是想读“出厂原始 MAC”还是“当前生效 MAC”?

前者走 eFuse,后者还得靠 ROM API。


安全 vs. 可维护:如何平衡?

最后聊聊一个很现实的问题: 要不要在正式产品中关闭 JTAG?

很多公司为了防逆向、防篡改,会直接烧断 JTAG_DISABLE 位,一劳永逸。

但代价也很明显:售后维修时无法在线调试,故障定位困难,升级失败也无法恢复。

我的建议是: 采用动态控制策略

比如:

  • 开发阶段:保留 JTAG 开放
  • 出厂测试:使用 JTAG 快速读 ID、烧参数
  • 发布模式:通过软件开关关闭 JTAG(如设置 RTC_CNTL_DBG_SWD_DISABLE 寄存器)
  • 特殊模式:长按按键进入“工程模式”,重新开启调试接口

这样既保证了安全性,又不失可维护性,堪称“鱼与熊掌兼得”。


写在最后:这才是嵌入式工程师的硬功夫 💪

你看,我们今天做的事,本质上是一次“越狱式访问”——绕过操作系统、绕过应用层、甚至绕过安全机制,直达芯片最底层的数据源。

这不是炫技,而是一种能力储备。

当别人还在为“串口不通怎么办”焦头烂额时,你已经默默插上 JLink,三秒读出 Chip ID,潇洒转身。

这才是嵌入式开发的魅力所在: 你知道系统的每一层是怎么工作的,也知道在哪一层可以“撬开锁”。

下次遇到类似问题,不妨想想:

“我能从更底层的地方拿到答案吗?”

也许,答案就在 eFuse 里,静静等着你去发现。 🔍

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

您可能感兴趣的与本文相关内容

Resolving esp32s3 dependencies... Already up-to-date. Updating metadata for the vscode IDE... UserSideException: Processing esp32s3 (platform: espressif32 @ ~6.9.0; board: esp32-s3-devkitc-1; framework: espidf) -------------------------------------------------------------------------------- Verbose mode can be enabled via `-v, --verbose` option CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32-s3-devkitc-1.html PLATFORM: Espressif 32 (6.9.0) > Espressif ESP32-S3-DevKitC-1-N8 (8 MB QD, No PSRAM) HARDWARE: ESP32S3 240MHz, 320KB RAM, 8MB Flash DEBUG: Current (esp-builtin) On-board (esp-builtin) External (cmsis-dap, esp-bridge, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa) PACKAGES: - framework-espidf @ 3.50301.0 (5.3.1) - tool-cmake @ 3.16.4 - tool-esptoolpy @ 1.40501.0 (4.5.1) - tool-idf @ 1.0.1 - tool-mconf @ 1.4060000.20190628 (406.0.0) - tool-ninja @ 1.9.0 - tool-riscv32-esp-elf-gdb @ 11.2.0+20220823 - tool-xtensa-esp-elf-gdb @ 11.2.0+20230208 - toolchain-esp32ulp @ 1.23800.240113 (2.38.0) - toolchain-riscv32-esp @ 13.2.0+20240530 - toolchain-xtensa-esp-elf @ 13.2.0+20240530 Reading CMake configuration... -- Found Git: C:/Program Files/Git/cmd/git.exe (found version "2.51.0.windows.1") -- git rev-parse returned &#39;fatal: not a git repository (or any of the parent directories): .git&#39; -- The C compiler identification is GNU 13.2.0 -- The CXX compiler identification is GNU 13.2.0 -- The ASM compiler identification is GNU -- Found assembler: C:/Users/Administrator/.platformio/packages/toolchain-xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc.exe -- Check for working C compiler: C:/Users/Administrator/.platformio/packages/toolchain-xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc.exe -- Check for working C compiler: C:/Users/Administrator/.platformio/packages/toolchain-xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc.exe -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: C:/Users/Administrator/.platformio/packages/toolchain-xtensa-esp-elf/bin/xtensa-esp32s3-elf-g++.exe -- Check for working CXX compiler: C:/Users/Administrator/.platformio/packages/toolchain-xtensa-esp-elf/bin/xtensa-esp32s3-elf-g++.exe -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring incomplete, errors occurred! See also "E:/esp32/esp32_spi_slave(more_slave)1/.pio/build/esp32s3/CMakeFiles/CMakeOutput.log". fatal: not a git repository (or any of the parent directories): .git CMake Error at C:/Users/Administrator/.platformio/packages/framework-espidf/tools/cmake/project.cmake:677 (if): if given arguments: "(" "STREQUAL" "VERSION" mismatched parenthesis in condition Call Stack (most recent call first): CMakeLists.txt:3 (project) ========================= [FAILED] Took 11.48 seconds =========================
11-11
Processing esp32s3 (platform: espressif32 @ ~6.9.0; board: esp32-s3-devkitc-1; framework: arduino) ----------------------------------------------------------------------------------------------------------------------------------------------------------------- Verbose mode can be enabled via `-v, --verbose` option CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32-s3-devkitc-1.html PLATFORM: Espressif 32 (6.9.0) > Espressif ESP32-S3-DevKitC-1-N8 (8 MB QD, No PSRAM) HARDWARE: ESP32S3 240MHz, 320KB RAM, 8MB Flash DEBUG: Current (esp-builtin) On-board (esp-builtin) External (cmsis-dap, esp-bridge, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa) PACKAGES: - framework-arduinoespressif32 @ 3.20017.241212+sha.dcc1105b - tool-esptoolpy @ 1.40501.0 (4.5.1) - toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 - toolchain-xtensa-esp32s3 @ 8.4.0+2021r2-patch5 LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf LDF Modes: Finder ~ chain, Compatibility ~ soft Found 38 compatible libraries Scanning dependencies... Dependency Graph |-- SPI @ 2.0.0 |-- ArduinoJson @ 6.21.5 |-- Adafruit BusIO @ 1.16.1 |-- Adafruit GFX Library @ 1.11.11 |-- ESP32SPISlave @ 0.6.3 |-- WiFi @ 2.0.0 |-- ESP32 BLE Arduino @ 2.0.0 |-- HTTPClient @ 2.0.0 |-- WebServer @ 2.0.0 Building in release mode Compiling .pio\build\esp32s3\src\BLEClient.cpp.o Compiling .pio\build\esp32s3\src\esp_uart_driver.cpp.o Compiling .pio\build\esp32s3\src\main.cpp.o Compiling .pio\build\esp32s3\src\network.cpp.o Compiling .pio\build\esp32s3\src\network_app.cpp.o Compiling .pio\build\esp32s3\src\network_tcp_client.cpp.o Compiling .pio\build\esp32s3\src\network_tcp_server.cpp.o Compiling .pio\build\esp32s3\src\spi_slave_server.cpp.o Compiling .pio\build\esp32s3\src\tcp_server.cpp.o Compiling .pio\build\esp32s3\src\uart_msg_analy.cpp.o Building .pio\build\esp32s3\bootloader.bin Generating partitions .pio\build\esp32s3\partitions.bin esptool.py v4.5.1 Creating esp32s3 image... Merged 1 ELF section Successfully created esp32s3 image. Compiling .pio\build\esp32s3\lib050\SPI\SPI.cpp.o Compiling .pio\build\esp32s3\lib819\Wire\Wire.cpp.o Compiling .pio\build\esp32s3\lib9ee\Adafruit BusIO\Adafruit_BusIO_Register.cpp.o Compiling .pio\build\esp32s3\lib9ee\Adafruit BusIO\Adafruit_I2CDevice.cpp.o src/uart_msg_analy.cpp: In function &#39;void uart0_msg_analy(uint8_t*, uint16_t)&#39;: src/uart_msg_analy.cpp:37:84: warning: ISO C++ forbids converting a string constant to &#39;char*&#39; [-Wwrite-strings] printf_log_hex("uart0_rx_buf:",(uint8_t *)uart0_rx_buf,uart0_rx_buf_cnt); ^ Compiling .pio\build\esp32s3\lib9ee\Adafruit BusIO\Adafruit_SPIDevice.cpp.o Compiling .pio\build\esp32s3\liba40\Adafruit GFX Library\Adafruit_GFX.cpp.o Compiling .pio\build\esp32s3\liba40\Adafruit GFX Library\Adafruit_GrayOLED.cpp.o Compiling .pio\build\esp32s3\liba40\Adafruit GFX Library\Adafruit_SPITFT.cpp.o Compiling .pio\build\esp32s3\liba40\Adafruit GFX Library\glcdfont.c.o Archiving .pio\build\esp32s3\lib050\libSPI.a src/network_tcp_server.cpp: In member function &#39;uint16_t Network_TCP_Server::client_process(WiFiClient*&)&#39;: src/network_tcp_server.cpp:121:69: warning: ISO C++ forbids converting a string constant to &#39;char*&#39; [-Wwrite-strings] printf_log_hex("client rev:", data_char, datalen); // 说明接收到的数据 ^ Compiling .pio\build\esp32s3\libe4a\WiFi\WiFi.cpp.o Archiving .pio\build\esp32s3\lib819\libWire.a Compiling .pio\build\esp32s3\libe4a\WiFi\WiFiAP.cpp.o Compiling .pio\build\esp32s3\libe4a\WiFi\WiFiClient.cpp.o Compiling .pio\build\esp32s3\libe4a\WiFi\WiFiGeneric.cpp.o Compiling .pio\build\esp32s3\libe4a\WiFi\WiFiMulti.cpp.o Compiling .pio\build\esp32s3\libe4a\WiFi\WiFiSTA.cpp.o Compiling .pio\build\esp32s3\libe4a\WiFi\WiFiScan.cpp.o Compiling .pio\build\esp32s3\libe4a\WiFi\WiFiServer.cpp.o Archiving .pio\build\esp32s3\lib9ee\libAdafruit BusIO.a Compiling .pio\build\esp32s3\libe4a\WiFi\WiFiUdp.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLE2902.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLE2904.cpp.o Archiving .pio\build\esp32s3\liba40\libAdafruit GFX Library.a Compiling .pio\build\esp32s3\lib57f\BLE\BLEAddress.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEAdvertisedDevice.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEAdvertising.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEBeacon.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLECharacteristic.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLECharacteristicMap.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEClient.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEDescriptor.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEDescriptorMap.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEDevice.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEEddystoneTLM.cpp.o Archiving .pio\build\esp32s3\libe4a\libWiFi.a Compiling .pio\build\esp32s3\lib57f\BLE\BLEEddystoneURL.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEExceptions.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEHIDDevice.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLERemoteCharacteristic.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLERemoteDescriptor.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLERemoteService.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEScan.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLESecurity.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEServer.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEService.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEServiceMap.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEUUID.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEUtils.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\BLEValue.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\FreeRTOS.cpp.o Compiling .pio\build\esp32s3\lib57f\BLE\GeneralUtils.cpp.o Compiling .pio\build\esp32s3\lib3f1\WiFiClientSecure\WiFiClientSecure.cpp.o Compiling .pio\build\esp32s3\lib3f1\WiFiClientSecure\esp_crt_bundle.c.o Compiling .pio\build\esp32s3\lib3f1\WiFiClientSecure\ssl_client.cpp.o Compiling .pio\build\esp32s3\libd37\HTTPClient\HTTPClient.cpp.o Compiling .pio\build\esp32s3\lib33c\FS\FS.cpp.o Compiling .pio\build\esp32s3\lib33c\FS\vfs_api.cpp.o Compiling .pio\build\esp32s3\lib72e\WebServer\Parsing.cpp.o Compiling .pio\build\esp32s3\lib72e\WebServer\WebServer.cpp.o Compiling .pio\build\esp32s3\lib72e\WebServer\detail\mimetable.cpp.o Compiling .pio\build\esp32s3\FrameworkArduino\Esp.cpp.o Compiling .pio\build\esp32s3\FrameworkArduino\FirmwareMSC.cpp.o Compiling .pio\build\esp32s3\FrameworkArduino\FunctionalInterrupt.cpp.o Compiling .pio\build\esp32s3\FrameworkArduino\HWCDC.cpp.o Archiving .pio\build\esp32s3\lib57f\libBLE.a Compiling .pio\build\esp32s3\FrameworkArduino\HardwareSerial.cpp.o Compiling .pio\build\esp32s3\FrameworkArduino\IPAddress.cpp.o Compiling .pio\build\esp32s3\FrameworkArduino\IPv6Address.cpp.o Compiling .pio\build\esp32s3\FrameworkArduino\MD5Builder.cpp.o Archiving .pio\build\esp32s3\lib3f1\libWiFiClientSecure.a Compiling .pio\build\esp32s3\FrameworkArduino\Print.cpp.o Compiling .pio\build\esp32s3\FrameworkArduino\Stream.cpp.o Archiving .pio\build\esp32s3\lib33c\libFS.a Compiling .pio\build\esp32s3\FrameworkArduino\StreamString.cpp.o Compiling .pio\build\esp32s3\FrameworkArduino\Tone.cpp.o Compiling .pio\build\esp32s3\FrameworkArduino\USB.cpp.o Archiving .pio\build\esp32s3\libd37\libHTTPClient.a Compiling .pio\build\esp32s3\FrameworkArduino\USBCDC.cpp.o Compiling .pio\build\esp32s3\FrameworkArduino\USBMSC.cpp.o Archiving .pio\build\esp32s3\lib72e\libWebServer.a Compiling .pio\build\esp32s3\FrameworkArduino\WMath.cpp.o Compiling .pio\build\esp32s3\FrameworkArduino\WString.cpp.o Compiling .pio\build\esp32s3\FrameworkArduino\base64.cpp.o Compiling .pio\build\esp32s3\FrameworkArduino\cbuf.cpp.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-adc.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-bt.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-cpu.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-dac.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-gpio.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-i2c-slave.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-i2c.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-ledc.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-matrix.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-misc.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-psram.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-rgb-led.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-rmt.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-sigmadelta.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-spi.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-time.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-timer.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-tinyusb.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-touch.c.o Compiling .pio\build\esp32s3\FrameworkArduino\esp32-hal-uart.c.o Compiling .pio\build\esp32s3\FrameworkArduino\firmware_msc_fat.c.o Compiling .pio\build\esp32s3\FrameworkArduino\libb64\cdecode.c.o Compiling .pio\build\esp32s3\FrameworkArduino\libb64\cencode.c.o Compiling .pio\build\esp32s3\FrameworkArduino\main.cpp.o Compiling .pio\build\esp32s3\FrameworkArduino\stdlib_noniso.c.o Compiling .pio\build\esp32s3\FrameworkArduino\wiring_pulse.c.o Compiling .pio\build\esp32s3\FrameworkArduino\wiring_shift.c.o Archiving .pio\build\esp32s3\libFrameworkArduino.a Linking .pio\build\esp32s3\firmware.elf Retrieving maximum program size .pio\build\esp32s3\firmware.elf Checking size .pio\build\esp32s3\firmware.elf Advanced Memory Usage is available via "PlatformIO Home > Project Inspect" RAM: [== ] 18.3% (used 59980 bytes from 327680 bytes) Flash: [=== ] 27.6% (used 921981 bytes from 3342336 bytes) Building .pio\build\esp32s3\firmware.bin esptool.py v4.5.1 Creating esp32s3 image... Merged 2 ELF sections Successfully created esp32s3 image. 仍然没有成功生成sdkconfig.h
11-07
Resolving esp32-s3-devkitc-1 dependencies... Removing unused dependencies... Library Manager: Installing git+https://github.com/micro-ROS/micro_ros_platformio.git git version 2.48.1.windows.1 Cloning into &#39;C:\Users\dengh\.platformio\.cache\tmp\pkg-installing-fuww_6od&#39;... Library Manager: micro_ros_platformio@0.0.1+sha.cfee17f has been installed! Updating metadata for the vscode IDE... UserSideException: Processing esp32-s3-devkitc-1 (platform: espressif32; board: esp32-s3-devkitc-1; framework: espidf) -------------------------------------------------------------------------------- Verbose mode can be enabled via `-v, --verbose` option CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32-s3-devkitc-1.html PLATFORM: Espressif 32 (6.12.0) > Espressif ESP32-S3-DevKitC-1-N8 (8 MB QD, No PSRAM) HARDWARE: ESP32S3 240MHz, 320KB RAM, 8MB Flash DEBUG: Current (esp-builtin) On-board (esp-builtin) External (cmsis-dap, esp-bridge, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa) PACKAGES: - framework-espidf @ 3.50500.0 (5.5.0) - tool-cmake @ 3.30.2 - tool-esp-rom-elfs @ 0.0.1+20241011 - tool-esptoolpy @ 2.40900.250804 (4.9.0) - tool-idf @ 1.0.1 - tool-mconf @ 1.4060000.20190628 (406.0.0) - tool-ninja @ 1.9.0 - tool-riscv32-esp-elf-gdb @ 11.2.0+20220823 - tool-xtensa-esp-elf-gdb @ 11.2.0+20230208 - toolchain-esp32ulp @ 1.23800.240113 (2.38.0) - toolchain-riscv32-esp @ 14.2.0+20241119 - toolchain-xtensa-esp-elf @ 14.2.0+20241119 Reading CMake configuration... Installing importlib-resources with pip at PlatformIO environment C:\Users\dengh\.platformio\penv\Scripts\python.exe -m pip install importlib-resources Looking in indexes: https://mirrors.aliyun.com/pypi/simple/ Requirement already satisfied: importlib-resources in c:\users\dengh\.platformio\penv\lib\site-packages (6.5.2) Installing pyyaml with pip at PlatformIO environment C:\Users\dengh\.platformio\penv\Scripts\python.exe -m pip install pyyaml Looking in indexes: https://mirrors.aliyun.com/pypi/simple/ Requirement already satisfied: pyyaml in c:\users\dengh\.platformio\penv\lib\site-packages (6.0.2) Installing markupsafe==2.0.1 with pip at PlatformIO environment C:\Users\dengh\.platformio\penv\Scripts\python.exe -m pip install markupsafe==2.0.1 Looking in indexes: https://mirrors.aliyun.com/pypi/simple/ Requirement already satisfied: markupsafe==2.0.1 in c:\users\dengh\.platformio\penv\lib\site-packages (2.0.1) Installing empy==3.3.4 with pip at PlatformIO environment C:\Users\dengh\.platformio\penv\Scripts\python.exe -m pip install empy==3.3.4 Looking in indexes: https://mirrors.aliyun.com/pypi/simple/ Requirement already satisfied: empy==3.3.4 in c:\users\dengh\.platformio\penv\lib\site-packages (3.3.4) Configuring esp32-s3-devkitc-1 with transport serial Downloading micro-ROS dev dependencies - Downloaded ament_cmake - Downloaded ament_lint - Downloaded ament_package - Downloaded googletest - Downloaded ament_cmake_ros - Downloaded ament_index Building micro-ROS dev dependencies UnicodeDecodeError: &#39;utf-8&#39; codec can&#39;t decode byte 0xb2 in position 8: invalid start byte: File "C:\Users\dengh\.platformio\penv\Lib\site-packages\platformio\builder\main.py", line 173: env.SConscript("$BUILD_SCRIPT") File "C:\Users\dengh\.platformio\packages\tool-scons\scons-local-4.8.1\SCons\Script\SConscript.py", line 620: return _SConscript(self.fs, *files, **subst_kw) File "C:\Users\dengh\.platformio\packages\tool-scons\scons-local-4.8.1\SCons\Script\SConscript.py", line 280: exec(compile(scriptdata, scriptname, &#39;exec&#39;), call_stack[-1].globals) File "C:\Users\dengh\.platformio\platforms\espressif32\builder\main.py", line 370: target_elf = env.BuildProgram() File "C:\Users\dengh\.platformio\packages\tool-scons\scons-local-4.8.1\SCons\Util\envs.py", line 252: return self.method(*nargs, **kwargs) File "C:\Users\dengh\.platformio\penv\Lib\site-packages\platformio\builder\tools\piobuild.py", line 62: env.ProcessProgramDeps() File "C:\Users\dengh\.platformio\packages\tool-scons\scons-local-4.8.1\SCons\Util\envs.py", line 252: return self.method(*nargs, **kwargs) File "C:\Users\dengh\.platformio\penv\Lib\site-packages\platformio\builder\tools\piobuild.py", line 142: env.BuildFrameworks(env.get("PIOFRAMEWORK")) File "C:\Users\dengh\.platformio\packages\tool-scons\scons-local-4.8.1\SCons\Util\envs.py", line 252: return self.method(*nargs, **kwargs) File "C:\Users\dengh\.platformio\penv\Lib\site-packages\platformio\builder\tools\piobuild.py", line 352: SConscript(env.GetFrameworkScript(name), exports="env") File "C:\Users\dengh\.platformio\packages\tool-scons\scons-local-4.8.1\SCons\Script\SConscript.py", line 684: return method(*args, **kw) File "C:\Users\dengh\.platformio\packages\tool-scons\scons-local-4.8.1\SCons\Script\SConscript.py", line 620: return _SConscript(self.fs, *files, **subst_kw) File "C:\Users\dengh\.platformio\packages\tool-scons\scons-local-4.8.1\SCons\Script\SConscript.py", line 280: exec(compile(scriptdata, scriptname, &#39;exec&#39;), call_stack[-1].globals) File "C:\Users\dengh\.platformio\platforms\espressif32\builder\frameworks\espidf.py", line 2074: + get_project_lib_includes(env) File "C:\Users\dengh\.platformio\platforms\espressif32\builder\frameworks\espidf.py", line 120: project.install_dependencies() File "C:\Users\dengh\.platformio\penv\Lib\site-packages\platformio\builder\tools\piolib.py", line 987: if _is_builtin(spec): File "C:\Users\dengh\.platformio\penv\Lib\site-packages\platformio\builder\tools\piolib.py", line 979: for lb in self.env.GetLibBuilders(): File "C:\Users\dengh\.platformio\packages\tool-scons\scons-local-4.8.1\SCons\Util\envs.py", line 252: return self.method(*nargs, **kwargs) File "C:\Users\dengh\.platformio\penv\Lib\site-packages\platformio\builder\tools\piolib.py", line 1115: lb = LibBuilderFactory.new(env, lib_dir) File "C:\Users\dengh\.platformio\penv\Lib\site-packages\platformio\builder\tools\piolib.py", line 60: obj = globals()[clsname](env, path, verbose=verbose) File "C:\Users\dengh\.platformio\penv\Lib\site-packages\platformio\builder\tools\piolib.py", line 153: self.process_extra_options() File "C:\Users\dengh\.platformio\penv\Lib\site-packages\platformio\builder\tools\piolib.py", line 301: self.env.SConscript( File "C:\Users\dengh\.platformio\packages\tool-scons\scons-local-4.8.1\SCons\Script\SConscript.py", line 620: return _SConscript(self.fs, *files, **subst_kw) File "C:\Users\dengh\.platformio\packages\tool-scons\scons-local-4.8.1\SCons\Script\SConscript.py", line 280: exec(compile(scriptdata, scriptname, &#39;exec&#39;), call_stack[-1].globals) File "C:\Users\dengh\Documents\PlatformIO\Projects\ros\.pio\libdeps\esp32-s3-devkitc-1\micro_ros_platformio\extra_script.py", line 171: build_microros() File "C:\Users\dengh\Documents\PlatformIO\Projects\ros\.pio\libdeps\esp32-s3-devkitc-1\micro_ros_platformio\extra_script.py", line 113: builder.run(&#39;{}/metas/{}&#39;.format(main_path, selected_board_meta), cmake_toolchain.path, microros_user_meta) File "C:\Users\dengh\Documents\PlatformIO\Projects\ros\.pio\libdeps\esp32-s3-devkitc-1\micro_ros_platformio\microros_utils\library_builder.py", line 64: self.build_dev_environment() File "C:\Users\dengh\Documents\PlatformIO\Projects\ros\.pio\libdeps\esp32-s3-devkitc-1\micro_ros_platformio\microros_utils\library_builder.py", line 109: print("Build dev micro-ROS environment failed: \n {}".format(result.stderr.decode("utf-8"))) ========================= [FAILED] Took 52.67 seconds =========================
09-23
内容概要:本文介绍了一个基于冠豪猪优化算法(CPO)的无人机三维路径规划项目,利用Python实现了在复杂三维环境中为无人机规划安全、高效、低能耗飞行路径的完整解决方案。项目涵盖空间环境建模、无人机动力学约束、路径编码、多目标代价函数设计以及CPO算法的核心实现。通过体素网格建模、动态障碍物处理、路径平滑技术多约束融合机制,系统能够在高维、密集障碍环境下快速搜索出满足飞行可行性、安全性与能效最优的路径,并支持在线重规划以适应动态环境变化。文中还提供了关键模块的代码示例,包括环境建模、路径评估CPO优化流程。; 适合人群:具备一定Python编程基础优化算法基础知识,从事无人机、智能机器人、路径规划或智能优化算法研究的相关科研人员与工程技术人员,尤其适合研究生及有一定工作经验的研发工程师。; 使用场景及目标:①应用于复杂三维环境下的无人机自主导航与避障;②研究智能优化算法(如CPO)在路径规划中的实际部署与性能优化;③实现多目标(路径最短、能耗最低、安全性最高)耦合条件下的工程化路径求解;④构建可扩展的智能无人系统决策框架。; 阅读建议:建议结合文中模型架构与代码示例进行实践运行,重点关注目标函数设计、CPO算法改进策略与约束处理机制,宜在仿真环境中测试不同场景以深入理解算法行为与系统鲁棒性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值