问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

ESP32 WiFi性能优化:从缓冲区配置到实际测试

创作时间:
作者:
@小白创作中心

ESP32 WiFi性能优化:从缓冲区配置到实际测试

引用
CSDN
1.
https://m.blog.csdn.net/YWZ_97/article/details/144364368

本文将介绍如何通过优化ESP32-S3的WiFi配置参数来提升HTTP传输性能。通过调整接收和发送缓冲区、AMPDU聚合以及CPU频率等关键参数,可以显著提高数据传输速度。

总体流程

下图展示了数据从硬件接收到应用程序接收的完整流程:

  1. Wi-Fi 硬件在空中接收到数据包后,将数据包内容放到“静态接收数据缓冲区”(即“接收数据 DMA 缓冲区”)。
  2. Wi-Fi 驱动程序分配一个“动态接收数据缓冲区”,复制“静态接收数据缓冲区”的内容,并将“静态接收数据缓冲区”返回给硬件。
  3. Wi-Fi 驱动程序将数据包传送到上层(LwIP),并分配一个 PBUF 用于存放“动态接收数据缓冲区”。
  4. 应用程序从 LwIP 接收数据。

整个流程中,数据经过了多次“转移”,但实际的数据复制通常只发生了两次:

  1. 从“静态接收缓冲区”复制到“动态接收缓冲区”。
  2. 从“动态接收缓冲区”复制到“用户数据缓冲区”。

协议栈工作模式

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) 的值,从而实现高稳定性能。同时,在有多个流的情况下,应相应降低该参数值。

此外,还可以通过以下方式进一步优化性能:

  1. 禁用电源保存模式:调用 esp_wifi_set_ps(WIFI_PS_NONE) 函数,关闭 Wi-Fi 的省电功能。
  2. 调整 Wi-Fi 配置:在初始化 Wi-Fi 时,使用 wifi_init_config_t 结构体,并设置适当的参数。
  3. 配置 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,目前的优化已经取得了显著的效果。虽然还有优化空间,但过度优化可能会挤占其他应用的空间,因此当前的性能已经足够满足大多数应用场景的需求。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号