feat(net/udp): UDP 数据面并入 netMsgQueue 串行执行(#73) #74

Open
super_agent_bot wants to merge 4 commits from udp-queue-impl-ddb7c192c16e into master
Collaborator

This is by an automated agent, not a human.

背景

#57 SNTP 调研把「UDP 先串行化」列为 SNTP 落地的第一步,本 PR 就是那一步(#73 派工)。改造前 net_sendto / net_recvfrom 由调用方直调 SPI 并且是无限自旋收包:既违反"netTask 是芯片唯一访问者",又把 IWDG 预算吃在自旋里。

改了什么

  • 新模块 Drivers/BSP/NET/net_udp.c/.h(真机专属,模拟器不编译):bind / set_peer / sendto / recvfrom 四条执行体 + 挂起收包表 + net_udp_tick。net_msg_type_t 加四个消息型,公开 API 一律「入队 → 睡在任务通知上」;netTask 自己不占用——等数据、等发送缓冲都登记挂起、由 tick 结算。
  • 源地址怎么回来:net_msg_t 是按值拷入队列、AGENTS 明令禁止加"回传用"字段,所以出参指针不进消息,改住 net_udp.c 的 per-fd 槽——调用方 arm,netTask 执行体经该指针就地写回调用方内存,通知值只带结果码。槽互斥,且每条出口都必须清(入队失败、队列未绑定、参数被拒、挂起被结算),泄漏就等于这条 fd 永久 BUSY。
  • 发送不写第二份分块逻辑:UDP 复用 net_send_locked(1KB 分块 + 挂起 send 都在里面)。为此把"会话是否已死"收成一条判据 net_send_state_down()(TCP 看 ESTABLISHED、UDP 看 UDP_OPEN)——原先 4 处各写一遍。
  • 顺带修掉一个真缺陷(→ 新条 TRAP-NET-22):旧 net_sendto 为了发一个包把 DesIP 从 0xFFFFFFFF 改写成具体 IP,芯片就此静默切到 UDP Client 形态(收包不带 8 字节信息头),而旧 recvfrom 对 DGRAM 无条件剥 8 字节 → 请求-响应式协议(SNTP 的 48 B 应答)会丢掉载荷前 8 字节并交出垃圾源地址。现在 net_sock_t 带 udp_mode(塞进原有 2 字节 padding,sizeof(net_sock_t) 不变),bind 恒 SERVER、带显式对端的 sendto 切 CLIENT、net_udp_set_peer(fd, NULL) 轻量回 SERVER(不重开 Socket,因此不清芯片缓冲),只有 SERVER 且 avail >= 8 才剥头。
  • 截断语义定案:一次调用交付一个数据报,buf 装不下的尾巴必须排空(ch395f_read_recv_buf 是消费式读,不排空下一次就交出上一个包的残料)。排空用 64 B 栈上 scratch 循环读,不用 ch395f_clear_recv_buf——它清整个接收缓冲,会把后面已到达的包一起丢。
  • 取消点接齐:net_init 重建 cancel_all、net_socket 分配 fd clear、net_close settle_close + clear、重 bind 前把还在等包的调用方按 -8 结算;net_process_messages 第 5 个 tick 位挂 net_udp_tick。

契约变化(评审重点)

  1. UDP 必须先 bind 才能 sendto / recvfrom / net_udp_set_peer,否则 -5 NET_ERR_NOTCONN(芯片侧 Socket 还没开,此时改 DesIP/DesPort 没有落点)。
  2. net_recv / net_recv_nb / net_recv_to 对 DGRAM 一律 -3:它们读的是裸字节流,绕过剥头就是静默吃 8 字节,宁可拒掉。收 UDP 请走 net_recvfrom / 新增的 net_recvfrom_to。
  3. NET_ERR_NOT_IN_NETTASK(-12) 不再有运行时返回点(串行化后"不在 netTask 里"不再是错误),保留为历史常量并在头文件写明退役原因。
  4. 新增公开 API:net_recvfrom_to(fd, buf, len, to_ms, src_addr, addrlen)、net_udp_set_peer(fd, peer|NULL)、net_udp_get_mode(fd)。

验证

  • 主机单测:test/host/net_socket 全套 647/647 绿(改造前 470)。新分片 ns_s7_udp.c 共 23 组(bind 的 5 条芯片命令顺序、形态剥头逐字节、挂起收包在后续 poll 轮到达、预算超时按调用方 deadline、close/重建/重 bind 结算不许静默丢通知、出参槽互斥与泄漏、截断排空、netTask 自等守卫、参数守卫且拒时零芯片事务、「队列未绑定」与「队列满」两条失败出口不漏槽、芯片 open 回 ERR_BUSY 时精确码要沿通知值回来、队列里「别人的失败」排在我这条之前不许污染我的回执、轻/重回 SERVER、挂起 send 结算、tick 兜底);改写 TC-NETSOCK-440(补 bind 前置 + 440p~440u)、555、560 组。假件按「只加不改」扩了三处:捕获 ch395f_write_send_buf 的真实字节、SENBUF_FREE 写延迟注入、read_calls 计数。
  • 覆盖率:net_udp.c 237/239 行(99.2%,函数 14/14)、net_socket.c 966/969(99.7%,函数 59/59)、全仓 line 90.1%、47/47 套绿;scripts/test_coverage_baseline.json 已在本提交内登记新文件。未覆盖两处是有意的:net_udp.c 槽越界兜底(调用方已挡)、net_socket.c 错误码槽重查竞态(改造前后同为那 2 行)。
  • 构建:Keil MDK ARMCC 0 Error(s), 0 Warning(s);net_udp.o Code 1,370 / RO 71 / RW 0 / ZI 224(8 fd × 28 B,其余模块零增长);全仓 Flash 281,012 B(ER_IROM1 26.6%)、RAM RW_IRAM1 94,624 B(72.2%),92% 红线余量充足。内存台账受管区按门禁提示用 ram_baseline.py --write / --update 与 check_mem_numbers.py --write 机器回填(docs/内存管理/ 两份 + scripts/ram_baseline.tsv 一行),没有手改数字。台账里「网络」子系统的软配额(12 KB)本轮从超 1.4 KB 变成超 1.6 KB(+256 B),是否抬配额归台账所有者。
  • 本机 pre-commit run(52 根钩子,含 doc-links / coding-standard / mem-budget / generated-fresh / bsp-err / registration / nested-comment / mojibake)全绿;三根 manual 阶段钩子也在本机跑过:cppcheck Passed(它抓到 net_udp.c 两处 variableScope,已修)、test-cppcheck Passed、test-coverage 就是上面的覆盖率闸门。
  • 抓到并修掉的被测码真 bug 4 个(细节写进 主机单测覆盖率口径.md 第 4 轮):自等守卫误用调用侧谓词(导致每条正常 recvfrom 都被拒)、芯片长度被读两次、槽指针取在 fd 合法性检查之前、重 bind 静默作废等待者。

限度 / 未做

  • 本轮没有板子:真机回归 5 条(两端互通收发、set_peer(NULL) 能否真恢复收广播、截断排空后下一包完整性、挂起 recv 期间的 IWDG 余量、bind 写 DesIP 与 open 先后的真芯片效果)已写进覆盖率口径的「台架必验」,主机测试替代不了它们。
  • scripts/stack_report.py 退出码 1 是 2026-10-26 起就挂在账上的 iec104Task 既有栈债(margin 1,016 < 1,024,见 docs/代码规范/pre-commit使用说明.md:122)。本轮只让 net_bind 的 UDP 分支多一层静态帧(1,544 → 1,600);netTask(margin 1,904,静态最坏 1,936 / 3,840)与 timeSyncTask(1,152)不受影响。抬栈要过 mem-budget 台账,不在本分支自行处理。
  • 登记簿销项按仓库约定留给主工作树,本分支不动 docs/任务规划/**。
  • 模拟器侧(simulator/sim/net_socket_sim.c 是 Winsock 实现,不编译 net_socket.c)本轮没补 net_recvfrom_to / net_udp_set_peer / net_udp_get_mode 三条对应实现(当前模拟侧无调用者,补了就是死代码);只验证了 NET_NO_OS 口径下改过的 net_socket.h 能用 MSVC /W4 单独编过。日后 SNTP 若要在模拟器里跑,得先在 sim 侧补这三条。
This is by an automated agent, not a human. ## 背景 `#57` SNTP 调研把「UDP 先串行化」列为 SNTP 落地的第一步,本 PR 就是那一步(`#73` 派工)。改造前 `net_sendto` / `net_recvfrom` 由调用方直调 SPI 并且是**无限自旋**收包:既违反"netTask 是芯片唯一访问者",又把 IWDG 预算吃在自旋里。 ## 改了什么 - **新模块** `Drivers/BSP/NET/net_udp.c/.h`(真机专属,模拟器不编译):`bind / set_peer / sendto / recvfrom` 四条执行体 + 挂起收包表 + `net_udp_tick`。`net_msg_type_t` 加四个消息型,公开 API 一律「入队 → 睡在任务通知上」;netTask 自己不占用——等数据、等发送缓冲都登记挂起、由 tick 结算。 - **源地址怎么回来**:`net_msg_t` 是按值拷入队列、AGENTS 明令禁止加"回传用"字段,所以出参指针不进消息,改住 `net_udp.c` 的 **per-fd 槽**——调用方 `arm`,netTask 执行体经该指针就地写回调用方内存,通知值只带结果码。槽互斥,且**每条出口都必须清**(入队失败、队列未绑定、参数被拒、挂起被结算),泄漏就等于这条 fd 永久 `BUSY`。 - **发送不写第二份分块逻辑**:UDP 复用 `net_send_locked`(1KB 分块 + 挂起 send 都在里面)。为此把"会话是否已死"收成一条判据 `net_send_state_down()`(TCP 看 `ESTABLISHED`、UDP 看 `UDP_OPEN`)——原先 4 处各写一遍。 - **顺带修掉一个真缺陷**(→ 新条 `TRAP-NET-22`):旧 `net_sendto` 为了发一个包把 DesIP 从 `0xFFFFFFFF` 改写成具体 IP,芯片就此**静默切到 UDP Client 形态**(收包不带 8 字节信息头),而旧 `recvfrom` 对 `DGRAM` 无条件剥 8 字节 → 请求-响应式协议(SNTP 的 48 B 应答)会**丢掉载荷前 8 字节**并交出垃圾源地址。现在 `net_sock_t` 带 `udp_mode`(塞进原有 2 字节 padding,`sizeof(net_sock_t)` 不变),`bind` 恒 SERVER、带显式对端的 `sendto` 切 CLIENT、`net_udp_set_peer(fd, NULL)` 轻量回 SERVER(不重开 Socket,因此不清芯片缓冲),只有 SERVER 且 `avail >= 8` 才剥头。 - **截断语义定案**:一次调用交付一个数据报,`buf` 装不下的尾巴必须排空(`ch395f_read_recv_buf` 是消费式读,不排空下一次就交出上一个包的残料)。排空用 64 B 栈上 scratch 循环读,**不用** `ch395f_clear_recv_buf`——它清整个接收缓冲,会把后面已到达的包一起丢。 - **取消点接齐**:`net_init` 重建 `cancel_all`、`net_socket` 分配 fd `clear`、`net_close` `settle_close` + `clear`、重 bind 前把还在等包的调用方按 `-8` 结算;`net_process_messages` 第 5 个 tick 位挂 `net_udp_tick`。 ## 契约变化(评审重点) 1. **UDP 必须先 `bind`** 才能 `sendto` / `recvfrom` / `net_udp_set_peer`,否则 `-5 NET_ERR_NOTCONN`(芯片侧 Socket 还没开,此时改 DesIP/DesPort 没有落点)。 2. `net_recv` / `net_recv_nb` / `net_recv_to` 对 `DGRAM` 一律 `-3`:它们读的是裸字节流,绕过剥头就是静默吃 8 字节,宁可拒掉。收 UDP 请走 `net_recvfrom` / 新增的 `net_recvfrom_to`。 3. `NET_ERR_NOT_IN_NETTASK`(-12) 不再有运行时返回点(串行化后"不在 netTask 里"不再是错误),保留为历史常量并在头文件写明退役原因。 4. 新增公开 API:`net_recvfrom_to(fd, buf, len, to_ms, src_addr, addrlen)`、`net_udp_set_peer(fd, peer|NULL)`、`net_udp_get_mode(fd)`。 ## 验证 - **主机单测**:`test/host/net_socket` 全套 **647/647 绿**(改造前 470)。新分片 `ns_s7_udp.c` 共 23 组(bind 的 5 条芯片命令顺序、形态剥头逐字节、挂起收包在后续 poll 轮到达、预算超时按调用方 deadline、close/重建/重 bind 结算不许静默丢通知、出参槽互斥与泄漏、截断排空、netTask 自等守卫、参数守卫且拒时零芯片事务、「队列未绑定」与「队列满」两条失败出口不漏槽、芯片 `open` 回 `ERR_BUSY` 时精确码要沿通知值回来、队列里「别人的失败」排在我这条之前不许污染我的回执、轻/重回 SERVER、挂起 send 结算、tick 兜底);改写 `TC-NETSOCK-440`(补 bind 前置 + 440p~440u)、555、560 组。假件按「只加不改」扩了三处:捕获 `ch395f_write_send_buf` 的真实字节、SENBUF_FREE 写延迟注入、`read_calls` 计数。 - **覆盖率**:`net_udp.c` 237/239 行(99.2%,函数 14/14)、`net_socket.c` 966/969(99.7%,函数 59/59)、全仓 line 90.1%、47/47 套绿;`scripts/test_coverage_baseline.json` 已在本提交内登记新文件。未覆盖两处是有意的:`net_udp.c` 槽越界兜底(调用方已挡)、`net_socket.c` 错误码槽重查竞态(改造前后同为那 2 行)。 - **构建**:Keil MDK ARMCC **0 Error(s), 0 Warning(s)**;`net_udp.o` Code 1,370 / RO 71 / RW 0 / ZI 224(8 fd × 28 B,其余模块零增长);全仓 Flash 281,012 B(`ER_IROM1` 26.6%)、RAM `RW_IRAM1` 94,624 B(72.2%),92% 红线余量充足。内存台账受管区按门禁提示用 `ram_baseline.py --write / --update` 与 `check_mem_numbers.py --write` 机器回填(`docs/内存管理/` 两份 + `scripts/ram_baseline.tsv` 一行),没有手改数字。台账里「网络」子系统的软配额(12 KB)本轮从超 1.4 KB 变成超 1.6 KB(+256 B),是否抬配额归台账所有者。 - 本机 `pre-commit run`(52 根钩子,含 doc-links / coding-standard / mem-budget / generated-fresh / bsp-err / registration / nested-comment / mojibake)**全绿**;三根 manual 阶段钩子也在本机跑过:`cppcheck` Passed(它抓到 `net_udp.c` 两处 `variableScope`,已修)、`test-cppcheck` Passed、`test-coverage` 就是上面的覆盖率闸门。 - 抓到并修掉的**被测码真 bug** 4 个(细节写进 `主机单测覆盖率口径.md` 第 4 轮):自等守卫误用调用侧谓词(导致每条正常 recvfrom 都被拒)、芯片长度被读两次、槽指针取在 fd 合法性检查之前、重 bind 静默作废等待者。 ## 限度 / 未做 - **本轮没有板子**:真机回归 5 条(两端互通收发、`set_peer(NULL)` 能否真恢复收广播、截断排空后下一包完整性、挂起 recv 期间的 IWDG 余量、`bind` 写 DesIP 与 open 先后的真芯片效果)已写进覆盖率口径的「台架必验」,主机测试替代不了它们。 - `scripts/stack_report.py` 退出码 1 是 **2026-10-26 起就挂在账上的 `iec104Task` 既有栈债**(`margin 1,016 < 1,024`,见 `docs/代码规范/pre-commit使用说明.md:122`)。本轮只让 `net_bind` 的 UDP 分支多一层静态帧(1,544 → 1,600);`netTask`(margin 1,904,静态最坏 1,936 / 3,840)与 `timeSyncTask`(1,152)不受影响。抬栈要过 mem-budget 台账,不在本分支自行处理。 - 登记簿销项按仓库约定留给主工作树,本分支不动 `docs/任务规划/**`。 - 模拟器侧(`simulator/sim/net_socket_sim.c` 是 Winsock 实现,不编译 `net_socket.c`)本轮没补 `net_recvfrom_to` / `net_udp_set_peer` / `net_udp_get_mode` 三条对应实现(当前模拟侧无调用者,补了就是死代码);只验证了 `NET_NO_OS` 口径下改过的 `net_socket.h` 能用 MSVC `/W4` 单独编过。日后 SNTP 若要在模拟器里跑,得先在 sim 侧补这三条。
super_agent_bot force-pushed udp-queue-impl-ddb7c192c16e from a4b8bee209 to a91640dc6e 2026-11-03 18:11:32 +08:00 Compare
super_agent_bot added 1 commit 2026-11-03 18:44:30 +08:00
feat(net/udp): UDP 数据面并入 netMsgQueue 串行执行(#73)
CI / 静态门禁 (pre-commit) (push) Failing after 49s
CI / 主机侧单测 (MSVC) (push) Failing after 30s
CI / 静态门禁 (pre-commit) (pull_request) Failing after 45s
CI / 主机侧单测 (MSVC) (pull_request) Failing after 44s
fff961d803
前置来自 #57 SNTP 调研:旧 net_sendto / net_recvfrom 由调用方直调
SPI 且无限自旋收包,既违约「netTask 是芯片唯一访问者」,又把 IWDG
预算吃在自旋里。

改造面
- 新增 Drivers/BSP/NET/net_udp.c/.h(真机专属,模拟器不编译):
  bind/set_peer/sendto/recvfrom 四条执行体 + 挂起收包表 + tick;
  net_msg_type_t 加四型,公开 API 一律「入队 → 睡在通知上」。
- 源地址出参不搭 net_msg_t(按值拷贝,AGENTS 禁加回传字段):改住
  net_udp.c 的 per-fd 槽,netTask 就地写回调用方内存,通知值只带
  结果码;每条出口都清槽,泄漏 = 该 fd 永久 BUSY。
- 发送复用 net_send_locked,不写第二份分块逻辑;「会话是否已死」
  收成一条判据 net_send_state_down()(TCP 看 ESTABLISHED、UDP 看
  UDP_OPEN),原先 4 处各写一遍。
- 顺带修掉真缺陷(新条 TRAP-NET-22):旧 sendto 把 DesIP 写成具体
  IP,芯片静默切 UDP Client,而旧 recvfrom 无条件剥 8 字节 → SNTP
  这类 48 B 应答丢载荷前 8 字节并交出垃圾源地址。加 udp_mode(塞进
  原有 padding,sizeof 不变)、bind 恒 SERVER、显式对端 sendto 切
  CLIENT、set_peer(fd, NULL) 轻量回 SERVER,仅 SERVER 且 avail >= 8
  才剥头。
- 截断定案:一次调用交付一个数据报,buf 装不下的尾巴用 64 B 栈上
  scratch 排空(不用 clear_recv_buf——它连后面已到达的包一起丢)。
- 取消点接齐:net_init 重建 cancel_all、net_socket 分配 fd clear、
  net_close settle_close + clear、重 bind 前先结算等包者,
  net_process_messages 第 5 个 tick 位挂 net_udp_tick。
- 收紧两处契约(原实现无生产调用者):UDP 未 bind 一律 -5;
  net_recv / _nb / _to 拒 DGRAM(绕过剥头就是静默吃 8 字节);
  NET_ERR_NOT_IN_NETTASK(-12) 退役为历史常量并写明原因。

验证
- 主机单测 test/host/net_socket 全套 616/616 绿(改造前 470):新
  分片 ns_s7_udp.c 20 组,改写 440 / 555 / 560 组;覆盖率
  net_udp.c 234/236(99.2%)、net_socket.c 956/969(98.7%),
  scripts/test_coverage_baseline.json 随本提交登记新文件。
- 测试抓到 4 个被测码真 bug:自等守卫误用调用侧谓词、芯片长度被读
  两次、槽指针取在 fd 合法性检查之前、重 bind 静默作废等待者。
- Keil ARMCC 0 Error(s) 0 Warning(s);net_udp.o Code 1,358 / ZI 224
  (8 fd × 28 B,其余模块零增长),全仓 RW_IRAM1 72.2%;内存台账
  受管区按门禁提示用 --write / --update 机器回填,未手改数字。
- pre-commit 全量钩子(含 doc-links、coding-standard、mem-budget、
  generated-fresh、bsp-err、registration、nested-comment)全绿。

限度
- 本轮无板子:真机回归 5 条(两端互通、set_peer(NULL) 能否恢复收
  广播、截断排空后下一包完整性、挂起 recv 期间 IWDG 余量、bind 写
  DesIP 与 open 先后的真芯片效果)已写进覆盖率口径「台架必验」。
- scripts/stack_report.py 退出码 1 是 10-26 起挂在账上的 iec104Task
  栈债(margin 1,016 < 1,024,见 docs/代码规范/pre-commit使用说明.md:
  122);本轮只让 net_bind 的 UDP 分支多一层静态帧(1,544 → 1,600),
  netTask margin 1,888 与 timeSyncTask 1,152 不受影响。抬栈要过
  mem-budget 台账,不在本分支自行处理。
- 登记簿销项按仓库约定留给主工作树,本分支不动 docs/任务规划/**。
super_agent_bot force-pushed udp-queue-impl-ddb7c192c16e from a91640dc6e to fff961d803 2026-11-03 18:44:30 +08:00 Compare
Owner

@super_agent_bot 真机回归做完,再并入 master 分支

@super_agent_bot 真机回归做完,再并入 master 分支
Author
Collaborator

收到:PR #74 在真机回归做完、拿到证据之前不并 master,我这边不提合并。现在先确认这台机器有没有可烧录的 CH395F 板子——有就把「台架必验」5 条跑成证据,没有我把烧录/对端收发步骤和判据整理成一份可执行的台架清单交给你。

收到:PR #74 在真机回归做完、拿到证据之前不并 master,我这边不提合并。现在先确认这台机器有没有可烧录的 CH395F 板子——有就把「台架必验」5 条跑成证据,没有我把烧录/对端收发步骤和判据整理成一份可执行的台架清单交给你。 <!-- dsh-superagent:5ad2a2408f2f4db0e5109023f7b67fb2 -->
super_agent_bot added 1 commit 2026-11-03 20:19:01 +08:00
test(net/udp): 阶段 16 UDP 数据面真机回归台架(板端 + PC peer),台账补实测数字(#73)
CI / 静态门禁 (pre-commit) (push) Failing after 5m27s
CI / 主机侧单测 (MSVC) (push) Successful in 33s
CI / 静态门禁 (pre-commit) (pull_request) Failing after 7m6s
CI / 主机侧单测 (MSVC) (pull_request) Successful in 48s
8a81fa9e41
- 板端 net_layer_udp_bench_test_main:TC-NET-1601~1609,逐步覆盖主机测替代不了的
  5 条台架必验——形态切换与 bind 后首包、48 B 应答在客户端形态的载荷完整(TRAP-NET-22
  的真机对照)、截断包排空、挂起等待期间的 IWDG 余量、DesIP 先于 OPEN_SOCKET 的顺序。
  每步都有 25 s 预算,PC 缺席时报 [FAIL] 而不是把 testTask 钉死。
- PC peer test/host/udp_queue_bench.py:板端先 bind 当服务端,对端地址从收到的包里学
  (PC 是 DHCP,TEST_PC_PEER_IP 那个固定地址不在本机上);对 >1024 B 的回显额外监听
  第二片,把 net_send_locked 分块在 UDP 上的后果量出来。
- ch395f_test.h:阶段 16 宏默认关(与其它阶段一致),RAM 台账补 2026-11-03 实测——
  台架镜像 RW_IRAM1 96,232 B / 73.4%,阶段 16 自身代价 1,600 B;产品镜像 RW+ZI 与改造前逐字节相同。
- 文档:CH395F_Test_Guide §12.6 跑法与判据 + Python 脚本表加一行;覆盖率口径第 4 轮
  「台架必验」指向本阶段的可执行形态,并写明尚未在真机上跑过。
Author
Collaborator

This is by an automated agent, not a human.

真机回归台架已就位(阶段 16),但板子没电,实测还做不了

板子在 19:19:22 断电,三处独立证据:ping 192.168.31.100 不通;串口守护日志冻结在 [PROF] t=197121(14,965,244 B,复查 4 s 未增长);ST-LINK_CLI -c SWD UR 报 No target connected(stlink_flash.py list 仍能看到探针 SN 0B250D12A218303030303032,所以是板子没电,不是工具坏)。只有人能恢复供电/排线,所以先停在这里。

commit 8a81fa9e 把本轮登记的 5 条「台架必验」全部做成了可复现台架,电一来就能跑完:

  • 板端阶段 16(NET 层独立入口 net_layer_udp_bench_test_main,TC-NET-1600…1609)
  • PC peer test/host/udp_queue_bench.py(板端先 bind 当服务端,对端地址从收到的包里学——本机是 DHCP 192.168.31.161,TEST_PC_PEER_IP 那个固定地址不在本机,所以只能板端先听)
台架必验 用例 真机判据
① 两端互通 + 48 B 小应答载荷完整、源地址正确 1601 / 1602 bind 后 mode=SERVER;收 20 B 校验源地址;回显后 mode=CLIENT;同端口再发 48 B 必须读到 48 且首字节是载荷(判据错就只剩 40)
② set_peer(fd, NULL) 能否真恢复收其它源 1603 mode 回 SERVER、不重开 socket、换新源端口发来的包必须收到(客户端形态会被 DesIP 过滤掉)
③ 截断包排空 1604 / 1605 200 B 用 64 B 缓冲只读 64;紧接着 30 B 必须整包到
④ 挂起 recv 期间的 IWDG 余量 1607 PC 迟到 ~12 s 才发,板端 30 s 预算版醒来拿到正确 24 B;硬证据 = 串口 [ERR][WD] task stall 零条 + [PROF] 心跳连续 + net_get_generation() 不变
⑤ bind 时 DesIP 先于 OPEN_SOCKET 1601 / 1608 bind 后第一包必到;关 socket 重开 bind :6002 后第一包也必到

跑法三步:

  1. test/board/test_config.h 开 TEST_SUITE_CH395F;test/board/ch395f_test.h 只开 ENABLE_PHASE16_TESTS,把默认的 11/14 注掉(它们会带进 TEST_LATENCY_PROBE,污染要证的 UDP 面)。
  2. 构建烧录后 PC 先起 python test\host\udp_queue_bench.py --board 192.168.31.100(首步每 4 s 重发,能盖住板子启动那段时间)。
  3. 两侧都绿才算过:串口 === Phase 16: N/N PASSED (failed=0) === 且 peer 端 === UDP Bench PC Peer: N/N PASSED (failed=0) ===;跑完恢复那四行宏重建产品镜像。

不需要板子的部分已经验完:阶段 16 台架镜像 0 Error(s), 0 Warning(s)(Code 257,176,RW_IRAM1 96,232 B = 73.4%,距 92% 红线余 24,354 B,阶段自身代价就是 net_test_task.o 的 .bss 1,600 B);四行宏恢复默认后产品镜像同样 0/0,RW+ZI 152,048 B 与改造前逐字节相同(阶段 16 被完整预处理掉);主机单测 647/647 仍绿;本提交 pre-commit 全档 Passed/Skipped(含 92% RAM 门禁、双端注册反向校验)。

顺带量出来一条(写进 §12.6 限度,不是本次改出来的):NET_SEND_CHUNK_MAX = 1024 是 TCP 流的分块口径,UDP 上超过 1024 B 的 sendto 会被拆成多个数据报——改造前后是同一条路径,#57 的 SNTP 只有 48 B 碰不到。阶段 16 的 1025 / 1472 两条会在真芯片上把它量出来:peer 收到第二片就 FAIL 并打印各片长度。

真机跑完之前不建议并入 master。跑完我把两侧汇总行与 stall 判据回填到 docs/测试说明/单元测试/主机单测覆盖率口径.md 的「台架必验」条与本 PR。

This is by an automated agent, not a human. ## 真机回归台架已就位(阶段 16),但板子没电,实测还做不了 板子在 19:19:22 断电,三处独立证据:`ping 192.168.31.100` 不通;串口守护日志冻结在 `[PROF] t=197121`(14,965,244 B,复查 4 s 未增长);`ST-LINK_CLI -c SWD UR` 报 `No target connected`(`stlink_flash.py list` 仍能看到探针 SN 0B250D12A218303030303032,所以是板子没电,不是工具坏)。只有人能恢复供电/排线,所以先停在这里。 commit `8a81fa9e` 把本轮登记的 5 条「台架必验」全部做成了可复现台架,电一来就能跑完: - 板端**阶段 16**(NET 层独立入口 `net_layer_udp_bench_test_main`,TC-NET-1600…1609) - PC peer `test/host/udp_queue_bench.py`(板端先 bind 当服务端,对端地址从收到的包里学——本机是 DHCP `192.168.31.161`,`TEST_PC_PEER_IP` 那个固定地址不在本机,所以只能板端先听) | 台架必验 | 用例 | 真机判据 | |---|---|---| | ① 两端互通 + 48 B 小应答载荷完整、源地址正确 | 1601 / 1602 | bind 后 mode=SERVER;收 20 B 校验源地址;回显后 mode=CLIENT;同端口再发 48 B 必须读到 **48** 且首字节是载荷(判据错就只剩 40) | | ② `set_peer(fd, NULL)` 能否真恢复收其它源 | 1603 | mode 回 SERVER、**不重开** socket、换**新源端口**发来的包必须收到(客户端形态会被 DesIP 过滤掉) | | ③ 截断包排空 | 1604 / 1605 | 200 B 用 64 B 缓冲只读 64;紧接着 30 B 必须整包到 | | ④ 挂起 recv 期间的 IWDG 余量 | 1607 | PC 迟到 ~12 s 才发,板端 30 s 预算版醒来拿到正确 24 B;硬证据 = 串口 `[ERR][WD] task stall` 零条 + `[PROF]` 心跳连续 + `net_get_generation()` 不变 | | ⑤ bind 时 DesIP 先于 `OPEN_SOCKET` | 1601 / 1608 | bind 后第一包必到;关 socket 重开 bind :6002 后第一包也必到 | **跑法三步**: 1. `test/board/test_config.h` 开 `TEST_SUITE_CH395F`;`test/board/ch395f_test.h` 只开 `ENABLE_PHASE16_TESTS`,把默认的 11/14 注掉(它们会带进 `TEST_LATENCY_PROBE`,污染要证的 UDP 面)。 2. 构建烧录后 PC 先起 `python test\host\udp_queue_bench.py --board 192.168.31.100`(首步每 4 s 重发,能盖住板子启动那段时间)。 3. 两侧都绿才算过:串口 `=== Phase 16: N/N PASSED (failed=0) ===` 且 peer 端 `=== UDP Bench PC Peer: N/N PASSED (failed=0) ===`;跑完恢复那四行宏重建产品镜像。 **不需要板子的部分已经验完**:阶段 16 台架镜像 `0 Error(s), 0 Warning(s)`(Code 257,176,`RW_IRAM1` 96,232 B = 73.4%,距 92% 红线余 24,354 B,阶段自身代价就是 `net_test_task.o` 的 .bss 1,600 B);四行宏恢复默认后产品镜像同样 0/0,`RW+ZI` 152,048 B 与改造前逐字节相同(阶段 16 被完整预处理掉);主机单测 647/647 仍绿;本提交 pre-commit 全档 Passed/Skipped(含 92% RAM 门禁、双端注册反向校验)。 **顺带量出来一条**(写进 §12.6 限度,不是本次改出来的):`NET_SEND_CHUNK_MAX = 1024` 是 TCP 流的分块口径,UDP 上超过 1024 B 的 `sendto` 会被拆成**多个数据报**——改造前后是同一条路径,#57 的 SNTP 只有 48 B 碰不到。阶段 16 的 1025 / 1472 两条会在真芯片上把它量出来:peer 收到第二片就 FAIL 并打印各片长度。 真机跑完之前不建议并入 master。跑完我把两侧汇总行与 stall 判据回填到 `docs/测试说明/单元测试/主机单测覆盖率口径.md` 的「台架必验」条与本 PR。
super_agent_bot added 1 commit 2026-11-03 20:46:27 +08:00
fix(test/udp): peer 换源端口上报方式并补 PC 回路自检(#73)
CI / 静态门禁 (pre-commit) (push) Failing after 5m4s
CI / 主机侧单测 (MSVC) (push) Successful in 44s
CI / 静态门禁 (pre-commit) (pull_request) Failing after 4m48s
CI / 主机侧单测 (MSVC) (pull_request) Failing after 44s
b0a6394aa1
- test/host/udp_queue_bench.py:Windows 上未 connect 的 UDP socket 调 getsockname()
  直接抛 WinError 10022(请求一个未连接套接句的名称),脚本在第一条用例就崩。
  源端口改为首次收到回显时打印——它本来就是「板端剥头/源地址判定对不对」的直接读数。
- 新增 test/host/udp_queue_bench_loopback.py:不用板子的 peer 自检,在 127.0.0.1 上放
  一个按板端阶段 16 同样三条规矩说话的假板子(原样回显、tag 0x04 只回 64 B、>1KB 按
  1024 拆片),先把步骤表 / 模式函数 / 分片预期验掉。2026-11-03 首跑 27/27 绿,
  实测拆片形状 [1024, 1] 与 [1024, 448]。
- CH395F_Test_Guide.md §12.6:运行方法补「先跑自检」这一步;>1024 B 的 UDP 拆片从
  「多收到一片就 FAIL」改成「实测观测量」(拼接后逐字节一致才算绿),并说清这是既有
  NET_SEND_CHUNK_MAX 行为、不是本轮引入;脚本表补一行。
- 板子自 19:19 起未再上电(ping 不通、SWD No target、串口静默),阶段 16 真机那一趟
  仍未跑,PR #74 的合并前提不变。
Author
Collaborator

PR #74 代码侧已完成,现在卡在真机回归:开发板 19:19 起掉电(串口日志冻结、ping 192.168.31.100 不通、SWD No target connected)。方便的话请把板子上电、SWD 和 COM3 接回来,我继续跑阶段 16 取证;如果这台板子暂不可用,告诉我是否把台架步骤交给别人在别处跑。

PR #74 代码侧已完成,现在卡在真机回归:开发板 19:19 起掉电(串口日志冻结、ping 192.168.31.100 不通、SWD No target connected)。方便的话请把板子上电、SWD 和 COM3 接回来,我继续跑阶段 16 取证;如果这台板子暂不可用,告诉我是否把台架步骤交给别人在别处跑。 <!-- dsh-superagent:be1d4af12a5fef304d3b3ff496ec0394 -->
Owner

@super_agent_bot 板子已经上电了

@super_agent_bot 板子已经上电了
Author
Collaborator

收到:板子已上电。这就烧阶段 16 台架镜像、起 PC 对端跑真机回归,取到两端汇总行后把结果回填 PR #74。

收到:板子已上电。这就烧阶段 16 台架镜像、起 PC 对端跑真机回归,取到两端汇总行后把结果回填 PR #74。 <!-- dsh-superagent:77fdeb073adbeb12faf5b2766903a6bb -->
super_agent_bot added 1 commit 2026-11-03 21:28:46 +08:00
test(net/udp): 阶段 16 台架加固 + 真机首跑证据回填(#73)
CI / 静态门禁 (pre-commit) (push) Failing after 5m39s
CI / 主机侧单测 (MSVC) (push) Successful in 30s
CI / 静态门禁 (pre-commit) (pull_request) Failing after 4m15s
CI / 主机侧单测 (MSVC) (pull_request) Successful in 47s
fc0d3e4b5c
第一次上真机把台架的两处软肋照出来了,都不是被测代码的问题:

- peer 死在 Windows 的 ICMP 10054:板子还没 bind 时那一下端口不可达会被记在套接句上,
  下一次 recvfrom 才抛出来。本机 CPython 3.14.7 既没有 socket.SIO_UDP_CONNRESET 也不接受
  它的数值形式,所以主力防线改成把 10054 当「这一轮没收到」继续重试,并在回路自检里加
  冷端口探针——探针走脚本真正在用的 _recv_maybe,另拿裸套接句证明这台机器确实会回 ICMP,
  否则那条判定就没有牙。
- 单步预算错位:板端每步等 25 s,peer 每步只等 8 s,一步超时后整条梯子全灭。现在 peer
  每步都重发、单步预算 --step-budget 默认 35 s(小于 26 s 打警告);板端 udp_bench_expect
  按载荷第 0 字节的步号自愈,比本步小的旧包丢掉继续等(上限 UDP_BENCH_STALE_MAX = 8),
  比本步大的直接报出来。DBG_WARN 在本工程不存在、字符串字面量必须纯 ASCII,两处已改。

真机已拿到的证据:TC-NET-1601a/b/c(建 socket、bind :6001、net_udp_get_mode 回 SERVER)与
TC-NET-1602(服务端形态收到 20 B、addrlen/sin_family/源端口全对、逐字节回显、形态翻成
CLIENT)全绿——剥 8 字节信息头与源地址回填在真芯片上成立;②③④⑤ 因板子当晚两次失电
(19:19、21:0x,SWD No target connected + ping 不通)未测,指南 §12.6 与覆盖率口径第 4 轮
的状态条据此改写。产品态(宏回默认)重新构建 0 Error 0 Warning,Code 249,124 / RO 29,836 /
RW 2,052 / ZI 149,996 与本阶段之前逐字节一致,阶段 16 在产品里被预处理干净。
Author
Collaborator

This is by an automated agent, not a human.

真机回归第一轮:UDP 数据面已在真芯片上跑通前半段

台架(阶段 16)第一次上板实测,板端镜像 fw build: Nov 3 2026 20:53:35 suite=CH395F dstr=off,
串口取证 TC-NET-1601a/b/c + TC-NET-1602 全绿:

  • net_socket(NET_SOCK_DGRAM) 拿到 fd=3,net_bind 到 :6001 返回 0,net_udp_get_mode 回 SERVER(0);
  • 服务端形态收到第一个数据报:net_recvfrom_to 返回 20 B,*addrlen == sizeof(net_sockaddr_in)、
    sin_family == NET_AF_INET、源端口回读正确 —— 即「DesIP=0xFFFFFFFF 时前置 8 字节信息头」这条
    私有约定在真芯片上被正确剥掉、源地址被正确还原(TRAP-NET-22 的正身);
  • 回显发送成功且 PC 侧逐字节一致(模式 p[i]=(i*7+0x11)&0xFF),回显之后 net_udp_get_mode 翻成 CLIENT(1)。

①的上半段(服务端收包 + 剥头 + 源地址回填 + 回显)到此有证据。②③④⑤与 1603 之后仍缺:板子在
21:0x 再次失电(ping 不通、SWD No target connected、ST-LINK 探针本身仍在、COM3 仍枚举但 3 s 内
零字节),这是今晚第二次(前一次 19:19)。

第一轮顺带抓到两处台架缺陷(不是被测代码),fc0d3e4 已修

  1. peer 死在 Windows 的 ICMP 10054:板子还没 bind 时那一下端口不可达被系统记在套接句上,
    下一次 recvfrom 才抛出来,于是对端在开机第一秒就退出,板子白等 25 s。本机 CPython 3.14.7
    既没有 socket.SIO_UDP_CONNRESET 也不接受它的数值形式,所以主力防线改成把 10054 当
    「这一轮没收到」继续重试;并在不用板子的回路自检里加了冷端口探针(走脚本真正在用的
    _recv_maybe,另用裸套接句证明这台机器确实会回 ICMP,否则那条判定就没有牙)。
  2. 单步预算错位:板端每步最多等 25 s,peer 每步只等 8 s,一步超时后整条步号梯子全部错位,
    日志看着像"全灭"。现在 peer 每步都重发、单步预算 --step-budget 默认 35 s(小于 26 s 打警告);
    板端 udp_bench_expect 按载荷第 0 字节的步号自愈:比本步小的旧包丢掉继续等(上限
    UDP_BENCH_STALE_MAX = 8),比本步大的直接报出来。

顺带记两条纪律:跑台架期间别用 serial-assistant 守护进程取证(它重启后不重开 COM3,整段板端日志
会丢);mem-budget 门禁读的是磁盘上现成的 .map,跑完台架忘了切回产品态重建就会报假漂移。

现在的状态与下一步

加固后台架镜像本机构建 Code=257,388 / RO=34,136 / RW=2,060 / ZI=151,596,0 Error 0 Warning;
测试宏已恢复默认并重建产品态 Code=249,124 / RW=2,052 / ZI=149,996,与本阶段之前逐字节一致
(阶段 16 在产品里被预处理干净)。主机单测 647/647、门禁 sweep 全绿。台架锁仍持有,上电后约 3 分钟
可跑完 1603–1609(形态恢复、截断排空、30 s 挂起 park 期间的 IWDG/心跳、重建 socket 后首包、
1/20/1024/1025/1472 分片形状),跑完再回填 主机单测覆盖率口径.md 与 §12.6 的实测结论。
在此之前不建议并入 master。

This is by an automated agent, not a human. ## 真机回归第一轮:UDP 数据面已在真芯片上跑通前半段 台架(阶段 16)第一次上板实测,板端镜像 `fw build: Nov 3 2026 20:53:35 suite=CH395F dstr=off`, 串口取证 `TC-NET-1601a/b/c` + `TC-NET-1602` **全绿**: - `net_socket(NET_SOCK_DGRAM)` 拿到 fd=3,`net_bind` 到 `:6001` 返回 0,`net_udp_get_mode` 回 SERVER(0); - **服务端形态收到第一个数据报**:`net_recvfrom_to` 返回 20 B,`*addrlen == sizeof(net_sockaddr_in)`、 `sin_family == NET_AF_INET`、源端口回读正确 —— 即「DesIP=0xFFFFFFFF 时前置 8 字节信息头」这条 私有约定在真芯片上被正确剥掉、源地址被正确还原(TRAP-NET-22 的正身); - 回显发送成功且 PC 侧逐字节一致(模式 `p[i]=(i*7+0x11)&0xFF`),回显之后 `net_udp_get_mode` 翻成 CLIENT(1)。 ①的上半段(服务端收包 + 剥头 + 源地址回填 + 回显)到此有证据。②③④⑤与 1603 之后仍缺:板子在 21:0x 再次失电(`ping` 不通、SWD `No target connected`、ST-LINK 探针本身仍在、COM3 仍枚举但 3 s 内 零字节),这是今晚第二次(前一次 19:19)。 ## 第一轮顺带抓到两处**台架**缺陷(不是被测代码),fc0d3e4 已修 1. **peer 死在 Windows 的 ICMP 10054**:板子还没 bind 时那一下端口不可达被系统记在套接句上, 下一次 `recvfrom` 才抛出来,于是对端在开机第一秒就退出,板子白等 25 s。本机 CPython 3.14.7 既没有 `socket.SIO_UDP_CONNRESET` 也不接受它的数值形式,所以主力防线改成把 10054 当 「这一轮没收到」继续重试;并在不用板子的回路自检里加了**冷端口探针**(走脚本真正在用的 `_recv_maybe`,另用裸套接句证明这台机器确实会回 ICMP,否则那条判定就没有牙)。 2. **单步预算错位**:板端每步最多等 25 s,peer 每步只等 8 s,一步超时后整条步号梯子全部错位, 日志看着像"全灭"。现在 peer 每步都重发、单步预算 `--step-budget` 默认 35 s(小于 26 s 打警告); 板端 `udp_bench_expect` 按载荷第 0 字节的步号自愈:比本步小的旧包丢掉继续等(上限 `UDP_BENCH_STALE_MAX = 8`),比本步大的直接报出来。 顺带记两条纪律:跑台架期间别用 serial-assistant 守护进程取证(它重启后不重开 COM3,整段板端日志 会丢);`mem-budget` 门禁读的是磁盘上现成的 `.map`,跑完台架忘了切回产品态重建就会报假漂移。 ## 现在的状态与下一步 加固后台架镜像本机构建 `Code=257,388 / RO=34,136 / RW=2,060 / ZI=151,596`,0 Error 0 Warning; 测试宏已恢复默认并重建产品态 `Code=249,124 / RW=2,052 / ZI=149,996`,与本阶段之前逐字节一致 (阶段 16 在产品里被预处理干净)。主机单测 647/647、门禁 sweep 全绿。台架锁仍持有,上电后约 3 分钟 可跑完 1603–1609(形态恢复、截断排空、30 s 挂起 park 期间的 IWDG/心跳、重建 socket 后首包、 1/20/1024/1025/1472 分片形状),跑完再回填 `主机单测覆盖率口径.md` 与 §12.6 的实测结论。 **在此之前不建议并入 master。**
Author
Collaborator

板子今晚第二次掉电了(探针和 COM3 都在,是板子本身没电)。能否再上电并保持在电?回一句就立刻跑完 1603–1609 并回填真机结论;如果想自己跑,命令在 CH395F_Test_Guide §12.6。另外建议查下供电/电源线,一晚两次掉电不太正常。

板子今晚第二次掉电了(探针和 COM3 都在,是板子本身没电)。能否再上电并保持在电?回一句就立刻跑完 1603–1609 并回填真机结论;如果想自己跑,命令在 CH395F_Test_Guide §12.6。另外建议查下供电/电源线,一晚两次掉电不太正常。 <!-- dsh-superagent:58819df03326f36fec2d455c81db8b3e -->
Author
Collaborator

板子又掉电了(这已是第二次在你 21:09 上电之后)。上电后撑不过几分钟就反复失联,更像供电接触不良/适配器带不动,建议先换根电源线或查插座。任一方式都行:把板子保持在电十几分钟我立刻跑完 1603–1609 并刷回产品镜像回填结论;或你自己按 CH395F_Test_Guide §12.6 的 6 步跑。

板子又掉电了(这已是第二次在你 21:09 上电之后)。上电后撑不过几分钟就反复失联,更像供电接触不良/适配器带不动,建议先换根电源线或查插座。任一方式都行:把板子保持在电十几分钟我立刻跑完 1603–1609 并刷回产品镜像回填结论;或你自己按 CH395F_Test_Guide §12.6 的 6 步跑。 <!-- dsh-superagent:8951a6d9f2a459e10b03eaec7db33355 -->
Author
Collaborator

This is by an automated agent, not a human.

(本条替换之前那条乱码评论:坏在 PowerShell 5.1 用 ANSI 码页读了 UTF-8 文件,再转 JSON 存进 Gitea;已改成直接用 UTF-8 组装请求体,并把仓里所有我自己发的评论逐条核过一遍——只有这一条被写坏,其余中文正常。)

按你的指示,已停掉「等到上电就自动开跑」的守护任务,先把状态恢复正常:仓库工作树干净、测试宏都是提交态默认(TEST_SUITE_* 全部注释、ENABLE_PHASE16_TESTS 注释、PHASE11/14 维持原样)、没有后台任务在抢 SWD 和串口。等你上电并说一声,我再开始台架试验。

还需要你知道的两件事:

  1. 板子里现在烧的是 20:53 那版阶段 16 台架镜像(fw build: Nov 3 2026 20:53:35 suite=CH395F),不是产品镜像——板子断电期间没法刷回去。你上电之后我先跑完回归,第一件事就是把产品镜像刷回去并核对启动判据。
  2. 加固后的镜像已经编好放在 bench_evidence\phase16c.hex(821,046 B,0 error 0 warning),跑一轮只要约 4 分钟,不用再等编译。

本轮相对第一次跑(20:53,只到 TC-NET-1602)已加固三处:

  1. PC 侧对端不再被 Windows 的 WinError 10054(ICMP 端口不可达)打死——板子还没 bind 时芯片会回 ICMP,旧脚本第一次 recv 就退出,板子只能干等 25 秒;现在改成吃掉这个异常并按步重发。
  2. 对端每步预算 40 s > 板端 25 s 停车窗口,不会因为一步超时就把整条 tag 阶梯带偏(上次 1603 之后全部 无回显 就是这个连锁)。
  3. 板端加了「陈旧包自愈」:读到比自己正在等的 tag 更旧的包就丢掉继续等(上限 8 个),所以重刷/重发造成的重复包不会把后面每一步全拖成超时。

抓取串口的方式也换了:直接用 pyserial 读 COM3,不再走 serial-assistant 守护进程(它中途重启过,port.ready: false 且不会自己重开口,上一轮的板端日志就是这么丢的)。

跑完的产物会落在 bench_evidence/(board_serial_<时间戳>.log + peer_<时间戳>.log 两份),我把 ①–⑤ 的实测结果回填到 docs/测试说明/单元测试/主机单测覆盖率口径.md 第 4 轮和 docs/测试说明/板级测试/CH395F_Test_Guide.md §12.6,再推提交。在那之前不建议并入 master。

This is by an automated agent, not a human. (本条替换之前那条乱码评论:坏在 PowerShell 5.1 用 ANSI 码页读了 UTF-8 文件,再转 JSON 存进 Gitea;已改成直接用 UTF-8 组装请求体,并把仓里所有我自己发的评论逐条核过一遍——只有这一条被写坏,其余中文正常。) 按你的指示,**已停掉「等到上电就自动开跑」的守护任务,先把状态恢复正常**:仓库工作树干净、测试宏都是提交态默认(`TEST_SUITE_*` 全部注释、`ENABLE_PHASE16_TESTS` 注释、PHASE11/14 维持原样)、没有后台任务在抢 SWD 和串口。等你上电并说一声,我再开始台架试验。 还需要你知道的两件事: 1. **板子里现在烧的是 20:53 那版阶段 16 台架镜像**(`fw build: Nov 3 2026 20:53:35 suite=CH395F`),不是产品镜像——板子断电期间没法刷回去。你上电之后我先跑完回归,第一件事就是把产品镜像刷回去并核对启动判据。 2. 加固后的镜像已经编好放在 `bench_evidence\phase16c.hex`(821,046 B,0 error 0 warning),跑一轮只要约 4 分钟,不用再等编译。 本轮相对第一次跑(20:53,只到 TC-NET-1602)已加固三处: 1. PC 侧对端不再被 Windows 的 `WinError 10054`(ICMP 端口不可达)打死——板子还没 bind 时芯片会回 ICMP,旧脚本第一次 recv 就退出,板子只能干等 25 秒;现在改成吃掉这个异常并按步重发。 2. 对端每步预算 40 s > 板端 25 s 停车窗口,不会因为一步超时就把整条 tag 阶梯带偏(上次 1603 之后全部 `无回显` 就是这个连锁)。 3. 板端加了「陈旧包自愈」:读到比自己正在等的 tag 更旧的包就丢掉继续等(上限 8 个),所以重刷/重发造成的重复包不会把后面每一步全拖成超时。 抓取串口的方式也换了:直接用 pyserial 读 COM3,不再走 serial-assistant 守护进程(它中途重启过,`port.ready: false` 且不会自己重开口,上一轮的板端日志就是这么丢的)。 跑完的产物会落在 `bench_evidence/`(`board_serial_<时间戳>.log` + `peer_<时间戳>.log` 两份),我把 ①–⑤ 的实测结果回填到 `docs/测试说明/单元测试/主机单测覆盖率口径.md` 第 4 轮和 `docs/测试说明/板级测试/CH395F_Test_Guide.md` §12.6,再推提交。在那之前不建议并入 master。
Author
Collaborator

已换成自动台架:板子一上电就自动烧录并跑完整回归(约 4 分钟出结果),不用再回消息。你只要把板子重新上电并保持通电 5 分钟。75 分钟内没等到上电的话,worker 先交付现有证据、等你另安排时间。

已换成自动台架:板子一上电就自动烧录并跑完整回归(约 4 分钟出结果),不用再回消息。你只要把板子重新上电并保持通电 5 分钟。75 分钟内没等到上电的话,worker 先交付现有证据、等你另安排时间。 <!-- dsh-superagent:8f5ed262a6fd1c6d5cd4ff9e8d9a6973 -->
Owner

This is by an automated agent, not a human.

鍙版灦宸插氨浣嶏紝鎴戣繖杈规寕浜嗕竴涓€岀瓑鍒颁笂鐢靛氨璺戙€嶇殑瀹堟姢浠诲姟锛?*涓嶉渶瑕佸啀閫氱煡鎴?*锛氭澘瀛愪竴鏃﹁兘 ping 閫氫笖 SWD 杩炰笂锛屽畠浼氳嚜鍔ㄧ儳 phase16c.hex锛堝姞鍥哄悗鐨勯樁娈?16 闀滃儚锛屽凡缂栧ソ 0 error 0 warning锛?21,046 B锛夊苟璺戝畬鏁村锛屽叏绋嬬害 4 鍒嗛挓銆?
璇峰彧淇濊瘉涓€浠朵簨锛?*鏉夸笂鐢靛悗鍒嫈锛岀暀澶?5 鍒嗛挓**锛?607 閭d竴姝ヨ鏁呮剰璁╂澘瀛愬湪 30 绉掔殑鏈夌晫绛夊緟閲屽仠鐫€鈥斺€擯C 杩熷埌 12 绉掓墠鍙戝寘锛岀敤鏉ラ獙鎸傝捣鏈熼棿鐨?netTask 蹇冭烦娌″仠銆両WDG 娌″挰锛?608 杩樿瀵圭┖绐楀彛闈欓粯 2 绉掞級銆?
鏈疆鐩稿涓婁竴娆¤窇锛?0:53锛屽彧鍒?TC-NET-1602锛夊凡鍔犲浐涓夊锛?

  1. PC 渚у绔笉鍐嶈 Windows 鐨?WinError 10054锛圛CMP 绔彛涓嶅彲杈撅級鎵撴 鈥斺€?鏉垮瓙杩樻病 bind 鏃惰姱鐗囦細鍥?ICMP锛屾棫鑴氭湰绗竴娆?recv 灏遍€€鍑猴紝鏉垮瓙鍙兘骞茬瓑 25 绉掞紱鐜板湪鏀瑰悆杩欎釜寮傚父骞舵寜姝ラ噸鍙戙€?2. 瀵圭姣忔棰勭畻 40 s > 鏉跨 25 s 鍋滆溅绐楀彛锛屼笉浼氬洜涓轰竴姝ヨ秴鏃跺氨鎶婃暣鏉?tag 闃舵甯﹀亸锛堜笂娆?1603 涔嬪悗鍏ㄩ儴 鏃犲洖鏄綻 灏辨槸杩欎釜杩為攣锛夈€?3. 鏉跨鍔犱簡銆岄檲鏃у寘鑷剤銆嶏細璇诲埌姣旇嚜宸辨鍦ㄧ瓑鐨?tag 鏇存棫鐨勫寘灏变涪鎺夌户缁瓑锛堜笂闄?8 涓級锛屾墍浠ラ噸鍒?閲嶅彂閫犳垚鐨勯噸澶嶅寘涓嶄細鎶婂悗闈㈡瘡涓€姝ュ叏鎷栨垚瓒呮椂銆? 鎶撳彇鏂瑰紡涔熸崲浜嗭細鐩存帴鐢?pyserial 璇?COM3锛屼笉鍐嶈蛋 serial-assistant 瀹堟姢杩涚▼锛堝畠涓€旈噸鍚繃锛宍port.ready: false 涓斾笉浼氳嚜宸遍噸寮€鍙o紝涓婁竴杞殑鏉跨鏃ュ織灏辨槸杩欎箞涓㈢殑锛夈€?
    浜х墿浼氳惤鍦?bench_evidence/锛宍board_serial_<鏃堕棿鎴?.log+peer_<鏃堕棿鎴?.log涓や唤锛岃窇瀹屾垜鎶?鈶犫€撯懁 鐨勫疄娴嬬粨鏋滃洖濉埌涓绘満鍗曟祴瑕嗙洊鐜囧彛寰?md绗?4 杞拰CH395F_Test_Guide.md` 搂12.6锛屽啀鎺ㄦ彁浜ゃ€傚湪閭d箣鍓嶄笉寤鸿骞跺叆 master銆?

@super_agent_bot 给我改成正常的语言,这是乱码,现在断电了,等我上电,你再进行台架试验,先恢复为正常状态

> This is by an automated agent, not a human. > > 鍙版灦宸插氨浣嶏紝鎴戣繖杈规寕浜嗕竴涓€岀瓑鍒颁笂鐢靛氨璺戙€嶇殑瀹堟姢浠诲姟锛?*涓嶉渶瑕佸啀閫氱煡鎴?*锛氭澘瀛愪竴鏃﹁兘 ping 閫氫笖 SWD 杩炰笂锛屽畠浼氳嚜鍔ㄧ儳 `phase16c.hex`锛堝姞鍥哄悗鐨勯樁娈?16 闀滃儚锛屽凡缂栧ソ 0 error 0 warning锛?21,046 B锛夊苟璺戝畬鏁村锛屽叏绋嬬害 4 鍒嗛挓銆? > 璇峰彧淇濊瘉涓€浠朵簨锛?*鏉夸笂鐢靛悗鍒嫈锛岀暀澶?5 鍒嗛挓**锛?607 閭d竴姝ヨ鏁呮剰璁╂澘瀛愬湪 30 绉掔殑鏈夌晫绛夊緟閲屽仠鐫€鈥斺€擯C 杩熷埌 12 绉掓墠鍙戝寘锛岀敤鏉ラ獙鎸傝捣鏈熼棿鐨?netTask 蹇冭烦娌″仠銆両WDG 娌″挰锛?608 杩樿瀵圭┖绐楀彛闈欓粯 2 绉掞級銆? > 鏈疆鐩稿涓婁竴娆¤窇锛?0:53锛屽彧鍒?TC-NET-1602锛夊凡鍔犲浐涓夊锛? > 1. PC 渚у绔笉鍐嶈 Windows 鐨?`WinError 10054`锛圛CMP 绔彛涓嶅彲杈撅級鎵撴 鈥斺€?鏉垮瓙杩樻病 bind 鏃惰姱鐗囦細鍥?ICMP锛屾棫鑴氭湰绗竴娆?recv 灏遍€€鍑猴紝鏉垮瓙鍙兘骞茬瓑 25 绉掞紱鐜板湪鏀瑰悆杩欎釜寮傚父骞舵寜姝ラ噸鍙戙€?2. 瀵圭姣忔棰勭畻 40 s > 鏉跨 25 s 鍋滆溅绐楀彛锛屼笉浼氬洜涓轰竴姝ヨ秴鏃跺氨鎶婃暣鏉?tag 闃舵甯﹀亸锛堜笂娆?1603 涔嬪悗鍏ㄩ儴 `鏃犲洖鏄綻 灏辨槸杩欎釜杩為攣锛夈€?3. 鏉跨鍔犱簡銆岄檲鏃у寘鑷剤銆嶏細璇诲埌姣旇嚜宸辨鍦ㄧ瓑鐨?tag 鏇存棫鐨勫寘灏变涪鎺夌户缁瓑锛堜笂闄?8 涓級锛屾墍浠ラ噸鍒?閲嶅彂閫犳垚鐨勯噸澶嶅寘涓嶄細鎶婂悗闈㈡瘡涓€姝ュ叏鎷栨垚瓒呮椂銆? > 鎶撳彇鏂瑰紡涔熸崲浜嗭細鐩存帴鐢?pyserial 璇?COM3锛屼笉鍐嶈蛋 serial-assistant 瀹堟姢杩涚▼锛堝畠涓€旈噸鍚繃锛宍port.ready: false` 涓斾笉浼氳嚜宸遍噸寮€鍙o紝涓婁竴杞殑鏉跨鏃ュ織灏辨槸杩欎箞涓㈢殑锛夈€? > 浜х墿浼氳惤鍦?`bench_evidence/`锛宍board_serial_<鏃堕棿鎴?.log` + `peer_<鏃堕棿鎴?.log` 涓や唤锛岃窇瀹屾垜鎶?鈶犫€撯懁 鐨勫疄娴嬬粨鏋滃洖濉埌 `涓绘満鍗曟祴瑕嗙洊鐜囧彛寰?md` 绗?4 杞拰 `CH395F_Test_Guide.md` 搂12.6锛屽啀鎺ㄦ彁浜ゃ€傚湪閭d箣鍓嶄笉寤鸿骞跺叆 master銆? @super_agent_bot 给我改成正常的语言,这是乱码,现在断电了,等我上电,你再进行台架试验,先恢复为正常状态
Author
Collaborator

收到:先把乱码评论改成正常中文,并停掉「自动等上电就开跑」的台架任务、恢复默认状态,等你上电后再开始真机台架。

收到:先把乱码评论改成正常中文,并停掉「自动等上电就开跑」的台架任务、恢复默认状态,等你上电后再开始真机台架。 <!-- dsh-superagent:4910bf884cf681d97053df215aca9cd4 -->
Some checks are pending
CI / 静态门禁 (pre-commit) (push) Failing after 5m39s
CI / 主机侧单测 (MSVC) (push) Successful in 30s
CI / 静态门禁 (pre-commit) (pull_request) Failing after 4m15s
CI / 主机侧单测 (MSVC) (pull_request) Successful in 47s
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin udp-queue-impl-ddb7c192c16e:udp-queue-impl-ddb7c192c16e
git checkout udp-queue-impl-ddb7c192c16e
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wandering1/STM32F4-Base#74