修改测试
This commit is contained in:
@@ -367,3 +367,31 @@ static const char *to_fatfs_path(const char *path) {
|
||||
| 8 | `ftpTask` 启动时 PHY 未稳定 | Trap 09 子类 | `freertos.c: osDelay(7000)` |
|
||||
| 9 | 会话结束后立即重建监听失败 | Trap 09 子类 | `lftpd.c: vTaskDelay(200ms)` |
|
||||
| 10 | `s_file_open` 单文件限制 | 已知限制 | `lftpd_io.c` (全局变量) |
|
||||
| 11 | CH395F DMA buffer 太小,分批读导致 recv_len 归零 | Trap 13 | `ch395f.c + lftpd.c` |
|
||||
| 12 | `malloc` 嵌入式环境失败 | Trap 13 子类 | `lftpd.c: static buffer` |
|
||||
| 13 | `net_listen_locked` 缓冲区覆盖(s0/s1 争用 block 0-3) | Trap 02 翻版 | `net_socket.c: 单连接用默认 buf` |
|
||||
| 14 | CH395F TIMEOUT 立即触发(数据连接无数据) | Trap 09 子类 | `net_socket.c: CLOSED 状态处理` |
|
||||
| 15 | `NET_RECV_TIMEOUT_MS=5s` 控制通道超时断开 | 配置 | `net_config.h: 30000` |
|
||||
| 16 | `receive_file` 0 bytes 当作成功 | 逻辑 | `lftpd.c: total==0 则失败` |
|
||||
| 17 | MobaXterm 连数据端口不发数据(客户端特殊行为) | 外部 | Python 抓包确认,超时恢复 |
|
||||
|
||||
---
|
||||
|
||||
## Trap 13:CH395F `recv_len` 分批读取时归零
|
||||
|
||||
### 现象
|
||||
MobaXterm 上传文件时 CH395F 收到数据(`s1 int=0x04` RECV_OK 持续触发),但 `ch395f_get_recv_len(1)` 第一次返回 2920,读 1024 字节后第二次永远返回 0。`GINT=0x0020` 反复触发但无数据可读——死循环。
|
||||
|
||||
### 根因
|
||||
`ch395f_read_recv_buf` 读部分数据后,CH395F 的 `recv_len` 寄存器**被重置为 0**(非递减)。缓冲区中剩余的 1896 字节仍然存在(RECV_OK 标志为真),但 `ch395f_get_recv_len` 报告 0。
|
||||
|
||||
同时 `CH395F_DMA_BUF_SIZE=1500`(header 4 + max 1496 data),无法一次读取完整的 4096 字节 CH395F 接收缓冲区。
|
||||
|
||||
### 解决方案
|
||||
1. `CH395F_DMA_BUF_SIZE` 从 1500 增大到 4100(支持一次读 4096 字节 header+data)
|
||||
2. `receive_file` 缓冲区从 1024 增大到 4096,一次性读空 CH395F 接收缓冲区
|
||||
3. 不能使用 `malloc`(嵌入式堆可能不可用),改用 `static unsigned char s_recv_buf[4096]`
|
||||
|
||||
### 注意事项
|
||||
- CH395F 接收缓冲区默认 socket 0: 4096B, socket 1: 4096B。读空后客户端继续发数据,recv_len 重新递增——正常
|
||||
- 清理中断状态后 `handle_timeout_event` 中的 `ch395f_close_socket` 必须显式调用,确保下次 `open_socket` 成功
|
||||
|
||||
Reference in New Issue
Block a user