Files
STM32F4-Base/Drivers/BSP/NET/net_events.h
T
wandering1 63cf73b4d0 refactor(NET): 事件处理与周期对账抽出 net_events.c,net_socket.c 3720→3119
动机:net_socket.c 3720 行(注释 1878 / 代码 1518 / 54 函数),BSD 连接层
与"状态面收敛"两套职责混在一个文件里。16 个消费者只依赖 net_socket.h,
故搬移对应用层零波及;模拟器另有 net_socket_sim.c,新模块走 SIM_EXEMPT。

为什么是一个模块而不是两个:实测对账区真实调用事件处理器 2 处(形态② 补
accept 走 handle_connect_event),且 NET_RECON_STABLE_DEATH 两边共用——
拆成 net_events.c + net_reconcile.c 会造出跨模块调用,合起来则跨模块导出
为零。二者同属"芯片状态面与本层镜像的收敛"一个职责。

搬出:5 个 handle_*_event + fire_event + net_reconcile_tick +
net_lost_connect_probe + NET_RECONCILE_*/NET_RECON_STABLE_* 常量 +
net_bench_cmd_log(含其 2 个 static)。

搬移时 4 处 fd 取法替换(其余代码逐行未改,已用剥注释后的代码行多重集
证明差异恰好等于声明的改动集):
- p_sock - s_net_socks → p_sock->ch395_sock(net_socket() 里
  ch395_sock = sockfd,恒等;模拟器同构造)
- 对账循环 &s_net_socks[i] → net_sock_raw(i)

⚠ 随之收窄两处沉降登记的范围门 (qfd >= 0) && (qfd < MAX) → qfd < MAX:
ch395_sock 是 uint8_t,(int) 后恒非负,下界在类型上不可能越界;留着会被
cppcheck 判 knownConditionTrueFalse 拦提交。已在文件头写"勿加回"。

新增 net_sock_raw():对账必须看到 in_use==0 / state==CLOSED 的槽位
(形态④ 认领孤儿监听正依赖 CLOSED 态),而 net_get_sock() 对未在用槽位返
回 NULL 会漏掉这一类。声明放 net_socket.h 而非内部头 net_events.h——规范
S17 2.2 要求非 static 函数声明在配对头文件(同 net_set_errno 先例)。

验证:
- 代码行多重集差异 = 声明的改动集,无一处意外
- @build BUILD_OK 0 错 0 警;Code 212316→212296(−20 B,拆 TU 布局差),
  RO/RW/ZI 完全不变
- cppcheck / coding-standard / registration-check 全 PASS
- @test 硬件闭环 PASS:635ms 到 net init: OK,:8888/:2404/FTP 均建立,
  [ERR]/Fault/relisten/reconcile 命中 0 条
- 台账随 Code 变化同步(ram_baseline --write / check_mem_numbers --write)

遗留(与仍未提交的文档工作同文件,另提):BSD_Socket_API 使用指南的文件
职责表、net_listener.c/.h 文件头"见 net_socket.c"、自愈架构设计 §11 仍把
net_reconcile_tick 记在 net_socket.c——doc-links 只校验 § 编号存在性,
照不出"函数在哪个文件",需在文档提交中一并修正。
2026-10-14 18:04:57 +08:00

47 lines
2.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 模块名称:Network Events & Reconcile —— 内部头
* 模块功能:声明「芯片边沿事件处理 + 100ms 周期对账」模块对 net 层宿主提供的接口。
* 适用平台:STM32F407ZGTx + CH395F 以太网芯片
* 作者:王建锋
* 创建日期:2026-10-14
*
* ⚠ **内部头**:只被 `net_socket.c`(宿主)与 `net_events.c`(实现)include,
* **不进** 公开的 `net_socket.h`,也**不被应用层引用**——与 `net_listener.h` 同族约定。
* 本模块依赖 `ch395f_*` SPI 驱动,属**真机专属**:模拟器(Winsock 后端)不编译,
* 故已在 `scripts/check_registration.py` 的 SIM_EXEMPT 显式点名(每行附理由)。
*
* 设计依据 → docs/网络/网络自愈架构设计.md §4
* 形态表 §4.1 / 单一重建所有者 §4.2 / 沉降与隔离 §4.3 / 读即清信源纪律 §4.10
*/
#ifndef NET_EVENTS_H
#define NET_EVENTS_H
#include "net_types.h" /* net_sock_t / net_event_t / NET_MAX_SOCKETS */
/* ===== 宿主 net_socket.c 提供 ===== */
/* `net_sock_raw()`(对账循环需要的"不判 in_use"数组访问器)声明在**配对头** net_socket.h
* —— 规范 S17 2.2 要求非 static 函数声明在配对头文件,内部头不算(同 net_set_errno 先例)。 */
/* ===== 本模块 net_events.c 提供 ===== */
/* 芯片边沿事件处理器:由 net_poll() 在全局中断位命中后分派(netTask 上下文) */
void handle_connect_event(net_sock_t *p_sock); /* CONNECT:转 ESTABLISHED + 记对端 + KeepAlive */
void handle_disconnect_event(net_sock_t *p_sock); /* DISCONNECT:陈旧甄别 + 登记沉降事实 */
void handle_recv_event(net_sock_t *p_sock); /* RECV_OK:置 readable 电平 */
void handle_send_event(net_sock_t *p_sock); /* SEND_OK:清发送忙 + 回调 */
void handle_timeout_event(net_sock_t *p_sock); /* TIM_OUT:按异常释放处理(隔离重建) */
/* 100ms 周期对账:形态①②③④⑤ + U11 的唯一判据所在;由 net_process_messages 每轮调用 */
void net_reconcile_tick(void);
/* accept 路径探针:芯片已 ESTABLISHED 而 CONNECT 事件未到时补做 accept */
void net_lost_connect_probe(net_sock_t *p_sock);
#if defined(NET_BENCH_CMD_LOG)
/* 台架芯片命令序列日志(编译开关默认关;net_poll / 消息分派 / 事件处理三处消费) */
void net_bench_cmd_log(char tag, int sock, int detail);
#endif
#endif /* NET_EVENTS_H */