fix(N34): E14 丢中断复核——芯片不丢事件;listen 排事件挪至 LISTEN 前+全局读收口+全库归因更正
48 轮直读 SINT 矩阵(8 周期×6 变体)复核历史"丢中断"说法:芯片侧事件 丢失 = 0。归类:drain 读清消费 3/48(drain-int 探针现场抓获)、门控 竞态 2/48、主机同步 1/48、幽灵态 0/48 未复现。 根除性修复:net_listen_locked / net_listener_try 的排事件读清从 listen 后挪至 LISTEN 命令之前——新连接 CONNECT 落进该窗即被本方读清 吞掉,即"数据被吞"的生产侧自伤机制(台架 3/48 为同形态放大版)。 全局读收口:全局中断寄存器唯一读者 = net_poll(I7);生产/测试/台架 游离全局读全部删除,ch395f.h 声明处加护栏注释。 归因更正:17 文件约 40 处"丢中断"措辞改为"事件未收到/读清消费竞态" (机制全部保留,仅归因更正);设计文档 §5.2 新增 E14 锚点;Trap Records TRAP-NET-17/-20/B3 归因更正段;配图生成器与 SVG 重生成。 台架:事件未收到复核探针保留(drain-int / SINT 补读×3 / 超时归类), 下次跑矩阵自动归类;实验注册(main.c/uvprojx)已完全还原。 验证:@build 0 错误 0 警告;ci_local L0 32/0 + gitlint + L0.5 953/953;doc-links --all --sections-strict 通过;@test PASS(无 [ERR],net init 619ms);回归 :7003 300ms×10 = 10/10、:21 n30×50 = 0/50 失败。
This commit is contained in:
+77
-152
@@ -77,12 +77,9 @@ static void test_parse_ip(const char *str, uint8_t *ip_arr)
|
||||
static void phase1_run(void) {
|
||||
uint8_t ip_info[20];
|
||||
|
||||
/* ---- 前置清全局中断(读即清除) ----
|
||||
* net_stack_bring_up() 在 set_phy(100M_FULL) 强制重协商 + 等待链路建立
|
||||
* 期间,芯片会锁存 GINT_STAT_PHY_CHANGE(0x0004)标志;硬件层模式下无
|
||||
* netTask 轮询消费它,若不清除将导致 P1-06 的"原始状态 0x0000"检查误报。
|
||||
* 此处读取一次丢弃,保证 P1-06 反映的是测试期间的纯净状态。 */
|
||||
(void)ch395f_get_glob_int_status_all();
|
||||
/* 全局中断寄存器读即清,唯一读者 = net_poll(F-NET-7;用户裁定 2026-10-13:
|
||||
* 测试代码同样禁自行读取)。net_stack_bring_up() 的 set_phy 强制重协商会
|
||||
* 锁存 GINT_STAT_PHY_CHANGE(0x0004)——由 P1-06 内部双读自清,不在此预清。 */
|
||||
|
||||
DBG_INFO("=== CH395F Phase 1 Tests ===");
|
||||
DBG_INFO("--- 9 test items (P1-01 ~ P1-09) ---");
|
||||
@@ -180,13 +177,15 @@ static void phase1_run(void) {
|
||||
}
|
||||
|
||||
/* ---- P1-06: ch395f_get_glob_int_status_all()(16 位版) ----
|
||||
* 原理:读取全局中断状态寄存器(2 字节版本,含所有 Socket 中断位)。
|
||||
* 在无任何网络事件的空闲状态下,应为 0x0000。
|
||||
* 通过:返回 0x0000。
|
||||
* 失败:返回非 0x0000(有残留中断,如前序操作异常触发但未清除)。
|
||||
* 注意:此寄存器为读后清零,故先读 16 位版再读 1 字节版。
|
||||
* 全库唯一允许 net_poll 之外读全局寄存器的位置——被测对象就是该 API 本身
|
||||
* (硬件层模式独占上下文,无并发消费者)。读即清语义 → 先读一次自清
|
||||
* (吸收 bring_up 锁存的 PHY_CHANGE),短暂延时后第二次读为断言值。
|
||||
* 通过:第二次读返回 0x0000。
|
||||
* 失败:第二次读非 0x0000(测试期间出现新事件)。
|
||||
*/
|
||||
{
|
||||
(void)ch395f_get_glob_int_status_all(); /* 自清读(被测 API 自身,见上) */
|
||||
HAL_Delay(10);
|
||||
uint16_t gint_all = ch395f_get_glob_int_status_all();
|
||||
DBG_INFO(" [P1-06] ch395f_get_glob_int_status_all()");
|
||||
DBG_INFO(" expect: 0x0000");
|
||||
@@ -330,54 +329,24 @@ static void phase2_tc201(void)
|
||||
|
||||
/* 步4:等待 CONNECT 中断
|
||||
*
|
||||
* CH395F 的中断上报是【两级】结构:
|
||||
*
|
||||
* 第 1 级 —— 全局中断状态 GET_GLOB_INT_STATUS_ALL(16 位,读即清除)
|
||||
* 只回答"哪个 Socket 发生了事件",不回答具体是什么事件。
|
||||
* 16 位布局(见 ch395f.h GINT_STAT 宏定义):
|
||||
* bit0 UNREACH (0x0001) 目标不可达
|
||||
* bit1 IP_CONFLI (0x0002) IP 冲突
|
||||
* bit2 PHY_CHANGE (0x0004) 链路状态变化
|
||||
* bit3 DHCP (0x0008) DHCP 事件
|
||||
* bit4~7 Socket0~3 (0x0010/0x20/0x40/0x80)
|
||||
* bit8~11 Socket4~7 (0x0100~0x0800)
|
||||
* bit15 DHCPV6 (0x8000)
|
||||
*
|
||||
* 第 2 级 —— Socket 中断状态 CMD_GET_INT_STATUS_SN(8 位,读即清除)
|
||||
* 才包含具体事件类型:SENBUF_FREE / SEND_OK / RECV_OK /
|
||||
* CONNECT / DISCONNECT / DISCARD / SOCK_TIMEOUT。
|
||||
* 必须在第 1 级提示"本 Socket 有事件"后再读,否则读了也是空。
|
||||
*
|
||||
* 【掩码 (1U << (sock + 4)) 的由来】
|
||||
* 全局状态的 bit0~3 被 4 个全局事件占用,因此 Socket N 的事件标志
|
||||
* 固定从 bit4 开始排列 —— Socket N 对应第 (N + 4) 位:
|
||||
* sock=0 → 1<<4 = 0x0010(Socket0 事件位,宏已删 N34-0-5)
|
||||
* sock=1 → 1<<5 = 0x0020(Socket1 事件位,宏已删 N34-0-5)
|
||||
* ...
|
||||
* sock=7 → 1<<11 = 0x0800(CH395F_GINT_STAT_SOCK7)
|
||||
* `int_st & (1U << (sock + 4))` 非 0
|
||||
* ⇔ 芯片报告"Socket [sock] 有待处理事件",
|
||||
* 此时才值得再花一次 SPI 事务去读第 2 级确认具体事件。
|
||||
* 直接读本 Socket 中断状态 CMD_GET_INT_STATUS_SN(8 位,读即清)——事件位:
|
||||
* SENBUF_FREE / SEND_OK / RECV_OK / CONNECT / DISCONNECT / DISCARD / SOCK_TIMEOUT。
|
||||
* 不用全局寄存器 GET_GLOB_INT_STATUS_ALL 做门控:它读即清,任何未配对 SINT
|
||||
* 消费的读取都会吞掉事件通知;唯一读者 = net_poll(F-NET-7),测试代码同样
|
||||
* 禁自行读取(用户裁定 2026-10-13)。测试知道自己操作哪个 Socket,直读
|
||||
* SINT 即可——每轮一次 SPI 事务,成本与旧两级方案相同,且观察无门控混淆。
|
||||
*/
|
||||
tick = HAL_GetTick();
|
||||
ok = 0;
|
||||
while (HAL_GetTick() - tick < PHASE2_TIMEOUT_MS) {
|
||||
/* 第 1 级:读全局状态。注意本次读取本身会清掉全部全局标志
|
||||
* 并拉高 INT#(读即清除),所以每轮循环都在重新采样。 */
|
||||
uint16_t int_st = ch395f_get_glob_int_status_all();
|
||||
|
||||
/* 本 Socket 在全局寄存器中有事件挂起? */
|
||||
if (int_st & (1U << (sock + 4))) {
|
||||
/* 第 2 级:读本 Socket 的具体事件类型(同样读即清除) */
|
||||
uint8_t si = ch395f_get_sock_int_status(sock);
|
||||
if (si & CH395F_SINT_STAT_CONNECT) {
|
||||
/* bit3 = 0x08:TCP 三次握手完成,进入 ESTABLISHED */
|
||||
ok = 1;
|
||||
break;
|
||||
}
|
||||
/* 是别的事件(理论上此阶段不应出现),已被读清、直接忽略,
|
||||
* 继续下一轮轮询等 CONNECT */
|
||||
uint8_t si = ch395f_get_sock_int_status(sock);
|
||||
if (si & CH395F_SINT_STAT_CONNECT) {
|
||||
/* bit3 = 0x08:TCP 三次握手完成,进入 ESTABLISHED */
|
||||
ok = 1;
|
||||
break;
|
||||
}
|
||||
/* 是别的事件(理论上此阶段不应出现),已被读清、直接忽略,
|
||||
* 继续下一轮轮询等 CONNECT */
|
||||
HAL_Delay(10); /* 10ms 轮询周期,直至 CONNECT 或超时退出 */
|
||||
}
|
||||
TEST_CHECK(ok, "TC201 step4 connected");
|
||||
@@ -392,13 +361,9 @@ static void phase2_tc201(void)
|
||||
tick = HAL_GetTick();
|
||||
ok = 0;
|
||||
while (HAL_GetTick() - tick < 2000) {
|
||||
uint16_t int_st = ch395f_get_glob_int_status_all();
|
||||
if (int_st & (1U << (sock + 4))) {
|
||||
uint8_t si = ch395f_get_sock_int_status(sock);
|
||||
if (si & CH395F_SINT_STAT_SENBUF_FREE) {
|
||||
ok = 1;
|
||||
break;
|
||||
}
|
||||
if (ch395f_get_sock_int_status(sock) & CH395F_SINT_STAT_SENBUF_FREE) {
|
||||
ok = 1;
|
||||
break;
|
||||
}
|
||||
HAL_Delay(10);
|
||||
}
|
||||
@@ -461,16 +426,12 @@ static void phase2_tc201(void)
|
||||
}
|
||||
|
||||
/* ---- ② 连接异常检查(还没等到数据才走到这里)----
|
||||
* 两级中断:全局状态确认本 Socket 有事件 → 再读具体事件类型。
|
||||
* 注意先查数据再查断开:断开事件可能和最后一批数据同时到达,
|
||||
* 数据优先保证"临终回显"不被漏掉。 */
|
||||
uint16_t int_st = ch395f_get_glob_int_status_all();
|
||||
if (int_st & (1U << (sock + 4))) {
|
||||
uint8_t si = ch395f_get_sock_int_status(sock);
|
||||
if (si & (CH395F_SINT_STAT_DISCONNECT | CH395F_SINT_STAT_SOCK_TIMEOUT)) {
|
||||
break; /* 对端断开 / 超时:继续等也不会有回显了。
|
||||
ok 保持 0,跳出后由下方统一判 FAIL */
|
||||
}
|
||||
* 直读本 Socket SINT(读即清)。先查数据再查断开:断开事件可能和
|
||||
* 最后一批数据同时到达,数据优先保证"临终回显"不被漏掉。 */
|
||||
uint8_t si = ch395f_get_sock_int_status(sock);
|
||||
if (si & (CH395F_SINT_STAT_DISCONNECT | CH395F_SINT_STAT_SOCK_TIMEOUT)) {
|
||||
break; /* 对端断开 / 超时:继续等也不会有回显了。
|
||||
ok 保持 0,跳出后由下方统一判 FAIL */
|
||||
}
|
||||
|
||||
/* 每 50ms 一轮。若本轮只读了部分数据(rlen > 300 的极端情况),
|
||||
@@ -534,11 +495,7 @@ static void phase2_tc202_once(uint8_t sock, uint16_t local_port)
|
||||
tick = HAL_GetTick();
|
||||
ok = 0;
|
||||
while (HAL_GetTick() - tick < PHASE2_TIMEOUT_MS) {
|
||||
uint16_t int_st = ch395f_get_glob_int_status_all();
|
||||
if (int_st & (1U << (sock + 4))) {
|
||||
uint8_t si = ch395f_get_sock_int_status(sock);
|
||||
if (si & CH395F_SINT_STAT_CONNECT) { ok = 1; break; }
|
||||
}
|
||||
if (ch395f_get_sock_int_status(sock) & CH395F_SINT_STAT_CONNECT) { ok = 1; break; }
|
||||
HAL_Delay(10);
|
||||
}
|
||||
TEST_CHECK(ok, "TC202 step3 connected");
|
||||
@@ -550,11 +507,7 @@ static void phase2_tc202_once(uint8_t sock, uint16_t local_port)
|
||||
tick = HAL_GetTick();
|
||||
ok = 0;
|
||||
while (HAL_GetTick() - tick < 2000) {
|
||||
uint16_t int_st = ch395f_get_glob_int_status_all();
|
||||
if (int_st & (1U << (sock + 4))) {
|
||||
uint8_t si = ch395f_get_sock_int_status(sock);
|
||||
if (si & CH395F_SINT_STAT_SENBUF_FREE) { ok = 1; break; }
|
||||
}
|
||||
if (ch395f_get_sock_int_status(sock) & CH395F_SINT_STAT_SENBUF_FREE) { ok = 1; break; }
|
||||
HAL_Delay(10);
|
||||
}
|
||||
TEST_CHECK(ok, "TC202 step4 sendbuf_free");
|
||||
@@ -578,11 +531,8 @@ static void phase2_tc202_once(uint8_t sock, uint16_t local_port)
|
||||
ok = 1;
|
||||
break;
|
||||
}
|
||||
uint16_t int_st = ch395f_get_glob_int_status_all();
|
||||
if (int_st & (1U << (sock + 4))) {
|
||||
uint8_t si = ch395f_get_sock_int_status(sock);
|
||||
if (si & (CH395F_SINT_STAT_DISCONNECT | CH395F_SINT_STAT_SOCK_TIMEOUT)) break;
|
||||
}
|
||||
if (ch395f_get_sock_int_status(sock) &
|
||||
(CH395F_SINT_STAT_DISCONNECT | CH395F_SINT_STAT_SOCK_TIMEOUT)) break;
|
||||
HAL_Delay(50);
|
||||
}
|
||||
if (!ok) TEST_CHECK(0, "TC202 step5 echo rcvd");
|
||||
@@ -689,21 +639,18 @@ static uint8_t tc204_session(uint8_t sock, uint16_t lport, uint8_t mode, uint8_t
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* 等 CONNECT 中断(期间其它中断现场打印 = 残留事件取证点) */
|
||||
/* 等 CONNECT 中断(期间其它中断现场打印 = 残留事件取证点;直读本 Socket SINT) */
|
||||
tick = HAL_GetTick();
|
||||
while (HAL_GetTick() - tick < PHASE2_TIMEOUT_MS) {
|
||||
uint16_t gl = ch395f_get_glob_int_status_all();
|
||||
if ((gl & (1U << (sock + 4))) != 0U) {
|
||||
uint8_t si = ch395f_get_sock_int_status(sock);
|
||||
if ((si & CH395F_SINT_STAT_CONNECT) != 0U) {
|
||||
ok = 1;
|
||||
break;
|
||||
}
|
||||
if (si != 0U) {
|
||||
DBG_INFO("TC204 m%u r%u stale-int=0x%02X at +%ums",
|
||||
(unsigned)mode, (unsigned)round, si,
|
||||
(unsigned)(HAL_GetTick() - tick));
|
||||
}
|
||||
uint8_t si = ch395f_get_sock_int_status(sock);
|
||||
if ((si & CH395F_SINT_STAT_CONNECT) != 0U) {
|
||||
ok = 1;
|
||||
break;
|
||||
}
|
||||
if (si != 0U) {
|
||||
DBG_INFO("TC204 m%u r%u stale-int=0x%02X at +%ums",
|
||||
(unsigned)mode, (unsigned)round, si,
|
||||
(unsigned)(HAL_GetTick() - tick));
|
||||
}
|
||||
HAL_Delay(10);
|
||||
}
|
||||
@@ -720,13 +667,9 @@ static uint8_t tc204_session(uint8_t sock, uint16_t lport, uint8_t mode, uint8_t
|
||||
tick = HAL_GetTick();
|
||||
ok = 0;
|
||||
while (HAL_GetTick() - tick < 2000) {
|
||||
uint16_t gl = ch395f_get_glob_int_status_all();
|
||||
if ((gl & (1U << (sock + 4))) != 0U) {
|
||||
uint8_t si = ch395f_get_sock_int_status(sock);
|
||||
if ((si & CH395F_SINT_STAT_SENBUF_FREE) != 0U) {
|
||||
ok = 1;
|
||||
break;
|
||||
}
|
||||
if (ch395f_get_sock_int_status(sock) & CH395F_SINT_STAT_SENBUF_FREE) {
|
||||
ok = 1;
|
||||
break;
|
||||
}
|
||||
HAL_Delay(10);
|
||||
}
|
||||
@@ -917,7 +860,7 @@ static void phase2_tc204(void)
|
||||
*
|
||||
* 已知陷阱(TRAP-NET-12):上一会话 close 的 DISCONNECT 会滞后锁存在
|
||||
* SINT_SN(wait-CLOSED 的 STATUS 查询不清中断)。防御双保险:
|
||||
* ① 步 2 前预清两级中断;
|
||||
* ① 步 2 前预清本 Socket SINT;
|
||||
* ② 判负向后用 GET_SOCKET_STATUS 反核实,ESTABLISHED 即改判环境错误。
|
||||
*/
|
||||
static void phase2_tc203(void)
|
||||
@@ -946,8 +889,8 @@ static void phase2_tc203(void)
|
||||
|
||||
/* 预清陈旧事件(TRAP-NET-12):上一会话 close 的 DISCONNECT 可能滞后锁存
|
||||
* 在 SINT_SN 中(wait-CLOSED 轮询的 STATUS 是纯查询、不清中断),
|
||||
* 若不清除,本用例首次读中断会误吃旧事件导致负向误判。 */
|
||||
(void)ch395f_get_glob_int_status_all();
|
||||
* 若不清除,本用例首次读中断会误吃旧事件导致负向误判。
|
||||
* 只清本 Socket SINT——全局寄存器读即清,唯一读者 = net_poll(F-NET-7)。 */
|
||||
(void)ch395f_get_sock_int_status(sock);
|
||||
|
||||
/* 步2:OPEN + CONNECT。命令为异步下发,此时均应立即返回成功,
|
||||
@@ -960,8 +903,9 @@ static void phase2_tc203(void)
|
||||
TEST_CHECK(r == CH395F_ERR_SUCCESS, "TC203 step2 connect");
|
||||
if (r != CH395F_ERR_SUCCESS) { ch395f_close_socket(sock); return; }
|
||||
|
||||
/* 步3:30s 两级中断轮询,等"连不上"的证据。
|
||||
* 先扫全局 UNREACH 位作备注,再查本 socket 位取具体事件。
|
||||
/* 步3:30s 直读本 Socket SINT 轮询(读即清),等"连不上"的证据。
|
||||
* (旧版先扫全局 UNREACH 位作备注——已删:全局寄存器唯一读者 = net_poll,
|
||||
* 该备注本就不影响判定。)
|
||||
*
|
||||
* 实测行为(2026-08 上板):PC 端口关闭时 SYN 被 RST 拒绝,
|
||||
* 芯片以【毫秒级 SOCK_TIMEOUT】上报,并非等待 30s 静默重传耗尽;
|
||||
@@ -973,23 +917,15 @@ static void phase2_tc203(void)
|
||||
ev = 0;
|
||||
neg_si = 0;
|
||||
while (HAL_GetTick() - tick < PHASE2_TC203_TIMEOUT_MS) {
|
||||
uint16_t int_st = ch395f_get_glob_int_status_all();
|
||||
|
||||
if (int_st & CH395F_GINT_STAT_UNREACH) {
|
||||
DBG_INFO(" global UNREACH: ARP fail (peer offline)");
|
||||
uint8_t si = ch395f_get_sock_int_status(sock);
|
||||
if (si & (CH395F_SINT_STAT_SOCK_TIMEOUT | CH395F_SINT_STAT_DISCONNECT)) {
|
||||
neg_si = si; /* 记下事件位,跳出后再细分原因 */
|
||||
ev = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (int_st & (1U << (sock + 4))) {
|
||||
uint8_t si = ch395f_get_sock_int_status(sock);
|
||||
if (si & (CH395F_SINT_STAT_SOCK_TIMEOUT | CH395F_SINT_STAT_DISCONNECT)) {
|
||||
neg_si = si; /* 记下事件位,跳出后再细分原因 */
|
||||
ev = 1;
|
||||
break;
|
||||
}
|
||||
if (si & CH395F_SINT_STAT_CONNECT) {
|
||||
ev = 2; /* 连上了 = PC 服务没关,属环境错误而非芯片故障 */
|
||||
break;
|
||||
}
|
||||
if (si & CH395F_SINT_STAT_CONNECT) {
|
||||
ev = 2; /* 连上了 = PC 服务没关,属环境错误而非芯片故障 */
|
||||
break;
|
||||
}
|
||||
HAL_Delay(10);
|
||||
}
|
||||
@@ -1173,11 +1109,8 @@ static void phase3_run(void) {
|
||||
|
||||
uint32_t sw = HAL_GetTick();
|
||||
while (HAL_GetTick() - sw < 2000) {
|
||||
uint16_t gs = ch395f_get_glob_int_status_all();
|
||||
if (gs & (1U << (sock + 4))) {
|
||||
if (ch395f_get_sock_int_status(sock) & CH395F_SINT_STAT_SENBUF_FREE)
|
||||
break;
|
||||
}
|
||||
if (ch395f_get_sock_int_status(sock) & CH395F_SINT_STAT_SENBUF_FREE)
|
||||
break;
|
||||
HAL_Delay(10);
|
||||
}
|
||||
echo_ok = 1;
|
||||
@@ -1247,7 +1180,8 @@ static void phase4_run(void) {
|
||||
uint32_t tick = HAL_GetTick();
|
||||
uint8_t dhcp_ok = 0;
|
||||
while (HAL_GetTick() - tick < 30000) {
|
||||
ch395f_get_glob_int_status_all();
|
||||
/* DHCP 状态寄存器是真相(纯查询);不读全局寄存器——读即清,
|
||||
* 唯一读者 = net_poll(F-NET-7),测试代码同样禁自行读取 */
|
||||
if (ch395f_get_dhcp_status() == 0x00) { dhcp_ok = 1; break; }
|
||||
HAL_Delay(500);
|
||||
}
|
||||
@@ -1310,10 +1244,7 @@ static void phase4_run(void) {
|
||||
ch395f_write_send_buf(anno_sock, ip_info, 4);
|
||||
uint32_t sw = HAL_GetTick();
|
||||
while (HAL_GetTick() - sw < 2000) {
|
||||
uint16_t gs = ch395f_get_glob_int_status_all();
|
||||
if (gs & (1U << (anno_sock + 4))) {
|
||||
if (ch395f_get_sock_int_status(anno_sock) & CH395F_SINT_STAT_SENBUF_FREE) break;
|
||||
}
|
||||
if (ch395f_get_sock_int_status(anno_sock) & CH395F_SINT_STAT_SENBUF_FREE) break;
|
||||
HAL_Delay(10);
|
||||
}
|
||||
TEST_CHECK(1, "DHCP announcement sent");
|
||||
@@ -1324,7 +1255,6 @@ static void phase4_run(void) {
|
||||
int32_t hello_ok = 0;
|
||||
uint32_t wait = HAL_GetTick();
|
||||
while (HAL_GetTick() - wait < PHASE4_HELLO_WAIT_MS) {
|
||||
ch395f_get_glob_int_status_all();
|
||||
uint16_t rlen = ch395f_get_recv_len(anno_sock);
|
||||
/* ⚠ 同 Phase 3:夹到本地缓冲容量,防栈溢出(2026-10-11 审计修正) */
|
||||
if (rlen > (uint16_t)sizeof(rx_buf)) {
|
||||
@@ -1466,9 +1396,7 @@ static void phase5_run(void) {
|
||||
|
||||
t0 = HAL_GetTick();
|
||||
while (HAL_GetTick() - t0 < PHASE5_CONN_TIMEOUT_MS) {
|
||||
uint16_t gs = ch395f_get_glob_int_status_all();
|
||||
if ((gs & (1U << (sock + 4))) &&
|
||||
(ch395f_get_sock_int_status(sock) & CH395F_SINT_STAT_CONNECT)) {
|
||||
if (ch395f_get_sock_int_status(sock) & CH395F_SINT_STAT_CONNECT) {
|
||||
conn_ok = 1;
|
||||
break;
|
||||
}
|
||||
@@ -1523,13 +1451,10 @@ static void phase5_run(void) {
|
||||
tx_sw = HAL_GetTick(); /* 记录等待起点(供超时判定) */
|
||||
} else {
|
||||
/* ---- 等待上一次写入被芯片搬走(SENBUF_FREE) ----
|
||||
* 两级中断轮询(DP-02):先读全局中断状态确认本 socket 有事件,
|
||||
* 再读该 socket 的中断状态确认具体为 SENBUF_FREE。
|
||||
* 读全局中断状态即清除中断标志(读即清)。
|
||||
* 直读本 Socket SINT(读即清);不读全局寄存器——读即清且
|
||||
* 唯一读者 = net_poll(F-NET-7)。
|
||||
*/
|
||||
uint16_t gs = ch395f_get_glob_int_status_all();
|
||||
if ((gs & (1U << (sock + 4))) && /* socket 中断位(socket 0 → bit 4) */
|
||||
(ch395f_get_sock_int_status(sock) & CH395F_SINT_STAT_SENBUF_FREE)) {
|
||||
if (ch395f_get_sock_int_status(sock) & CH395F_SINT_STAT_SENBUF_FREE) {
|
||||
can_write = 1; /* 缓冲已腾空,下一轮写入下一块 */
|
||||
} else if (HAL_GetTick() - tx_sw >= PHASE5_TX_TIMEOUT_MS) {
|
||||
/* 超时:芯片迟迟未腾出缓冲 —— 对端未收/链路异常/芯片堵死 */
|
||||
@@ -1655,12 +1580,12 @@ static void phase5_run(void) {
|
||||
#endif
|
||||
|
||||
/* ===================================================================
|
||||
* Phase 15 — N34 阶段 2 驱动原语(无需 PC)
|
||||
* Phase 15 — 自愈收敛阶段 2 驱动原语(无需 PC)
|
||||
*
|
||||
* 测试目的:验证 ch395f 新增原语(实施方案 docs/网络/N34-自愈审计.md §5.4)
|
||||
* 测试目的:验证 ch395f 新增原语(设计 docs/网络/网络自愈架构设计.md §4.4)
|
||||
* 语义正确:类型化状态回读一致性 / cmd_done(E3 定案=状态回读)/
|
||||
* sock_reset 非阻塞状态机跑通(E4 定案序列)/ 链路态缓存 / 事件护栏。
|
||||
* 污染会话下的复位载荷完整性已由 E4 bench 60 轮实证(实验方案 E4),
|
||||
* 污染会话下的复位载荷完整性已由 E4 bench 60 轮实证(《网络自愈架构设计》§5.2 E4),
|
||||
* 本 Phase 只验"状态机跑通 + 判据语义",不依赖 PC。
|
||||
* 上下文:硬件层模式(testTask 独占 CH395F),用 Socket 7(产品监听 0~4 不涉)。
|
||||
* =================================================================== */
|
||||
@@ -1672,7 +1597,7 @@ static void phase15_run(void) {
|
||||
int done;
|
||||
int rc;
|
||||
|
||||
DBG_INFO("=== CH395F Phase 15 Tests (N34 phase-2 primitives) ===");
|
||||
DBG_INFO("=== CH395F Phase 15 Tests (self-heal phase-2 primitives) ===");
|
||||
|
||||
/* ---- TC-1501: 状态回读一致性 + cmd_done 语义(E2/E3 定案形态) ---- */
|
||||
ch395f_set_proto_type(sn, CH395F_PROTO_TYPE_TCP);
|
||||
@@ -1809,7 +1734,7 @@ void ch395f_test_run(void)
|
||||
net_latency_phase12_run();
|
||||
#endif
|
||||
#ifdef ENABLE_PHASE15_TESTS
|
||||
/* Phase 15(N34 阶段 2 驱动原语):独占态下直调驱动,放 HW 层末尾 */
|
||||
/* Phase 15(自愈收敛阶段 2 驱动原语):独占态下直调驱动,放 HW 层末尾 */
|
||||
phase15_run();
|
||||
#endif
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user