移除 P0-a 验收探针(台架验收完成),开机省去 60ms 状态轮询与证据行
This commit is contained in:
@@ -121,10 +121,6 @@ int net_stack_bring_up(void) {
|
|||||||
(phy == CH395F_PHY_10M_HALF) ? "10M HALF" :
|
(phy == CH395F_PHY_10M_HALF) ? "10M HALF" :
|
||||||
(phy == CH395F_PHY_DISCONN) ? "DISCONNECT" : "UNKNOWN");
|
(phy == CH395F_PHY_DISCONN) ? "DISCONNECT" : "UNKNOWN");
|
||||||
|
|
||||||
/* P0-a 证据行:重传周期芯片验收状态(net_init 静默采集,此处延迟打印——
|
|
||||||
* 本位置与 testTask 启动日志无并发窗口,不会触发 UART 丢行) */
|
|
||||||
net_retrans_status_log();
|
|
||||||
|
|
||||||
/* 自检埋点:链路超时未建立 → 记入自检记录(仅故障才写) */
|
/* 自检埋点:链路超时未建立 → 记入自检记录(仅故障才写) */
|
||||||
if (phy == CH395F_PHY_DISCONN) {
|
if (phy == CH395F_PHY_DISCONN) {
|
||||||
syslog_post(SYSLOG_SELFTEST, "comms fault");
|
syslog_post(SYSLOG_SELFTEST, "comms fault");
|
||||||
|
|||||||
@@ -40,7 +40,6 @@
|
|||||||
static net_sock_t s_net_socks[NET_MAX_SOCKETS]; /* Socket 控制块数组 */
|
static net_sock_t s_net_socks[NET_MAX_SOCKETS]; /* Socket 控制块数组 */
|
||||||
static int s_net_errno = 0; /* 最后错误码 */
|
static int s_net_errno = 0; /* 最后错误码 */
|
||||||
static uint8_t s_net_initialized = 0; /* 初始化标志 */
|
static uint8_t s_net_initialized = 0; /* 初始化标志 */
|
||||||
static uint8_t s_retrans_cmd_status = 0xFFU; /* P0-a:重传周期 GET_CMD_STATUS 验收结果(0xFF=未采集) */
|
|
||||||
static uint8_t s_local_ip[4]; /* 本机 IP 缓存(网络序,net_getsockname 用) */
|
static uint8_t s_local_ip[4]; /* 本机 IP 缓存(网络序,net_getsockname 用) */
|
||||||
static uint16_t s_dynamic_port = 49152; /* 动态端口分配起始值 */
|
static uint16_t s_dynamic_port = 49152; /* 动态端口分配起始值 */
|
||||||
static volatile uint32_t s_net_generation = 0; /* 网络代次号:网络重建完成时递增(服务据此重建监听) */
|
static volatile uint32_t s_net_generation = 0; /* 网络代次号:网络重建完成时递增(服务据此重建监听) */
|
||||||
@@ -147,31 +146,12 @@ static bool s_mac_is_zero(const uint8_t *p_mac) {
|
|||||||
* MSS 真值源为 ch395f.h 的 CH395F_TCP_MSS,DMA 缓冲大小亦由其推导。 */
|
* MSS 真值源为 ch395f.h 的 CH395F_TCP_MSS,DMA 缓冲大小亦由其推导。 */
|
||||||
ch395f_set_tcp_mss(CH395F_TCP_MSS);
|
ch395f_set_tcp_mss(CH395F_TCP_MSS);
|
||||||
|
|
||||||
/* 设置 TCP 重传参数(必须在 INIT_CH395 之前调用*/
|
/* 设置 TCP 重传参数(必须在 INIT_CH395 之前调用;P0-a:周期 500→200ms。
|
||||||
|
* 台架验收 2026-09-22 完成:GET_CMD_STATUS 对 SET 类命令无判别力(500/2000ms
|
||||||
|
* 行为一致,均为 RESET_ALL 的陈旧 BUSY 残留),值的接受性以手册范围(≤1000ms)
|
||||||
|
* + 全套件无回归为准——验收探针已移除,结论见《链路延迟测试说明》§10.1 D1 */
|
||||||
ch395f_set_retrans_count(NET_RETRANS_COUNT);
|
ch395f_set_retrans_count(NET_RETRANS_COUNT);
|
||||||
ch395f_set_retrans_period(NET_RETRANS_PERIOD_MS);
|
ch395f_set_retrans_period(NET_RETRANS_PERIOD_MS);
|
||||||
/* P0-a 一次性验收(手册无重传参数回读命令):设置命令之后查 GET_CMD_STATUS。
|
|
||||||
* 实测(2026-09-22 台架,500ms 合法值与 2000ms 超限值行为完全一致):
|
|
||||||
* SET 类命令不更新状态寄存器——读到的是 RESET_ALL 的 0x10(BUSY) 陈旧残留
|
|
||||||
* (ch395f_reset 只延时 20ms、不轮询状态);INIT 类长命令才重写寄存器。
|
|
||||||
* 故 3 次 × 20ms 轮询即可捕获真正的值/参数错误码(0x19/0x1A 等),
|
|
||||||
* 0x10 只证明"寄存器未更新",不构成值判据——值的接受性以
|
|
||||||
* 手册范围(≤1000ms)+ 全套件无回归 + 与 500ms 行为一致为准。
|
|
||||||
* 注意:此处只静默捕获状态,不打日志——本窗口与 testTask 启动日志并发,
|
|
||||||
* 并发 printf 会因非重入 UART 发送丢整行(2026-09-22 台架实测);
|
|
||||||
* 打印延迟到 net_stack_bring_up 的 PHY 行之后(net_retrans_status_log)。 */
|
|
||||||
{
|
|
||||||
uint8_t rto_st = CH395F_ERR_BUSY;
|
|
||||||
|
|
||||||
for (uint32_t i = 0U; i < 3U; i++) {
|
|
||||||
osDelay(20U);
|
|
||||||
rto_st = ch395f_get_cmd_status();
|
|
||||||
if (rto_st != CH395F_ERR_BUSY) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s_retrans_cmd_status = rto_st;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 设置 TCP KeepAlive 参数(必须在 INIT_CH395 之前,单位 ms,必须为 500 的倍数,且 IDLE > INTVL)
|
/* 设置 TCP KeepAlive 参数(必须在 INIT_CH395 之前,单位 ms,必须为 500 的倍数,且 IDLE > INTVL)
|
||||||
* 值来自 net_config.h 的 NET_KEEPALIVE_*(60s/5s/3)*/
|
* 值来自 net_config.h 的 NET_KEEPALIVE_*(60s/5s/3)*/
|
||||||
@@ -239,34 +219,6 @@ static bool s_mac_is_zero(const uint8_t *p_mac) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* 函数功能:打印 P0-a 重传周期芯片验收证据行(一次性)
|
|
||||||
* 入口参数:无
|
|
||||||
* 返 回 值:无
|
|
||||||
* 限定条件:net_init 之后调用;建议放在 net_stack_bring_up 的 PHY 行之后
|
|
||||||
* (启动日志低并发窗口)——net_init 尾部与其它任务启动日志并发时,
|
|
||||||
* 非重入 UART 发送会丢整行(2026-09-22 台架实测)
|
|
||||||
* 函数说明:三分支判读(实测 2026-09-22:SET 类命令不更新状态寄存器):
|
|
||||||
* 0x00 = 芯片明确报告接受;0x10 = 陈旧 BUSY 残留(无判别力,INFO 级,
|
|
||||||
* 避免健康启动误触 [ERR] 标记);其它状态码 = 真值/参数错误(ERROR 级)
|
|
||||||
*/
|
|
||||||
void net_retrans_status_log(void) {
|
|
||||||
if (s_retrans_cmd_status == 0xFFU) {
|
|
||||||
return; /* 本次启动未走 NET 层 bring_up(如硬件层测试模式) */
|
|
||||||
}
|
|
||||||
if (s_retrans_cmd_status == CH395F_ERR_SUCCESS) {
|
|
||||||
DBG_INFO("net_init: retrans %u x %u ms accepted by chip (status=0x00)",
|
|
||||||
(unsigned)NET_RETRANS_COUNT, (unsigned)NET_RETRANS_PERIOD_MS);
|
|
||||||
} else if (s_retrans_cmd_status == CH395F_ERR_BUSY) {
|
|
||||||
DBG_INFO("net_init: retrans %u x %u ms set (status 0x10 = stale residue, inconclusive)",
|
|
||||||
(unsigned)NET_RETRANS_COUNT, (unsigned)NET_RETRANS_PERIOD_MS);
|
|
||||||
} else {
|
|
||||||
DBG_ERROR("net_init: retrans period %u ms REJECTED by chip (cmd status=0x%02X)",
|
|
||||||
(unsigned)NET_RETRANS_PERIOD_MS, (unsigned)s_retrans_cmd_status);
|
|
||||||
}
|
|
||||||
s_retrans_cmd_status = 0xFFU; /* 只打印一次 */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 函数功能:取网络代次号
|
* 函数功能:取网络代次号
|
||||||
* 入口参数:无
|
* 入口参数:无
|
||||||
|
|||||||
@@ -74,17 +74,6 @@ typedef struct {
|
|||||||
*/
|
*/
|
||||||
int net_init(const char *ip, const char *mask, const char *gateway, const uint8_t *mac);
|
int net_init(const char *ip, const char *mask, const char *gateway, const uint8_t *mac);
|
||||||
|
|
||||||
/*
|
|
||||||
* 函数功能:打印 P0-a 重传周期芯片验收证据行(一次性)
|
|
||||||
* 入口参数:无
|
|
||||||
* 返回值:无
|
|
||||||
* 限定条件:net_init() 之后;建议放在 net_stack_bring_up() 的 PHY 行之后
|
|
||||||
* 函数说明:net_init 在设置重传参数后立即静默查询 GET_CMD_STATUS(手册无回读
|
|
||||||
* 命令,此状态是"芯片是否接受该周期"的唯一证据);打印延迟到 PHY 行
|
|
||||||
* 之后,避开启动期多任务并发 printf 丢行
|
|
||||||
*/
|
|
||||||
void net_retrans_status_log(void);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 函数功能:取网络代次号
|
* 函数功能:取网络代次号
|
||||||
* 入口参数:无
|
* 入口参数:无
|
||||||
|
|||||||
@@ -634,7 +634,7 @@ sock4 auto-relisten ok / relisten retry ok ← 监听器随后自行恢复
|
|||||||
| **L7 一直超时 / peer 报 `l7_crc.fail`** | **D15**:帧格式不一致 / peer 超读 | 对照 `ui_net_sink.c` 的 `remo_send`/`remo_handle`(§8.1 D15) |
|
| **L7 一直超时 / peer 报 `l7_crc.fail`** | **D15**:帧格式不一致 / peer 超读 | 对照 `ui_net_sink.c` 的 `remo_send`/`remo_handle`(§8.1 D15) |
|
||||||
| **会话跑完一段后无限循环、peer 空等 300s** | **D16**:Phase 13 状态机迁移目标错 | 核对顺序 L5→L3→L10→L6→L7→DONE(§8.1 D16) |
|
| **会话跑完一段后无限循环、peer 空等 300s** | **D16**:Phase 13 状态机迁移目标错 | 核对顺序 L5→L3→L10→L6→L7→DONE(§8.1 D16) |
|
||||||
| **`[LAT]` 段行缺失/截断、wait-idle 判不出空闲** | **D12-b**:热路径日志洪水 | 删除 net 热路径逐调用日志(§8.1 D12-b) |
|
| **`[LAT]` 段行缺失/截断、wait-idle 判不出空闲** | **D12-b**:热路径日志洪水 | 删除 net 热路径逐调用日志(§8.1 D12-b) |
|
||||||
| **开机日志连续丢行**(含必检标记 `net init: OK` 等)但系统健康 | **日志并发竞态**:多任务并发 `printf` → 非重入 `fputc`/`HAL_UART_Transmit` 丢整行、UART 状态短暂卡住(2026-09-22 台架实证:boot 时 testTask 启动行与 netTask 日志并发 → 连续 4 行丢失、~2s 后自恢复) | 必现证据行采用"静默采集 + 延迟到安静窗口打印"模式(范例:`net_retrans_status_log` 在 PHY 行之后打印);根治 = S8 日志非阻塞/串行化(§10.2) |
|
| **开机日志连续丢行**(含必检标记 `net init: OK` 等)但系统健康 | **日志并发竞态**:多任务并发 `printf` → 非重入 `fputc`/`HAL_UART_Transmit` 丢整行、UART 状态短暂卡住(2026-09-22 台架实证:boot 时 testTask 启动行与 netTask 日志并发 → 连续 4 行丢失、~2s 后自恢复) | 必现证据行采用"静默采集 + 延迟到安静窗口打印"模式(范例:P0-a 验收行曾按此模式实装,验收完成后探针已移除);根治 = S8 日志非阻塞/串行化(§10.2) |
|
||||||
| **`relisten` 段 FAIL、断线固定 ~588ms** | **D10** 回归(退回 `osDelay(500)`) | 核对 `net_relisten_try`/`net_relisten_retry_tick` 非阻塞重试在位(§8.1 D10) |
|
| **`relisten` 段 FAIL、断线固定 ~588ms** | **D10** 回归(退回 `osDelay(500)`) | 核对 `net_relisten_try`/`net_relisten_retry_tick` 非阻塞重试在位(§8.1 D10) |
|
||||||
| **远端显示整帧卡住十几秒后自恢复** | **E-02** 回归 | 核对 `net_recv_to` 5ms 分片 + 让出在位(§8.1 E-02) |
|
| **远端显示整帧卡住十几秒后自恢复** | **E-02** 回归 | 核对 `net_recv_to` 5ms 分片 + 让出在位(§8.1 E-02) |
|
||||||
| **INIT 应答帧字节数字段恒为 0** | **D17** 回归 | 核对 `remo_send_init` 发满 8B(§8.1 D17) |
|
| **INIT 应答帧字节数字段恒为 0** | **D17** 回归 | 核对 `remo_send_init` 发满 8B(§8.1 D17) |
|
||||||
@@ -653,7 +653,7 @@ sock4 auto-relisten ok / relisten retry ok ← 监听器随后自行恢复
|
|||||||
|
|
||||||
| # | 原因 | 实测验证(2026-09-22 台架) | 当前状态 |
|
| # | 原因 | 实测验证(2026-09-22 台架) | 当前状态 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| D1 | CH395F TCP 重传固定周期(非 RTT 自适应) | 台架链路(有线 100M 全双工)多轮零重传尖峰 → 台架无丢包;**弱网(Wi-Fi/双工不匹配)仍是秒级卡顿首要嫌疑**,200ms 粒度台阶 = 重传指纹(旧固件 500ms) | **已修(P0-a,2026-09-22)**:`NET_RETRANS_PERIOD_MS` 500→**200**(窗口 8×200=1.6s,原 4s)。台架验收说明:`GET_CMD_STATUS` 对 SET 类命令无判别力(500/2000ms 超限对照均读 0x10 陈旧残留,§9.2)→ 接受性以手册范围(≤1000ms)+ 全套件零回归(§6.2/§6.3)+ 与 500ms 行为同构为准 |
|
| D1 | CH395F TCP 重传固定周期(非 RTT 自适应) | 台架链路(有线 100M 全双工)多轮零重传尖峰 → 台架无丢包;**弱网(Wi-Fi/双工不匹配)仍是秒级卡顿首要嫌疑**,200ms 粒度台阶 = 重传指纹(旧固件 500ms) | **已修(P0-a,2026-09-22)**:`NET_RETRANS_PERIOD_MS` 500→**200**(窗口 8×200=1.6s,原 4s)。台架验收说明:`GET_CMD_STATUS` 对 SET 类命令无判别力(500/2000ms 超限对照均读 0x10 陈旧残留,§9.2)→ 接受性以手册范围(≤1000ms)+ 全套件零回归(§6.2/§6.3)+ 与 500ms 行为同构为准。验收探针(3×20ms 状态轮询 + 证据行)验收完成后已从代码移除,结论保留于本文档 |
|
||||||
| D2 | 3209B × 1KB 发送 FIFO 停止等待(4 次串行分块握手,期间 netTask 全程占用) | `chunk_wait` 219µs/块 ≈ SPI 搬运成本的 1/7 → 握手本身**不是瓶颈**;每帧固定成本小(MCU 净 7.1ms) | 基线成本,可接受;根治 = 差量/RLE + 帧版本号(待办 S2) |
|
| D2 | 3209B × 1KB 发送 FIFO 停止等待(4 次串行分块握手,期间 netTask 全程占用) | `chunk_wait` 219µs/块 ≈ SPI 搬运成本的 1/7 → 握手本身**不是瓶颈**;每帧固定成本小(MCU 净 7.1ms) | 基线成本,可接受;根治 = 差量/RLE + 帧版本号(待办 S2) |
|
||||||
| D3 | netMsgQueue 头阻塞(= §8.1 E-02) | 已量化:一条空闲 FTP 控制连接冻结全网 17.7s | **已修复**(5ms 分片有界读 + 让出,§8.1) |
|
| D3 | netMsgQueue 头阻塞(= §8.1 E-02) | 已量化:一条空闲 FTP 控制连接冻结全网 17.7s | **已修复**(5ms 分片有界读 + 让出,§8.1) |
|
||||||
| D4 | PC 端延迟 ACK 与"每段等 ACK"停止等待交互 | `--ack-fast` 带内实验证实:关掉延迟 ACK 尾批自行消失(52→3.9ms) | **已客户端侧解决**(生产客户端关延迟 ACK/轻推兜底,§7.4) |
|
| D4 | PC 端延迟 ACK 与"每段等 ACK"停止等待交互 | `--ack-fast` 带内实验证实:关掉延迟 ACK 尾批自行消失(52→3.9ms) | **已客户端侧解决**(生产客户端关延迟 ACK/轻推兜底,§7.4) |
|
||||||
@@ -666,7 +666,7 @@ sock4 auto-relisten ok / relisten retry ok ← 监听器随后自行恢复
|
|||||||
|
|
||||||
1. **D20 数据 Socket 轮换**(§8.2)——唯一未修的功能性缺陷;现场可用客户端重试 425 规避;
|
1. **D20 数据 Socket 轮换**(§8.2)——唯一未修的功能性缺陷;现场可用客户端重试 425 规避;
|
||||||
2. **~~P0-a~~ 已实施(2026-09-22)**:`NET_RETRANS_PERIOD_MS` 500→200 + `GET_CMD_STATUS` 一次性验收检查
|
2. **~~P0-a~~ 已实施(2026-09-22)**:`NET_RETRANS_PERIOD_MS` 500→200 + `GET_CMD_STATUS` 一次性验收检查
|
||||||
(实测该状态对 SET 类命令无判别力,见 §10.1 D1);全套件复验零回归(§6.2/§6.3);
|
(实测该状态对 SET 类命令无判别力,见 §10.1 D1);全套件复验零回归(§6.2/§6.3);验收完成后探针已移除;
|
||||||
3. **~~P0-b~~ 已实施(2026-09-22)**:删除 `net_socket.c` per-recv `DBG_INFO`;实测 `queue_rt_recv` −80%
|
3. **~~P0-b~~ 已实施(2026-09-22)**:删除 `net_socket.c` per-recv `DBG_INFO`;实测 `queue_rt_recv` −80%
|
||||||
(5997→1223µs)、生产帧周期 −4.4ms(66.0→61.6ms)、首字节 −4.3ms(13.9→9.6ms);
|
(5997→1223µs)、生产帧周期 −4.4ms(66.0→61.6ms)、首字节 −4.3ms(13.9→9.6ms);
|
||||||
4. **S1** 超时参数分档:`NET_SEND/RECV_TIMEOUT_MS` 全局一刀切 → 按服务分离(远显短超时+非阻塞,FTP 保留长超时);
|
4. **S1** 超时参数分档:`NET_SEND/RECV_TIMEOUT_MS` 全局一刀切 → 按服务分离(远显短超时+非阻塞,FTP 保留长超时);
|
||||||
@@ -685,7 +685,7 @@ sock4 auto-relisten ok / relisten retry ok ← 监听器随后自行恢复
|
|||||||
13. 协议补位(尾批退路,仅当客户端无法改动时;见 §7.4)。
|
13. 协议补位(尾批退路,仅当客户端无法改动时;见 §7.4)。
|
||||||
14. **日志并发保护(2026-09-22 新增,与 S8 同源、优先级上调)**:开机多任务并发 `printf` 丢整行
|
14. **日志并发保护(2026-09-22 新增,与 S8 同源、优先级上调)**:开机多任务并发 `printf` 丢整行
|
||||||
(实测 §9.2:必检标记 `net init: OK` 曾被竞态吞掉 → 影响开机验收可靠性)。过渡:必现证据行按
|
(实测 §9.2:必检标记 `net init: OK` 曾被竞态吞掉 → 影响开机验收可靠性)。过渡:必现证据行按
|
||||||
"静默采集 + 延迟到安静窗口打印"模式(范例 `net_retrans_status_log`);根治 = S8(串口 TX 环形缓冲
|
"静默采集 + 延迟到安静窗口打印"模式(范例:P0-a 验收行,验收完成后已移除);根治 = S8(串口 TX 环形缓冲
|
||||||
+ 中断/DMA,溢出丢弃策略需定义)。
|
+ 中断/DMA,溢出丢弃策略需定义)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
Reference in New Issue
Block a user