docs: record v1.1.1 dirty-network recovery design

This commit is contained in:
2026-05-12 03:31:51 +08:00
parent 004057a6fa
commit 9ce1eed850
2 changed files with 55 additions and 6 deletions
+6 -6
View File
@@ -1,7 +1,7 @@
Code (inc. data) RO Data RW Data ZI Data Debug Object Name
632 0 0 0 0 0 ch390.o
616 0 64 0 0 0 ch390_interface.o
2050 0 85 6 88 0 ch390_runtime.o
2546 0 85 6 136 0 ch390_runtime.o
3958 0 591 8 1240 0 config.o
8 0 0 0 0 0 def.o
124 0 0 0 0 0 dma.o
@@ -17,7 +17,7 @@
778 0 0 2 0 0 ip4.o
46 0 4 0 0 0 ip4_addr.o
44 0 0 0 12 0 iwdg.o
3212 0 185 12 272 0 main.o
3264 0 300 12 272 0 main.o
828 0 0 12 4115 0 mem.o
196 0 244 32 6464 0 memp.o
582 0 0 12 0 0 netif.o
@@ -43,10 +43,10 @@
490 0 0 0 0 0 stm32f1xx_it.o
2 0 24 4 0 0 system_stm32f1xx.o
3474 0 193 32 0 0 tcp.o
1556 0 0 0 1072 0 tcp_client.o
1734 0 0 0 1088 0 tcp_client.o
3684 0 0 36 20 0 tcp_in.o
3862 0 0 0 0 0 tcp_out.o
1346 0 0 0 1048 0 tcp_server.o
1364 0 0 0 1048 0 tcp_server.o
164 0 0 0 72 0 tim.o
374 0 16 12 0 0 timeouts.o
1590 0 0 0 2936 0 uart_trans.o
@@ -57,8 +57,8 @@ Memory Map of the image
Load Region LR_IROM1
Execution Region ER_IROM1 (Exec base: 0x08000000, Size: 0x0000DB7C, Max: 0x00010000, END)
Execution Region ER_IROM1 (Exec base: 0x08000000, Size: 0x0000DED8, Max: 0x00010000, END)
Execution Region RW_IRAM1 (Exec base: 0x20000000, Size: 0x00004F98, Max: 0x00005000, END)
Execution Region RW_IRAM1 (Exec base: 0x20000000, Size: 0x00004FD8, Max: 0x00005000, END)
Image component sizes
+49
View File
@@ -246,6 +246,55 @@ EN,LPORT,RIP,RPORT,UART
该结果说明修复后工程仍满足 `STM32F103R8T6``20KB RAM` 上限,但余量已经很小;后续若继续增加功能,应优先考虑复用现有缓冲与状态,而不是增加新的静态大数组。
### 6.3 客户现场脏网络恢复增强
客户现场换 PC 后曾出现设备持续 ARP、`ping` 不通、TCP Client 不恢复的现象。抓包显示故障前后存在 IPv6、DHCPv6、mDNS、IGMP、LLDP 等与当前业务无关的网络噪声;当前固件为静态 IPv4、TCP2UART 与 ICMP 诊断模型,不依赖 UDP、IPv6、DHCP 或多播发现。
本阶段采用低 RAM 优先的恢复策略,不先扩大 `PBUF_POOL_SIZE`,而是在更靠近入口的位置减少无关帧对 lwIP pool 的占用:
1. `TCP Client CONNECTING` 增加应用层超时:
- `TCP_CLIENT_CONNECT_TIMEOUT_MS = 10000`
- `tcp_connect()` 返回 `ERR_OK` 后记录 `connect_start_ms`
- `tcp_client_poll()` 发现 `CONNECTING` 超过超时时间后,注销回调、`tcp_abort()` 当前 PCB、释放 `hold_pbuf`,再按原有 `reconnect_interval_ms` 重连
- `tcp_client_status_t.connect_timeout_count` 记录发生次数
2. `CH390` RX 入口增加 `pre-pbuf` 协议过滤:
-`pbuf_alloc(PBUF_RAW, ..., PBUF_POOL)` 之前先读取以太网头与最小 IPv4 头
- 允许进入 lwIP 的协议限定为 `ARP``IPv4 ICMP``IPv4 TCP`
- 默认丢弃 `IPv6``IPv4 UDP``IPv4 IGMP``LLDP`、未知 EtherType 与畸形头
- 丢弃帧只跳过 CH390 RX FIFO 剩余字节,不分配 pbuf
3. 软件 MAC 过滤暂不启用:
- 第一版只做协议层过滤,避免误杀广播 ARP 或未来硬件过滤策略变化
- 目的 MAC 相关判断保留为后续可选增强
新增 CH390 诊断字段用于现场判断是否仍存在资源压力:
1. `rx_pbuf_alloc_failed`
2. `rx_filtered_frames`
3. `rx_filtered_ipv6`
4. `rx_filtered_udp`
5. `rx_filtered_igmp`
6. `rx_filtered_lldp`
7. `rx_filtered_other_eth`
8. `rx_filtered_other_ipv4`
9. `rx_filtered_malformed`
10. `rx_ipv4_icmp_frames`
11. `rx_ipv4_tcp_frames`
12. `rx_ipv4_udp_frames`
验收口径:
1. 正常 `ARP / ping / TCP Server / TCP Client` 功能不受影响
2. 客户脏网络中的 IPv6、UDP、IGMP、LLDP 噪声不会进入 lwIP pbuf pool
3. 若远端 TCP Server 不监听或静默丢 SYNTCP Client 不再永久停留在 `CONNECTING`
4. 若过滤后 `rx_pbuf_alloc_failed` 仍持续增长,再评估从无关功能中回收 RAM 并调整 `PBUF_POOL_SIZE`
本阶段 Keil 构建验收结果:
1. `errors = 0`
2. `warnings = 0`
3. `flash_bytes = 57404`
4. `ram_bytes = 20440`
## 七、主循环实现方向
主循环仍保持裸机轮询风格: