Files
STM32F4-Base/Drivers/BSP/NET/README.md
T
wandering1 7048e9cb9a docs(任务规划): 瘦身为只留待办,波次条目改用语义名
任务规划目录只保留将来要做的事:删掉已完成的证据链与已作废的历史快照,
并把波内条目的 C/D 短码全部换成语义名。

为什么删 C/D 短码:它们同字母不同义——C 组在 UI_界面制作流程.md 里是
UI 设计约束(屏幕/字符集/文本/编码),D 组在控制台单写者日志设计说明.md
与配置文件设计说明.md 里是决策记录。同一串短码在三处指三件事,读的人
只能猜,所以条目一律改用一行短语作标识。

- 排期详述.md 重写为「结构债与验证常态」,条目全语义名,出处列留冻结号
- README.md 删修订记录块(本文件自述不留变更记录),波次行改语义描述
- W1-采集保护收尾.md 67→30 行,只留 M3 送检与 B10 卡
- 基线与待确认.md 73→15 行,删已作废的旧栈表与旧余量数字
- 登记簿.md 逐行收缩到未闭环残余,N-29 的 .git 订正为实测 233 MB
- 测试与架构专项.md 删 S1-c(106 例已落地,且被覆盖率总闸覆盖)
- 并行分道方案.md 删批 0,修两处会返回 rc=3 的 new 命令形态
- 覆盖率口径:套件 16→33、未挂钩子 12→17、墙钟 25s→67s(实测)
- 同步 10 处跨文档引用,指向合并或删除后的新位置
2026-10-25 01:35:21 +08:00

75 lines
4.1 KiB
Markdown
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.
# Drivers/BSP/NET/ — 网络抽象层(BSD Socket API)
> 在 CH395F 硬件驱动之上提供 **BSD Socket 风格 API**,使上层(FTP 服务、时间同步、UI 推流)
> 以标准 socket 语义编程,无需关心芯片细节。核心是**阻塞模型 + 事件驱动 + 周期对账自愈**。
## 文件一览
| 文件 | 作用 |
|---|---|
| `net_socket.c/h` | **BSD Socket API 实现**:`net_socket` / `net_connect` / `net_send` / `net_recv` / `net_close` / `net_listen` / `net_accept`,含挂起 recv(pending)与错误码 |
| `net_pending.c/h` | **挂起 recv / send 请求表**(阻塞挂起模型:登记 / 每轮完成检查(recv)/ 推进(send)/ 取消 / close 结算;真机专属,模拟器走 `net_socket_sim.c`) |
| `net_select.c/h` | `select`/`poll` 多路复用(基于芯片中断事件 + 周期轮询) |
| `net_types.h` | 网络层公共类型定义 |
| `net_config.h` | 网络层编译期配置(缓冲区大小、超时、对账周期等) |
| `lftpd/` | **轻量 FTP 服务器**(第三方移植,见其子目录) |
## 核心机制
### 阻塞模型(挂起 recv / send / pending)
- **recv 挂起(pending)已落地**:`net_recv` 阻塞不占 netTask——登记挂起请求 + 每轮 tick 唤醒
- **send 挂起已落地**:`net_send` 快路径有界自旋(`NET_SEND_SPIN_MS` = 2ms),超预算登记
挂起 send,由 `net_send_pending_tick` 按主循环节拍分块推进;netTask 最坏停滞由 1s 压到 2ms
- **ACCEPT 决定不挂起化(2026-10-15)**(调用方轮询问题,不是队头阻塞;pending 化收益仅 RPC 开销与抖动)
- 架构细节:`docs/网络/Net层阻塞模型架构设计.md`
### 周期对账自愈(TRAP-NET-17 修复;对账与监听重建合一)
- `net_reconcile_tick()`(100ms,判据读**驱动状态缓存**——唯一
刷新点 `net_poll` 每轮全量刷新,E2 实测单次回读 18.1us)修正失同步:
本层 ESTABLISHED 而芯片已断 → 断开;本层 LISTENING 而芯片已握手 → 补 accept;
本层 LISTENING/CLOSED(监听型 fd)而芯片监听消失 → 重建(形态③④);
本层 CLOSED 而芯片在听 → 只重同步(U11);芯片静默回收 → RESYNC(⑤)
- **分级去抖(②=1 轮 / ③④⑤=2 轮 / ①=4 轮)+ 冷却(1s)**——监听失位的重建
动作**必须去抖**,否则"刚 listen 未生效"瞬态会反复重建直至
`relisten retry budget exhausted`(三监听口全死);①的 4 轮窗是 F-NET-17 M3
可疑电平的让位租约(勿改小)
### 异常复监听隔离(TRAP-NET-18 修复)
- 异常释放(TIMEOUT)的 socket 复监听前隔离:排空 RX 残渣 + 主动 close + 等 CLOSED
- 400ms 起;**800ms 上限只留痕、不强行放行**(芯片未回 CLOSED 时 open 注定吃 USE 错,
真正兜底 = D10 预算到期 + 对账形态④ 重新登记)
- 仅异常路径生效,正常 FIN 路径零改动
### 错误码(E-03 修复)
- **按任务隔离**:`s_net_errno_slots[8]`(每槽 `{任务句柄, err}`),替代原全局 `s_net_errno`
- `net_get_errno()` 只读本任务槽位,**对外语义不变**(成功不清零)
## 依赖关系
```
上层(FTP / timeSync / UI 推流)
↓ BSD Socket API
net_socket.c ←→ net_select.c
↓ ch395f_* 接口
Drivers/BSP/CH395F/
```
## ⚠️ 改本模块前必读
- 就绪屏障位(`SYS_EVT_NET_READY` 等)等待必须 `osFlagsNoClear`,**不能用默认消费型**
- 每次 CH395F SPI 事务须 `ch395f_spi_begin()/end()` 包裹
- **改任何自愈/重建逻辑必须去抖**,否则会引发重建风暴
- 相关陷阱:`docs/问题记录/CH395F_Trap_Records.md` TRAP-NET-17/-18
## 相关文档
- 上层用法:`docs/网络/BSD_Socket_API_使用指南.md`
- 内部调用关系:`docs/网络/BSD_Socket_API_函数调用关系.md`
- 架构设计:`docs/网络/Net层阻塞模型架构设计.md`(阻塞等待 / pending 请求模型)
- ACCEPT 挂起化不实施的判据:`docs/网络/Net层阻塞模型架构设计.md` §10
- 测试:`docs/测试说明/CH395F_Test_Guide.md`、`docs/测试说明/FTP_Test_Guide.md`