refactor(编号): 链路延迟分段 L1~L11 → 段名(文档中文名 / C 日志 ASCII 短码,批次 3b)

这族是延迟测试的分段号(L1 SPI 字节命令 … L11 uiTask 节拍)。特殊之处:**号直接打进
串口日志字符串**,而 C 字符串必须纯 ASCII(AGENTS 铁律)——所以两份落地面用两套名:

  文档(人读):SPI 字节命令 / SPI DMA / 发送分块握手 / 芯片→线上+PC / 队列往返 /
                请求→首字节 / 整帧 3209B 往返 / 生产路径帧周期 / 连接/重监听 / 日志税 / uiTask 节拍
  C 日志(ASCII):SPI_CMD / SPI_DMA / CHUNK_WAIT / TO_PC / QUEUE_RT / ECHO_RT /
                FRAME_RT / PROD_CYCLE / RELISTEN / LOGTAX / UI_LOOP

改动:`链路延迟测试说明.md` 84 行(分段定义表的「段」列删掉、名称列即段名;正文与
基线表同步);`test/board/net_latency_test.c` 61 行(日志串与注释,行数不变、逐行替换)。
标识符一律不碰:`LAT_P13_OP_L5_RECV` / `P13_ST_L5_SEND` 这类宏与枚举仍在(它们是代码符号,
不是给人读的段号)——7 处已核完整。

一次事故:第一版把该 .c 写坏了(整篇被同名表格行覆盖),已 `git checkout` 回滚,改成
「只改命中行 + 行数断言」重做,本次 61 行、1313→1313 行不变。

验证:文档与 C 两侧段号残留为 0;doc-links / mojibake / 新编号门禁 / git diff --check 全绿。
该文件属板级测试套件(产品构建不编译它),本次只动注释与字符串,不改任何逻辑。
This commit is contained in:
2026-10-28 13:19:04 +08:00
parent 0f0158508a
commit b9f5df5d28
2 changed files with 144 additions and 144 deletions
+61 -61
View File
@@ -2,13 +2,13 @@
* 模块名称:CH395F 链路延迟测试(实现)
* 模块功能:DWT CYCCNT 微秒时基 + 采样统计(min/med/p95/max/尖峰)+ [LAT]
* 机器可读报告与 verdict;Phase 12(M1):SPI 字节命令 / DMA 时延
* 基线(L1/L2,硬件层模式,无需 PC)。分段定义与判定基线见
* 基线(SPI_CMD/SPI_DMA,硬件层模式,无需 PC)。分段定义与判定基线见
* docs/测试说明/链路延迟测试说明.md。
* 适用平台:STM32F4 系列(CH395F)
* 作者:王建锋
* 创建日期:2026-09-22
* 修改记录:
* 2026-09-22 王建锋 初版:时基 + 统计/报告 + Phase 12(L1/L2)
* 2026-09-22 王建锋 初版:时基 + 统计/报告 + Phase 12(SPI_CMD/SPI_DMA)
*
* 构建形态:
* - 产品构建:三个 Phase 宏均未定义 → 本文件除 include 外全部不参与编译;
@@ -20,7 +20,7 @@
#include "net_latency_test.h"
#include "ch395f_test.h" /* TEST_CHECK / TEST_REPORT / g_test_stats / Phase 宏 */
#include "ch395f.h" /* 驱动公开 API(L1 字节命令 / L2 DMA) */
#include "ch395f.h" /* 驱动公开 API(SPI_CMD 字节命令 / SPI_DMA DMA) */
#include "net_socket.h" /* net_send / net_recv / NET_MSG_DONTWAIT(Phase 13) */
#include "test_config.h" /* TEST_LATENCY_PROBE(探针编译开关) */
#include "main.h" /* CoreDebug / DWT / SystemCoreClock / HAL_GetTick */
@@ -38,7 +38,7 @@
* 工程内首个 DWT 用户(sys_clock 为纯 HAL tick,无 us 能力)。
* 32 位计数 168MHz 下回绕周期 25.17ms:M1 各段(<5ms)与 M2
* 调用方侧测量(单次 <25ms)用单次读数差即可;跨 25ms 的段
* (L4/L8 整帧与重传尖峰)由 PC 端 peer 计时(说明文档 §2.3)。
* (TO_PC/PROD_CYCLE 整帧与重传尖峰)由 PC 端 peer 计时(说明文档 §2.3)。
* 读取 DWT->CYCCNT 无共享状态,任意任务上下文安全。
* ============================================================ */
@@ -77,7 +77,7 @@ static uint32_t lat_elapsed_us(uint32_t c_start)
}
#endif /* ENABLE_PHASE12_TESTS */
/* 公开读数接口(net_socket.c 的 L3 探针经此访问 DWT,避免直接碰寄存器) */
/* 公开读数接口(net_socket.c 的 CHUNK_WAIT 探针经此访问 DWT,避免直接碰寄存器) */
uint32_t lat_cycles_now(void)
{
return DWT->CYCCNT;
@@ -205,7 +205,7 @@ void lat_stat_report(const char *p_seg, const lat_stats_t *p,
* TEST_LATENCY_PROBE 探针(M2/M3)
*
* netTask 上下文(net_socket.c 发送分块循环)向 testTask 报告段内
* 打点(L3 chunk_wait 等调用方侧无法测量的段)。
* 打点(CHUNK_WAIT chunk_wait 等调用方侧无法测量的段)。
* 并发模型:单写者(netTask)/单读者(testTask);
* - s_probe_n 为 32 位(Cortex-M4 单字读写原子,无锁)
* - 样本写入 → n++ 的顺序保证读者看到一致的 (n, samples[0..n))
@@ -352,12 +352,12 @@ const lat_stats_t *lat_probe_stats(void)
#endif /* TEST_LATENCY_PROBE */
/* ============================================================
* Phase 12 — SPI 时延基线(L1/L2,硬件层模式,无需 PC)
* Phase 12 — SPI 时延基线(SPI_CMD/SPI_DMA,硬件层模式,无需 PC)
*
* 测量对象(见 链路延迟测试说明.md §3):
* L1 SPI 字节命令 —— 3 个代表性命令的完整 SPI 事务时长
* SPI_CMD SPI 字节命令 —— 3 个代表性命令的完整 SPI 事务时长
* (公开函数内部含 spi_begin/spi_end,即一次完整事务)
* L2 SPI DMA —— ch395f_read_recv_buf(N) 完整 DMA 事务
* SPI_DMA SPI DMA —— ch395f_read_recv_buf(N) 完整 DMA 事务
* (读方向:MCU 主发时钟,芯片侧输出内容不影响传输时长;
* 硬件层模式 socket 未打开,读方向不改芯片任何状态,
* 保持非侵入。写方向 DMA 机制相同(s_spi2_dma_tx_buf),
@@ -369,11 +369,11 @@ const lat_stats_t *lat_probe_stats(void)
* ============================================================ */
#ifdef ENABLE_PHASE12_TESTS
#define LAT_P12_CMD_N 100U /* L1 每命令样本数 */
#define LAT_P12_DMA_N 100U /* L2 每长度档样本数 */
#define LAT_P12_DMA_LEN_MAX 2048U /* L2 单发上限 = CH395F_SPI_DMA_MAX_PAYLOAD */
#define LAT_P12_CMD_N 100U /* SPI_CMD 每命令样本数 */
#define LAT_P12_DMA_N 100U /* SPI_DMA 每长度档样本数 */
#define LAT_P12_DMA_LEN_MAX 2048U /* SPI_DMA 单发上限 = CH395F_SPI_DMA_MAX_PAYLOAD */
/* L1 阈值(us)—— 2026-09-22 台架首跑后重锁(实测 med 10~15us;
/* SPI_CMD 阈值(us)—— 2026-09-22 台架首跑后重锁(实测 med 10~15us;
* warn ≈ 2×med,crit ≈ 2×warn,见 链路延迟测试说明.md §6.1) */
#define LAT_P12_CMD_WARN_US 40U
#define LAT_P12_CMD_FAIL_US 100U
@@ -409,7 +409,7 @@ void net_latency_phase12_run(void)
* 前序阶段已打印的 TEST_REPORT,使 Phase 12 计数独立清晰 */
memset(&g_test_stats, 0U, sizeof(g_test_stats));
DBG_INFO("=== CH395F Phase 12 Tests (link latency baseline, L1/L2) ===");
DBG_INFO("=== CH395F Phase 12 Tests (link latency baseline, SPI_CMD/SPI_DMA) ===");
lat_time_init();
DBG_INFO("[LAT] run_id=%lu phase=12", (unsigned long)HAL_GetTick());
@@ -434,7 +434,7 @@ void net_latency_phase12_run(void)
memset(s_dma_buf, 0U, sizeof(s_dma_buf));
/* ---- L1:SPI 字节命令时延(3 个代表性命令 × 100) ---- */
/* ---- SPI_CMD:SPI 字节命令时延(3 个代表性命令 × 100) ---- */
for (i = 0U; i < 3U; i++) {
lat_stat_reset(&st);
for (k = 0U; k < LAT_P12_CMD_N; k++) {
@@ -463,7 +463,7 @@ void net_latency_phase12_run(void)
}
}
/* ---- L2:SPI DMA 时延(4 档长度 × 100) ---- */
/* ---- SPI_DMA:SPI DMA 时延(4 档长度 × 100) ---- */
for (i = 0U; i < 4U; i++) {
lat_stat_reset(&st);
for (k = 0U; k < LAT_P12_DMA_N; k++) {
@@ -506,35 +506,35 @@ void net_latency_phase12_run(void)
#ifdef ENABLE_PHASE13_TESTS
/* ====================================================================
* Phase 13 — 芯片 + 队列时延(L3~L7/L10,需 PC peer,M2)
* Phase 13 — 芯片 + 队列时延(CHUNK_WAIT~FRAME_RT/LOGTAX,需 PC peer,M2)
*
* 由 net_layer_test_main() 监听循环(8080 端口,~10ms 节拍)事件驱动。
* 服务器驱动协议:MCU 发操作字节,peer(test/latency_peer.py --mode net)
* 执行对应流量;段完成后 MCU 打 [LAT] 报告行并推进下一操作。
*
* 段定义(说明文档 §1):
* L5 queue_rt_recv / queue_rt_send —— 调用方视角 net_recv/net_send
* QUEUE_RT queue_rt_recv / queue_rt_send —— 调用方视角 net_recv/net_send
* 全程(入队 + netTask 调度 + 处理 + 通知),静默基线档;
* 压力档 = peer --ftp-stress(lftpd 阻塞读占住 netTask → 头阻塞复现)
* L6 req2first_mcu —— 请求收齐 → 应答发送完成(MCU 侧,含队列+1 chunk)
* L7 fullframe_mcu —— 9B LCDMEM 请求 → 3209B 全帧发送完成
* ECHO_RT req2first_mcu —— 请求收齐 → 应答发送完成(MCU 侧,含队列+1 chunk)
* FRAME_RT fullframe_mcu —— 9B LCDMEM 请求 → 3209B 全帧发送完成
* (netTask 内 4 次分块停止等待,= 生产路径发送段)
* L3 chunk_wait —— netTask 内"写发送缓冲 → SENBUF_FREE"等待
* CHUNK_WAIT chunk_wait —— netTask 内"写发送缓冲 → SENBUF_FREE"等待
* (调用方不可见,经 TEST_LATENCY_PROBE 探针,见 net_socket.c)
* L10 logtax_line —— 一行 60 字符 printf(fputc 逐字节 @115200)
* LOGTAX logtax_line —— 一行 60 字符 printf(fputc 逐字节 @115200)
*
* 执行顺序(2026-09-22 run3 后重排):L5 → L3 → L10 → L6 → L7 ——
* 失步敏感的小帧 RX 协议段(L6/L7)放最后,先锁住抗失步段的基线。
* 对端侧(L4 线上传输/整帧到达/尖峰)由 peer JSON 报告,按主机时间戳关联。
* 执行顺序(2026-09-22 run3 后重排):QUEUE_RT → CHUNK_WAIT → LOGTAX → ECHO_RT → FRAME_RT ——
* 失步敏感的小帧 RX 协议段(ECHO_RT/FRAME_RT)放最后,先锁住抗失步段的基线。
* 对端侧(TO_PC 线上传输/整帧到达/尖峰)由 peer JSON 报告,按主机时间戳关联。
*
* 阈值:初始值,台架首跑后重锁(说明文档 §4.2)。
* 独立运行:与其他 Phase 共用 8080 socket,混跑会污染帧测量。
* ==================================================================== */
#define LAT_P13_SAMPLES 10U /* L6/L7 每段样本数(2026-09-22 run3 实证:L6 50 轮
#define LAT_P13_SAMPLES 10U /* ECHO_RT/FRAME_RT 每段样本数(2026-09-22 run3 实证:ECHO_RT 50 轮
* 小交换后芯片 TCP 失步 → TX 停滞 + 重复递交 9B 碎片
* → 降至 10,先取干净基线再量化失步边界) */
#define LAT_P13_L5_CHUNKS 20U /* L5 flood 块数(2026-09-22 run1 实证:50×100B@5ms
#define LAT_P13_L5_CHUNKS 20U /* QUEUE_RT flood 块数(2026-09-22 run1 实证:50×100B@5ms
* 达 20KB/s 饱和芯片接收缓冲 → 窗口关闭重传 →
* 重复递交 11884/5000B → 对端 RST;降至 1KB/s
* 静默档,见 §6.2 M2 基线) */
@@ -592,7 +592,7 @@ static uint8_t s_p13_hello_n = 0U;
static int s_p13_verdict_all = LAT_VERDICT_OK;
static int s_p13_seg_force_fail = 0; /* 当前段出现短写/错误 → 强制 FAIL */
static uint32_t s_p13_start_tick;
static uint32_t s_p13_step_tick; /* L6/L7 单样本等待计时 */
static uint32_t s_p13_step_tick; /* ECHO_RT/FRAME_RT 单样本等待计时 */
static uint32_t s_p13_stage;
static uint32_t s_p13_rx_bytes;
static uint16_t s_p13_l6rx_n;
@@ -600,12 +600,12 @@ static uint16_t s_p13_l7rx_n;
static lat_stats_t s_p13_st;
static uint8_t s_p13_rx[LAT_P13_RECV_LEN];
static uint8_t s_p13_tx[LAT_P13_L3_SEND_LEN]; /* L5/L3 flood 载荷(模式预填) */
static uint8_t s_p13_frame[LAT_P13_FRAME_LEN]; /* L7 应答帧(建一次) */
static uint8_t s_p13_tx[LAT_P13_L3_SEND_LEN]; /* QUEUE_RT/CHUNK_WAIT flood 载荷(模式预填) */
static uint8_t s_p13_frame[LAT_P13_FRAME_LEN]; /* FRAME_RT 应答帧(建一次) */
static uint8_t s_p13_l6rx[LAT_P13_L6_SIZE];
static uint8_t s_p13_l7rx[LAT_P13_L7_REQ_LEN];
/* 构造 L7 应答帧(严格照生产 RemoDispBus 帧格式,ui_net_sink.c remo_send):
/* 构造 FRAME_RT 应答帧(严格照生产 RemoDispBus 帧格式,ui_net_sink.c remo_send):
* [TAG=0xBB][CMD=0x03][LEN=3204 大端][DATA = 偏移u32(0) + 1bpp 位图 3200B][CRC]
* CRC = 仅对 DATA 段(3204B)逐字节异或;整帧 = 4 + 3204 + 1 = 3209B */
static void p13_build_frame(void)
@@ -699,7 +699,7 @@ static void p13_abort(const char *p_why)
s_p13_state = P13_ST_ABORT;
}
/* HELLO 确认后的公共入口(首连与重启共用):复位会话进度 → 发 op 0x01 进 L5 */
/* HELLO 确认后的公共入口(首连与重启共用):复位会话进度 → 发 op 0x01 进 QUEUE_RT */
static void p13_on_hello(int32_t sockfd)
{
s_p13_hello_n = 0U;
@@ -722,7 +722,7 @@ static void p13_reinit(void)
lat_probe_disarm();
}
#endif
s_p13_state = P13_ST_HELLO; /* 由 p13_on_hello 覆盖为 L5_RECV */
s_p13_state = P13_ST_HELLO; /* 由 p13_on_hello 覆盖为 QUEUE_RT_RECV */
s_p13_stage = 0U;
s_p13_rx_bytes = 0U;
s_p13_l6rx_n = 0U;
@@ -772,7 +772,7 @@ void net_latency_phase13_run(int32_t sockfd)
s_p13_rx[i + 2U] == 0x58U && s_p13_rx[i + 3U] == 0x01U) {
p13_reinit();
DBG_INFO("[LAT] peer re-HELLO -> session restart");
p13_on_hello(sockfd); /* HELLO 已消耗 → 直接进 L5 并回 op */
p13_on_hello(sockfd); /* HELLO 已消耗 → 直接进 QUEUE_RT 并回 op */
break;
}
}
@@ -794,7 +794,7 @@ void net_latency_phase13_run(int32_t sockfd)
for (i = 0U; i < LAT_P13_L3_SEND_LEN; i++) {
s_p13_tx[i] = (uint8_t)(i & 0xFFU);
}
DBG_INFO("=== CH395F Phase 13 Tests (chip+queue latency, L3~L7/L10) ===");
DBG_INFO("=== CH395F Phase 13 Tests (chip+queue latency, CHUNK_WAIT~FRAME_RT/LOGTAX) ===");
DBG_INFO("[LAT] run_id=%lu phase=13 cal core_clk=%lu us_per_1024cyc=%lu",
(unsigned long)HAL_GetTick(),
(unsigned long)SystemCoreClock,
@@ -836,14 +836,14 @@ void net_latency_phase13_run(int32_t sockfd)
break;
}
/* ---- L5 静默基线:peer flood 50×100B,MCU 逐次 DONTWAIT 收取 ----
/* ---- QUEUE_RT 静默基线:peer flood 50×100B,MCU 逐次 DONTWAIT 收取 ----
* 仅对"收到数据"的调用计时(队列往返 + netTask SPI 读);空轮询不采样 */
case P13_ST_L5_RECV: {
c0 = lat_cycles_now();
n = net_recv(sockfd, s_p13_rx, (int)sizeof(s_p13_rx), NET_MSG_DONTWAIT);
us = lat_cycles_diff_us(c0);
if (n == 0) {
p13_abort("peer connection closed (L5 recv)");
p13_abort("peer connection closed (QUEUE_RT recv)");
return;
}
if (n > 0) {
@@ -855,7 +855,7 @@ void net_latency_phase13_run(int32_t sockfd)
* 超容差即判 FAIL 并落 partial 报告(段内数据仍记录) */
if (s_p13_rx_bytes >
(LAT_P13_L5_CHUNKS * LAT_P13_L5_CHUNK_LEN) + (2U * LAT_P13_RECV_LEN)) {
p13_abort("L5 duplicate delivery (CH395F TCP retransmit re-delivery)");
p13_abort("QUEUE_RT duplicate delivery (CH395F TCP retransmit re-delivery)");
return;
}
if (s_p13_rx_bytes >= (LAT_P13_L5_CHUNKS * LAT_P13_L5_CHUNK_LEN)) {
@@ -864,14 +864,14 @@ void net_latency_phase13_run(int32_t sockfd)
s_p13_stage = 0U;
lat_stat_reset(&s_p13_st);
if (p13_send_op(sockfd, LAT_P13_OP_L5_SEND) == 0U) {
p13_abort("L5->L5SEND op send failed (peer desync)");
p13_abort("QUEUE_RT->QUEUE_RT_SEND op send failed (peer desync)");
return;
}
}
break;
}
/* ---- L5 静默基线:MCU 阻塞 net_send 50×100B(调用即含队列往返全程) ----
/* ---- QUEUE_RT 静默基线:MCU 阻塞 net_send 50×100B(调用即含队列往返全程) ----
* 阻塞调用经 xTaskNotifyWait 让出 → netTask(Normal) 自然抢占,无额外延迟 */
case P13_ST_L5_SEND: {
while (s_p13_stage < LAT_P13_L5_CHUNKS) {
@@ -881,7 +881,7 @@ void net_latency_phase13_run(int32_t sockfd)
if (n != (int32_t)LAT_P13_L5_CHUNK_LEN) {
s_p13_seg_force_fail = 1;
#if defined(TEST_LATENCY_PROBE)
DBG_INFO("[LAT] L5 send unexpected n=%d stage=%u",
DBG_INFO("[LAT] QUEUE_RT send unexpected n=%d stage=%u",
(int)n, (unsigned)s_p13_stage);
#endif
}
@@ -889,19 +889,19 @@ void net_latency_phase13_run(int32_t sockfd)
s_p13_stage++;
}
p13_report_seg("queue_rt_send", LAT_P13_QRT_WARN_US, LAT_P13_QRT_CRIT_US, 0U);
/* run3 重排:先 L3(纯 TX flood,1s 超时保护下不挂死)+ L10(本地),
* 后 L6/L7(RX 协议段;run3 实证芯片 TCP 对小帧交换易失步 → 靠后并降样本数) */
/* run3 重排:先 CHUNK_WAIT(纯 TX flood,1s 超时保护下不挂死)+ LOGTAX(本地),
* 后 ECHO_RT/FRAME_RT(RX 协议段;run3 实证芯片 TCP 对小帧交换易失步 → 靠后并降样本数) */
s_p13_state = P13_ST_L3;
s_p13_stage = 0U;
break;
}
/* ---- L6:每样本一轮 op→10B 请求→10B 回显(MCU 侧:收齐→发出) ---- */
/* ---- ECHO_RT:每样本一轮 op→10B 请求→10B 回显(MCU 侧:收齐→发出) ---- */
case P13_ST_L6: {
n = net_recv(sockfd, s_p13_l6rx + s_p13_l6rx_n,
(int)(LAT_P13_L6_SIZE - s_p13_l6rx_n), NET_MSG_DONTWAIT);
if (n == 0) {
p13_abort("peer connection closed (L6)");
p13_abort("peer connection closed (ECHO_RT)");
return;
}
if (n > 0) {
@@ -914,7 +914,7 @@ void net_latency_phase13_run(int32_t sockfd)
if (n != (int32_t)LAT_P13_L6_SIZE) {
s_p13_seg_force_fail = 1;
#if defined(TEST_LATENCY_PROBE)
DBG_INFO("[LAT] L6 echo unexpected n=%d stage=%u",
DBG_INFO("[LAT] ECHO_RT echo unexpected n=%d stage=%u",
(int)n, (unsigned)s_p13_stage);
#endif
}
@@ -933,18 +933,18 @@ void net_latency_phase13_run(int32_t sockfd)
(void)p13_send_op(sockfd, LAT_P13_OP_L6);
}
} else if ((HAL_GetTick() - s_p13_step_tick) > LAT_P13_SAMPLE_T_MS) {
p13_abort("L6 peer timeout");
p13_abort("ECHO_RT peer timeout");
return;
}
break;
}
/* ---- L7:9B LCDMEM 请求 → 3209B 全帧(netTask 内 4 分块停止等待) ---- */
/* ---- FRAME_RT:9B LCDMEM 请求 → 3209B 全帧(netTask 内 4 分块停止等待) ---- */
case P13_ST_L7: {
n = net_recv(sockfd, s_p13_l7rx + s_p13_l7rx_n,
(int)(LAT_P13_L7_REQ_LEN - s_p13_l7rx_n), NET_MSG_DONTWAIT);
if (n == 0) {
p13_abort("peer connection closed (L7)");
p13_abort("peer connection closed (FRAME_RT)");
return;
}
if (n > 0) {
@@ -965,7 +965,7 @@ void net_latency_phase13_run(int32_t sockfd)
len16 != 4U || crc != s_p13_l7rx[8U] ||
s_p13_l7rx[4U] != 0U || s_p13_l7rx[5U] != 0U ||
s_p13_l7rx[6U] != 0U || s_p13_l7rx[7U] != 0U) {
p13_abort("L7 bad request frame");
p13_abort("FRAME_RT bad request frame");
return;
}
}
@@ -979,8 +979,8 @@ void net_latency_phase13_run(int32_t sockfd)
s_p13_stage++;
if (s_p13_stage >= LAT_P13_SAMPLES) {
p13_report_seg("fullframe_mcu", LAT_P13_FF_WARN_US, LAT_P13_FF_CRIT_US, 0U);
/* L7 为末段(run3 重排后的最终顺序:L5→L3→L10→L6→L7→DONE);
* 此处若回跳 L3 会形成 L3→L10→L6→L7 无限循环、永不下发 0xFF,
/* FRAME_RT 为末段(run3 重排后的最终顺序:QUEUE_RT→CHUNK_WAIT→LOGTAX→ECHO_RT→FRAME_RT→DONE);
* 此处若回跳 CHUNK_WAIT 会形成 CHUNK_WAIT→LOGTAX→ECHO_RT→FRAME_RT 无限循环、永不下发 0xFF,
* peer 只能等 300s 超时(run11 实证) */
s_p13_state = P13_ST_DONE;
s_p13_stage = 0U;
@@ -990,14 +990,14 @@ void net_latency_phase13_run(int32_t sockfd)
(void)p13_send_op(sockfd, LAT_P13_OP_L7);
}
} else if ((HAL_GetTick() - s_p13_step_tick) > LAT_P13_SAMPLE_T_MS) {
p13_abort("L7 peer timeout");
p13_abort("FRAME_RT peer timeout");
return;
}
break;
}
#if defined(TEST_LATENCY_PROBE)
/* ---- L3:探针武装 + 32×4KB 发送 flood(= 128 chunk 样本) ----
/* ---- CHUNK_WAIT:探针武装 + 32×4KB 发送 flood(= 128 chunk 样本) ----
* chunk_wait 在 netTask 内测量(写发送缓冲 → SENBUF_FREE),
* 调用方侧不可见 → 必须经 net_socket.c 探针(TEST_LATENCY_PROBE) */
case P13_ST_L3: {
@@ -1010,7 +1010,7 @@ void net_latency_phase13_run(int32_t sockfd)
if (n != (int32_t)LAT_P13_L3_SEND_LEN) {
s_p13_seg_force_fail = 1;
#if defined(TEST_LATENCY_PROBE)
DBG_INFO("[LAT] L3 send unexpected n=%d stage=%u",
DBG_INFO("[LAT] CHUNK_WAIT send unexpected n=%d stage=%u",
(int)n, (unsigned)s_p13_stage);
#endif
}
@@ -1055,7 +1055,7 @@ void net_latency_phase13_run(int32_t sockfd)
}
#endif /* TEST_LATENCY_PROBE */
/* ---- L10:一行 60 字符 printf 的耗时(fputc 逐字节 @115200,D6 量化) ---- */
/* ---- LOGTAX:一行 60 字符 printf 的耗时(fputc 逐字节 @115200,D6 量化) ---- */
case P13_ST_L10: {
static char s_line[64];
if (s_p13_stage == 0U) {
@@ -1069,8 +1069,8 @@ void net_latency_phase13_run(int32_t sockfd)
s_p13_stage++;
}
p13_report_seg("logtax_line", LAT_P13_LT_WARN_US, LAT_P13_LT_CRIT_US, 0U);
/* L6 前清空 socket 残留(重传/重复递交字节,run1 实证 6884B、run3 实证 9B 碎片):
* 残留会与 L6/L7 的请求帧错位混读 → 协议失步。此窗口对端静默
/* ECHO_RT 前清空 socket 残留(重传/重复递交字节,run1 实证 6884B、run3 实证 9B 碎片):
* 残留会与 ECHO_RT/FRAME_RT 的请求帧错位混读 → 协议失步。此窗口对端静默
* (对端只在收到操作字节后才发包),DONTWAIT 抽干即安全。 */
{
int32_t d;
@@ -1084,7 +1084,7 @@ void net_latency_phase13_run(int32_t sockfd)
drained += (uint32_t)d;
}
if (drained > 0U) {
DBG_INFO("[LAT] note: drained %u residual bytes before L6 (retransmit/duplicate)",
DBG_INFO("[LAT] note: drained %u residual bytes before ECHO_RT (retransmit/duplicate)",
(unsigned)drained);
}
}
@@ -1125,7 +1125,7 @@ void net_latency_phase13_run(int32_t sockfd)
#ifdef ENABLE_PHASE14_TESTS
/* ====================================================================
* Phase 14 — 生产路径时延(L8~L11,M3)
* Phase 14 — 生产路径时延(PROD_CYCLE~UI_LOOP,M3)
*
* 与 Phase 13 的关键区别:**不占用测试 socket**,测的是真实生产路径
* (uiTask + ui_net_sink :7003 + 真实 LVGL 取帧),由 PC 端
@@ -1222,7 +1222,7 @@ void net_latency_phase14_run(void)
s_p14_banner = 1U;
s_p14_start_tick = HAL_GetTick();
lat_time_init(); /* DWT CYCCNT 使能(漏调则所有样本恒 0) */
DBG_INFO("=== CH395F Phase 14 Tests (prod-path latency, L8~L11) ===");
DBG_INFO("=== CH395F Phase 14 Tests (prod-path latency, PROD_CYCLE~UI_LOOP) ===");
DBG_INFO("[LAT] run_id=%lu phase=14 cal core_clk=%lu us_per_1024cyc=%lu",
(unsigned long)s_p14_start_tick,
(unsigned long)SystemCoreClock,