From 9ce1eed8505bad158c40894fe9895bdbcf4412bd Mon Sep 17 00:00:00 2001 From: xiao Date: Tue, 12 May 2026 03:31:51 +0800 Subject: [PATCH] docs: record v1.1.1 dirty-network recovery design --- MDK-ARM/keil-build-viewer-record.txt | 12 +++---- 项目技术实现.md | 49 ++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/MDK-ARM/keil-build-viewer-record.txt b/MDK-ARM/keil-build-viewer-record.txt index 4e9ed0f..6b062e5 100644 --- a/MDK-ARM/keil-build-viewer-record.txt +++ b/MDK-ARM/keil-build-viewer-record.txt @@ -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 \ No newline at end of file diff --git a/项目技术实现.md b/项目技术实现.md index 4eff7d2..a6812ea 100644 --- a/项目技术实现.md +++ b/项目技术实现.md @@ -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 不监听或静默丢 SYN,TCP 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` + ## 七、主循环实现方向 主循环仍保持裸机轮询风格: