From 09f6dfa2c42f4b00fd0a340d1268aec3691110b0 Mon Sep 17 00:00:00 2001 From: Ondrej Kosta Date: Fri, 1 Sep 2023 18:27:04 +0200 Subject: [PATCH 1/2] feat(esp_eth): added IRAM optimization option for internal EMAC --- components/esp_eth/CMakeLists.txt | 2 ++ components/esp_eth/Kconfig | 7 +++++++ components/esp_eth/linker.lf | 19 +++++++++++++++++++ examples/ethernet/iperf/sdkconfig.defaults | 3 +++ 4 files changed, 31 insertions(+) create mode 100644 components/esp_eth/linker.lf diff --git a/components/esp_eth/CMakeLists.txt b/components/esp_eth/CMakeLists.txt index 5b8c7c5720..af18088efb 100644 --- a/components/esp_eth/CMakeLists.txt +++ b/components/esp_eth/CMakeLists.txt @@ -2,6 +2,7 @@ idf_build_get_property(components_to_build BUILD_COMPONENTS) set(srcs) set(include) +set(ld_fragments linker.lf) # As CONFIG_ETH_ENABLED comes from Kconfig, it is not evaluated yet # when components are being registered. # Thus, always add the (private) requirements, regardless of Kconfig @@ -50,6 +51,7 @@ endif() idf_component_register(SRCS "${srcs}" INCLUDE_DIRS ${include} + LDFRAGMENTS ${ld_fragments} REQUIRES esp_event # For using "ESP_EVENT_DECLARE_BASE" in header file PRIV_REQUIRES ${priv_requires}) if(CONFIG_ETH_ENABLED) diff --git a/components/esp_eth/Kconfig b/components/esp_eth/Kconfig index 8f85800a04..7b896711af 100644 --- a/components/esp_eth/Kconfig +++ b/components/esp_eth/Kconfig @@ -111,6 +111,13 @@ menu "Ethernet" cause obvious performance loss. endif + config ETH_IRAM_OPTIMIZATION + bool "Enable IRAM optimization" + default n + help + If enabled, functions related to RX/TX are placed into IRAM. It can improve Ethernet throughput. + If disabled, all functions are placed into FLASH. + endif # ETH_USE_ESP32_EMAC menuconfig ETH_USE_SPI_ETHERNET diff --git a/components/esp_eth/linker.lf b/components/esp_eth/linker.lf new file mode 100644 index 0000000000..aab1b42294 --- /dev/null +++ b/components/esp_eth/linker.lf @@ -0,0 +1,19 @@ +[mapping:esp_eth] +archive: libesp_eth.a +entries: + if ETH_IRAM_OPTIMIZATION = y: + esp_eth:esp_eth_transmit (noflash_text) + esp_eth:esp_eth_transmit_vargs (noflash_text) + esp_eth_mac_esp:emac_esp32_transmit (noflash_text) + esp_eth_mac_esp:emac_esp32_transmit_multiple_bufs (noflash_text) + esp_eth_mac_esp:emac_esp32_receive (noflash_text) + esp_eth_mac_esp:emac_esp32_rx_task (noflash_text) + +[mapping:esp_eth_hal] +archive: libhal.a +entries: + if ETH_IRAM_OPTIMIZATION = y: + emac_hal:emac_hal_transmit_frame (noflash) + emac_hal:emac_hal_transmit_multiple_buf_frame (noflash) + emac_hal:emac_hal_alloc_recv_buf (noflash) + emac_hal:emac_hal_receive_frame (noflash) diff --git a/examples/ethernet/iperf/sdkconfig.defaults b/examples/ethernet/iperf/sdkconfig.defaults index 17bd3fe137..efd490ca6d 100644 --- a/examples/ethernet/iperf/sdkconfig.defaults +++ b/examples/ethernet/iperf/sdkconfig.defaults @@ -21,3 +21,6 @@ CONFIG_ESP_TASK_WDT_EN=n # Enable lwIP IRAM optimization CONFIG_LWIP_IRAM_OPTIMIZATION=y + +# Enable Ethernet IRAM optimization +CONFIG_ETH_IRAM_OPTIMIZATION=y From 1199806d7181969d6140b78d31cf5e926905b5f9 Mon Sep 17 00:00:00 2001 From: Ondrej Kosta Date: Thu, 7 Sep 2023 09:36:01 +0200 Subject: [PATCH 2/2] docs(esp_eth): added Ethernet to Improving Network Speed section --- docs/en/api-guides/performance/speed.rst | 1 + docs/zh_CN/api-guides/performance/speed.rst | 1 + examples/ethernet/iperf/sdkconfig.defaults | 12 +++++++++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/en/api-guides/performance/speed.rst b/docs/en/api-guides/performance/speed.rst index fd90421b0e..04d731d8a7 100644 --- a/docs/en/api-guides/performance/speed.rst +++ b/docs/en/api-guides/performance/speed.rst @@ -244,6 +244,7 @@ Improving Network Speed :SOC_WIFI_SUPPORTED: * For Wi-Fi, see :ref:`How-to-improve-Wi-Fi-performance` and :ref:`wifi-buffer-usage` * For lwIP TCP/IP (Wi-Fi and Ethernet), see :ref:`lwip-performance` :SOC_WIFI_SUPPORTED: * The :example:`wifi/iperf` example contains a configuration that is heavily optimized for Wi-Fi TCP/IP throughput. Append the contents of the files :example_file:`wifi/iperf/sdkconfig.defaults`, :example_file:`wifi/iperf/sdkconfig.defaults.{IDF_TARGET_PATH_NAME}` and :example_file:`wifi/iperf/sdkconfig.ci.99` to the ``sdkconfig`` file in your project in order to add all of these options. Note that some of these options may have trade-offs in terms of reduced debuggability, increased firmware size, increased memory usage, or reduced performance of other features. To get the best result, read the documentation pages linked above and use related information to determine exactly which options are best suited for your app. + :SOC_EMAC_SUPPORTED: * The :example:`ethernet/iperf` example contains a configuration that is heavily optimized for Ethernet TCP/IP throughput. Examine :example_file:`ethernet/iperf/sdkconfig.defaults` for more details. Note that some of these options may have trade-offs in terms of reduced debuggability, increased firmware size, increased memory usage, or reduced performance of other features. To get the best result, read the documentation pages linked above and use related information to determine exactly which options are best suited for your app. Improving I/O Performance ------------------------- diff --git a/docs/zh_CN/api-guides/performance/speed.rst b/docs/zh_CN/api-guides/performance/speed.rst index f03b9daece..e883163533 100644 --- a/docs/zh_CN/api-guides/performance/speed.rst +++ b/docs/zh_CN/api-guides/performance/speed.rst @@ -244,6 +244,7 @@ ESP-IDF 支持动态 :doc:`/api-reference/system/intr_alloc` 和中断抢占。 :SOC_WIFI_SUPPORTED: * 关于提高 Wi-Fi 网速,参见 :ref:`How-to-improve-Wi-Fi-performance` 和 :ref:`wifi-buffer-usage` 。 * 关于提高 lwIP TCP/IP(Wi-Fi 和以太网)网速,参见 :ref:`lwip-performance` 。 :SOC_WIFI_SUPPORTED: * 示例 :example:`wifi/iperf` 包含了一种针对 Wi-Fi TCP/IP 吞吐量进行了大量优化的配置。将文件 :example_file:`wifi/iperf/sdkconfig.defaults` 、 :example_file:`wifi/iperf/sdkconfig.defaults.{IDF_TARGET_PATH_NAME}` 和 :example_file:`wifi/iperf/sdkconfig.ci.99` 的内容追加到项目的 ``sdkconfig`` 文件中,即可添加所有相关选项。请注意,部分选项可能会导致可调试性降低、固件大小增加、内存使用增加或其他功能的性能降低等影响。为了获得最佳结果,请阅读上述链接文档,并据此确定哪些选项最适合当前应用程序。 + :SOC_EMAC_SUPPORTED: * 示例 :example:`ethernet/iperf` 中的配置针对以太网 TCP/IP 吞吐量进行了大量优化。如需了解详情,请查看 :example_file:`ethernet/iperf/sdkconfig.defaults`。请注意,部分选项可能会导致可调试性降低、固件大小增加、内存使用增加或其他功能的性能降低等影响。为了获得最佳结果,请阅读上述链接文档,并据此确定哪些选项最适合当前应用程序。 提高 I/O 性能 ---------------------------------- diff --git a/examples/ethernet/iperf/sdkconfig.defaults b/examples/ethernet/iperf/sdkconfig.defaults index efd490ca6d..c6ad4c051e 100644 --- a/examples/ethernet/iperf/sdkconfig.defaults +++ b/examples/ethernet/iperf/sdkconfig.defaults @@ -1,7 +1,8 @@ # Increase main task stack size CONFIG_ESP_MAIN_TASK_STACK_SIZE=7168 -# Enable filesystem +# Enable filesystem for console commands history storage +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y CONFIG_PARTITION_TABLE_CUSTOM=y CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_example.csv" CONFIG_PARTITION_TABLE_FILENAME="partitions_example.csv" @@ -10,11 +11,16 @@ CONFIG_PARTITION_TABLE_FILENAME="partitions_example.csv" CONFIG_FREERTOS_USE_TRACE_FACILITY=y CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y +# -------------------------------- +# Performance optimization options +# -------------------------------- +# `lwIP` and `iperf` tasks have serial dependency to each other (i.e. `iperf` must wait for `lwIP` +# to process the packets). Therefore, you don't gain much performance improvement when running +# multi core mode. On the other hand, IRAM optimizations have greater effect for single core mode. + # Run FreeRTOS only on the first core CONFIG_FREERTOS_UNICORE=y -CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y - # Disable watch dog CONFIG_ESP_INT_WDT=n CONFIG_ESP_TASK_WDT_EN=n