Просмотр исходного кода

Merge branch 'bugfix/uart_vfs_select_in_iram' into 'master'

fix: add UART VFS select callback in IRAM when CONFIG_UART_ISR_IN_IRAM is enabled

See merge request espressif/esp-idf!24899
Sonika Rathi 2 лет назад
Родитель
Сommit
c8243465e4

+ 1 - 0
components/driver/uart/Kconfig.uart

@@ -3,6 +3,7 @@ menu "UART Configuration"
     config UART_ISR_IN_IRAM
         bool "Place UART ISR function into IRAM"
         depends on !RINGBUF_PLACE_ISR_FUNCTIONS_INTO_FLASH
+        select VFS_SELECT_IN_RAM if VFS_SUPPORT_SELECT
         default n
         help
             If this option is not selected, UART interrupt will be disabled for a long time and

+ 2 - 0
components/lwip/linker.lf

@@ -134,3 +134,5 @@ entries:
       memp:do_memp_malloc_pool (noflash_text)
   if ESP_ALLOW_BSS_SEG_EXTERNAL_MEMORY = y:
     * (extram_bss)
+  if VFS_SELECT_IN_RAM = y:
+    vfs_lwip:lwip_stop_socket_select_isr (noflash)

+ 1 - 0
components/vfs/CMakeLists.txt

@@ -14,6 +14,7 @@ list(APPEND pr driver
                esp_timer)
 
 idf_component_register(SRCS ${sources}
+                       LDFRAGMENTS "linker.lf"
                        INCLUDE_DIRS include
                        PRIV_INCLUDE_DIRS private_include
                        PRIV_REQUIRES ${pr})

+ 7 - 0
components/vfs/Kconfig

@@ -63,6 +63,13 @@ menu "Virtual file system"
             It is possible to suppress these debug outputs by enabling this
             option.
 
+    config VFS_SELECT_IN_RAM
+        bool "Make VFS driver select() callbacks IRAM-safe"
+        default n
+        depends on VFS_SUPPORT_SELECT
+        help
+            If enabled, VFS driver select() callback function will be placed in IRAM.
+
     config VFS_SUPPORT_TERMIOS
         bool "Provide termios.h functions"
         default y

+ 6 - 0
components/vfs/linker.lf

@@ -0,0 +1,6 @@
+[mapping:vfs]
+archive: libvfs.a
+entries:
+  if VFS_SELECT_IN_RAM = y:
+    vfs:esp_vfs_select_triggered_isr (noflash)
+    vfs_uart:select_notif_callback_isr (noflash)

+ 1 - 1
components/vfs/test_apps/pytest_vfs.py

@@ -11,7 +11,7 @@ from pytest_embedded import Dut
 @pytest.mark.esp32h2
 @pytest.mark.generic
 @pytest.mark.parametrize('config', [
-    'default',
+    'default', 'iram',
 ], indirect=True)
 def test_vfs_default(dut: Dut) -> None:
     dut.run_all_single_board_cases()

+ 1 - 0
components/vfs/test_apps/sdkconfig.ci.iram

@@ -0,0 +1 @@
+CONFIG_UART_ISR_IN_IRAM=y

+ 1 - 0
components/vfs/vfs.c

@@ -1194,6 +1194,7 @@ void esp_vfs_select_triggered_isr(esp_vfs_select_sem_t sem, BaseType_t *woken)
             // matter here stop_socket_select() will be called for only valid VFS drivers.
             const vfs_entry_t *vfs = s_vfs[i];
             if (vfs != NULL && vfs->vfs.stop_socket_select_isr != NULL) {
+                // Note: If the UART ISR resides in IRAM, the function referenced by stop_socket_select_isr should also be placed in IRAM.
                 vfs->vfs.stop_socket_select_isr(sem.sem, woken);
                 break;
             }