我正在使用
STM32F407ZG/STM32F429IG 构建两个类似的控制板。主要功能是
一些主机发送数据量,大约 1M 字节(带 FSMC/SRAM 的 STM32F407)或 32M 字节(带 FMC/SDRAM 的 STM32F429)
到STM32并存储在内存中。然后在一些控制命令之后,STM32 MCU 控制 GPIOs
驱动另一块板。问题是:两个 STM32F4 MCU 都声称它们有高达 100M bps
传输速度,但我只有大约 100 kbps。
基本代码是使用 STM32CubeMX 生成的,启用了带有 CMSIS_v2 API、LwIP (2.1.2) 和 mbedTLS(用于加密)的 FreeRTOS。
固件是STM32Cube_FW_F4_V1.25.2,PHY是LAN8720A。我配置了三个任务:
1. 用于 TCP 处理的默认任务具有 1024 个字的堆栈大小
2. 低优先级的空闲任务通过 UDP 广播 MCU 的 IP 和端口(IP 是 DHCP 提供的),当接受 TCP 连接时被二进制信号量阻塞。
3. GPIO 传输的实时任务,降级为正常优先级进行测试(现在有 osDelay 的空任务)
我用谷歌搜索了一下,大多数技巧都是关于发送吞吐量的,似乎很少有人谈论接收。
[STM32CubeMX 和 STM32F429ZG 的低 TCP/IP 传输性能]
谈论memcpy性能,但在测试场景中,我什至不使用FSMC/FMC内存。但我改变了
内存映射:
1. 所有代码和 RW ZI 数据都移入 CCM 以获得更好的性能
2. etherne
tif、lwip、mem、memp 保存在 SRAM 1 中,以 0x20000000 开头,供 DMA 访问
3. SRAM 2 以 0x2001C000 开始,留作其他用途。
我使用 netconn API 在 MCU 上构建了一个 req/rep 模式服务器。当载荷数据小于 TCP_MSS 时,
它足够快,但是当我发送一个 32 kbytes 的数据块时,它变慢了。
我已将 TCP_MSS 扩大到 1460,将 TCP_WND 扩大到 11*TCP_MSS。所有其他尝试均失败。
最后一天的实验表明:当我在 low_level_input 中做一些 printf 来检查传入的
数据包信息,性能突然上升到 500 kbytes/s,也就是 4 Mbps。这是不可理解的,而且似乎
无法进入量子域:(。我还尝试了 sprintf 和其他方法来检查传入的数据包信息,但运气不佳。
那么我如何才能达到 100Mbps?