ESP32 WiFi性能优化:从缓冲区配置到实际测试
ESP32 WiFi性能优化:从缓冲区配置到实际测试
本文将介绍如何通过优化ESP32-S3的WiFi配置参数来提升HTTP传输性能。通过调整接收和发送缓冲区、AMPDU聚合以及CPU频率等关键参数,可以显著提高数据传输速度。
总体流程
下图展示了数据从硬件接收到应用程序接收的完整流程:
- Wi-Fi 硬件在空中接收到数据包后,将数据包内容放到“静态接收数据缓冲区”(即“接收数据 DMA 缓冲区”)。
- Wi-Fi 驱动程序分配一个“动态接收数据缓冲区”,复制“静态接收数据缓冲区”的内容,并将“静态接收数据缓冲区”返回给硬件。
- Wi-Fi 驱动程序将数据包传送到上层(LwIP),并分配一个 PBUF 用于存放“动态接收数据缓冲区”。
- 应用程序从 LwIP 接收数据。
整个流程中,数据经过了多次“转移”,但实际的数据复制通常只发生了两次:
- 从“静态接收缓冲区”复制到“动态接收缓冲区”。
- 从“动态接收缓冲区”复制到“用户数据缓冲区”。
协议栈工作模式
ESP32-S3 协议栈分为四层,分别为应用层、LWIP 层、Wi-Fi 层和硬件层。在接收过程中,硬件将接收到的数据包放入 DMA 缓冲区,然后依次传送到 Wi-Fi 的接收数据缓冲区、LWIP 的接收数据缓冲区进行相关协议处理,最后传送到应用层。Wi-Fi 的接收数据缓冲区和 LWIP 的接收数据缓冲区默认共享同一个缓冲区。
在发送过程中,应用程序首先将要发送的消息复制到 LWIP 层的发送数据缓冲区,进行 TCP/IP 封装。然后将消息发送到 Wi-Fi 层的发送数据缓冲区进行 MAC 封装,最后等待发送。
关键参数配置
通过调整以下参数可以优化WiFi性能:
- CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM:硬件层的 DMA 缓冲区数量。提高该参数将增加发送方的一次性接收吞吐量,从而提高 Wi-Fi 协议栈处理突发流量的能力。
- CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM:Wi-Fi 层中接收数据缓冲区的数量。提高该参数可以增强数据包的接收性能。该参数需要与 LWIP 层的接收数据缓冲区大小相匹配。
- CONFIG_ESP_WIFI_RX_BA_WIN:接收端 AMPDU BA 窗口的大小,应配置为 CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM 和 CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM 的二倍数值中较小的数值。
- CONFIG_LWIP_TCP_WND_DEFAULT:LWIP 层用于每个 TCP 流的接收数据缓冲区大小,应配置为 WIFI_DYNAMIC_RX_BUFFER_NUM (KB) 的值,从而实现高稳定性能。同时,在有多个流的情况下,应相应降低该参数值。
此外,还可以通过以下方式进一步优化性能:
- 禁用电源保存模式:调用
esp_wifi_set_ps(WIFI_PS_NONE)
函数,关闭 Wi-Fi 的省电功能。 - 调整 Wi-Fi 配置:在初始化 Wi-Fi 时,使用
wifi_init_config_t
结构体,并设置适当的参数。 - 配置 Wi-Fi 信道和带宽:选择干扰较少的信道,并设置为 40MHz 带宽。
优化后的配置
以下是经过优化的配置参数:
CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=16
CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=64
CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=64
CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y
CONFIG_ESP_WIFI_TX_BA_WIN=32
CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y
CONFIG_ESP_WIFI_RX_BA_WIN=32
CONFIG_LWIP_TCP_SND_BUF_DEFAULT=65535
CONFIG_LWIP_TCP_WND_DEFAULT=65535
CONFIG_LWIP_TCP_RECVMBOX_SIZE=64
CONFIG_LWIP_UDP_RECVMBOX_SIZE=64
CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=64
CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y
CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB=y
CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_32B=y
CONFIG_ESP32S3_INSTRUCTION_CACHE_WRAP=y
这些参数的含义如下:
Wi-Fi 接收和发送缓冲区配置:
CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=16
:设置 Wi-Fi 静态接收缓冲区的数量为 16。CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=64
:设置 Wi-Fi 动态接收缓冲区的数量为 64。CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=64
:设置 Wi-Fi 动态发送缓冲区的数量为 64。AMPDU(聚合 MAC 协议数据单元)配置:
CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y
:启用 Wi-Fi 的 AMPDU 发送功能。CONFIG_ESP_WIFI_TX_BA_WIN=32
:设置发送端的 Block Ack 窗口大小为 32。CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y
:启用 Wi-Fi 的 AMPDU 接收功能。CONFIG_ESP_WIFI_RX_BA_WIN=32
:设置接收端的 Block Ack 窗口大小为 32。lwIP(轻量级 IP 协议栈)TCP/IP 配置:
CONFIG_LWIP_TCP_SND_BUF_DEFAULT=65535
:设置默认的 TCP 发送缓冲区大小为 65535 字节。CONFIG_LWIP_TCP_WND_DEFAULT=65535
:设置默认的 TCP 窗口大小为 65535 字节。CONFIG_LWIP_TCP_RECVMBOX_SIZE=64
:设置 TCP 接收邮箱的大小为 64。CONFIG_LWIP_UDP_RECVMBOX_SIZE=64
:设置 UDP 接收邮箱的大小为 64。CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=64
:设置 TCP/IP 任务接收邮箱的大小为 64。CPU 频率和 Flash 配置:
CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y
:将 CPU 默认频率设置为 240 MHz。CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240
:明确指定 CPU 频率为 240 MHz。CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
:将 Flash 模式设置为 QIO。CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
:将 Flash 频率设置为 80 MHz。ESP32-S3 指令缓存配置:
CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB=y
:为 ESP32-S3 配置 32KB 的指令缓存。CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_32B=y
:设置指令缓存行大小为 32 字节。
测试结果
经过优化后的测试结果显示:
- 下载速度:1712.68 KB/s
- 文件大小:1029472 bytes
- 耗时:587 ms
以及:
- 下载速度:2139.03 KB/s
- 文件大小:1029472 bytes
- 耗时:470 ms
结论
从ESP-IDF的官方文档可以看到,最大的理论速度为86.1Mbit/s即10.7625 MB/s,目前的优化已经取得了显著的效果。虽然还有优化空间,但过度优化可能会挤占其他应用的空间,因此当前的性能已经足够满足大多数应用场景的需求。