From 8d4ae2014bcffc75e076cf1b9bcd399bb8c5b0bc 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 acf5b6eccb20e2f307bef82e41d9e7d6ac3bae26 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 + examples/ethernet/iperf/sdkconfig.defaults | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/en/api-guides/performance/speed.rst b/docs/en/api-guides/performance/speed.rst index 07e85125e1..d58f4dec34 100644 --- a/docs/en/api-guides/performance/speed.rst +++ b/docs/en/api-guides/performance/speed.rst @@ -240,3 +240,4 @@ 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 your project ``sdkconfig`` file 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 this 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. 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