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:
@@ -11,7 +11,7 @@
|
||||
* 设计要点:
|
||||
* 1. fd 采用与 MCU 端一致的"控制块索引"模型(0 ~ NET_MAX_SOCKETS-1)
|
||||
* 2. Winsock 句柄创建即置非阻塞(ioctlsocket FIONBIO),阻塞语义在包装层
|
||||
* 按控制块 blocking 属性模拟(N34 阶段 1.5:模式归使用者——blocking=1
|
||||
* 按控制块 blocking 属性模拟(自愈收敛阶段 1.5:模式归使用者——blocking=1
|
||||
* 时 recv 轮询等待(Sleep(1)),=0 或 NET_MSG_DONTWAIT 立即 WOULDBLOCK),
|
||||
* 使 net_recv / net_recv_nb / net_recv_to / net_accept 的语义与 MCU 端一致
|
||||
* 3. 代次号在模拟器上恒为 0(无"网络重建"概念),net_get_generation 恒返回 0
|
||||
@@ -215,7 +215,7 @@ int net_socket(int domain, int type) {
|
||||
s_socks[idx].type = (uint8_t)type;
|
||||
s_socks[idx].state = NET_SOCK_STATE_CREATED;
|
||||
s_socks[idx].ch395_sock = (uint8_t)idx;
|
||||
/* N34 阶段 1.5:阻塞模式默认 = 阻塞(与 MCU 端 net_socket 一致;
|
||||
/* 自愈收敛阶段 1.5:阻塞模式默认 = 阻塞(与 MCU 端 net_socket 一致;
|
||||
* Winsock 句柄仍恒非阻塞,阻塞语义由包装层按本属性模拟,见文件头要点 2) */
|
||||
s_socks[idx].blocking = 1;
|
||||
s_ws[idx] = ws;
|
||||
@@ -334,7 +334,7 @@ int net_accept(int sockfd, struct net_sockaddr *addr, int *addrlen) {
|
||||
s_socks[nidx].type = (uint8_t)NET_SOCK_STREAM;
|
||||
s_socks[nidx].state = NET_SOCK_STATE_ESTABLISHED;
|
||||
s_socks[nidx].ch395_sock = (uint8_t)nidx;
|
||||
/* N34 阶段 1.5:accept 出的新连接同样默认阻塞模式(与 MCU 端一致) */
|
||||
/* 自愈收敛阶段 1.5:accept 出的新连接同样默认阻塞模式(与 MCU 端一致) */
|
||||
s_socks[nidx].blocking = 1;
|
||||
s_ws[nidx] = cws;
|
||||
|
||||
@@ -342,7 +342,7 @@ int net_accept(int sockfd, struct net_sockaddr *addr, int *addrlen) {
|
||||
return nidx;
|
||||
}
|
||||
|
||||
/* N34 阶段1(F-NET-4):net_can_accept 双端退役——监听 accept 门控统一用
|
||||
/* 自愈收敛阶段1(F-NET-4):net_can_accept 双端退役——监听 accept 门控统一用
|
||||
* net_listener_armed()(本文件同名实现保留恒 1 语义),recv 门控 net_can_read() 保留。 */
|
||||
|
||||
/*
|
||||
@@ -517,7 +517,7 @@ static int recv_wait(int sockfd, void *buf, int len, int has_budget, unsigned lo
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:接收数据(TCP,**默认无限阻塞**——N34 阶段 1.5 与 MCU 端语义对齐)
|
||||
* 函数功能:接收数据(TCP,**默认无限阻塞**——自愈收敛阶段 1.5 与 MCU 端语义对齐)
|
||||
* 入口参数:sockfd - socket 描述符
|
||||
* buf - 接收缓冲区
|
||||
* len - 缓冲区大小
|
||||
@@ -542,12 +542,12 @@ int net_recv(int sockfd, void *buf, int len, int flags) {
|
||||
if ((flags & NET_MSG_DONTWAIT) || s_socks[sockfd].blocking == 0U) {
|
||||
return recv_once(sockfd, buf, len);
|
||||
}
|
||||
/* 阻塞:无限等待(无默认预算,N34 阶段 1.5) */
|
||||
/* 阻塞:无限等待(无默认预算,自愈收敛阶段 1.5) */
|
||||
return recv_wait(sockfd, buf, len, 0, 0ULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:接收数据(非阻塞具名入口,与 MCU 端同名 API 对齐——N34 阶段 1.5)
|
||||
* 函数功能:接收数据(非阻塞具名入口,与 MCU 端同名 API 对齐——自愈收敛阶段 1.5)
|
||||
* 入口参数:sockfd / buf / len - 同 net_recv
|
||||
* 返回值:>0 字节数;0 = 对端关闭;-1 = 无数据(WOULDBLOCK) 或错误
|
||||
* 限定条件:socket 已建立
|
||||
@@ -566,7 +566,7 @@ int net_recv_nb(int sockfd, void *buf, int len) {
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:接收数据(**显式预算**便捷入口,与 MCU 端同名 API 对齐——N34 阶段 1.5)
|
||||
* 函数功能:接收数据(**显式预算**便捷入口,与 MCU 端同名 API 对齐——自愈收敛阶段 1.5)
|
||||
* 入口参数:sockfd / buf / len - 同 net_recv
|
||||
* timeout_ms - 本次等待预算(ms,必须 >0;0 = 无限等待语义
|
||||
* 属 net_recv 的职责,此处拒 INVAL,与 MCU 端一致)
|
||||
@@ -709,7 +709,7 @@ int net_close(int sockfd) {
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:主动拆掉当前 TCP 会话、保留监听(与 MCU 端同名 API——N34 阶段 3,E-02 收口)
|
||||
* 函数功能:主动拆掉当前 TCP 会话、保留监听(与 MCU 端同名 API——自愈收敛阶段 3,E-02 收口)
|
||||
* 入口参数:sockfd - socket 描述符
|
||||
* 出口参数:无
|
||||
* 返回值:0 成功(含幂等:无活动会话),-1 失败
|
||||
@@ -766,7 +766,7 @@ int net_set_event_cb(int sockfd, net_event_cb_t cb, void *arg) {
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:设置 Socket 阻塞/非阻塞**模式属性**(与 MCU 端同名 API 对齐——N34 阶段 1.5)
|
||||
* 函数功能:设置 Socket 阻塞/非阻塞**模式属性**(与 MCU 端同名 API 对齐——自愈收敛阶段 1.5)
|
||||
* 入口参数:sockfd - socket 描述符
|
||||
* on - 1 = 阻塞(net_socket/net_accept 默认);0 = 非阻塞
|
||||
* 返回值:0 成功;-1 失败(描述符无效/未占用)
|
||||
@@ -836,7 +836,7 @@ uint32_t net_inet_addr(const char *cp) {
|
||||
* 返回值:buf 指针(buf 为 NULL 时返回 NULL)
|
||||
* 限定条件:buf 非空且长度足够
|
||||
* 函数说明:NTOHL 后主机序数值的高字节是点分第一段(与 MCU 端同步修复,
|
||||
* N34 E13 §6:原低段在前显示成字节反转)
|
||||
* E13 定案:原低段在前显示成字节反转)
|
||||
*/
|
||||
char *net_inet_ntoa(uint32_t addr, char *buf) {
|
||||
uint32_t naddr = NET_NTOHL(addr);
|
||||
@@ -949,7 +949,7 @@ int net_getsockname(int sockfd, struct net_sockaddr *addr, int *addrlen) {
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:获取 Socket 对端地址(IP + Port)(与 MCU 端同名 API——N34 E13 §6)
|
||||
* 函数功能:获取 Socket 对端地址(IP + Port)(与 MCU 端同名 API——E13 定案)
|
||||
* 入口参数:sockfd - socket 描述符
|
||||
* addr - 输出:对端地址
|
||||
* addrlen - 输入输出:地址结构体长度
|
||||
|
||||
Reference in New Issue
Block a user