diff --git a/components/driver/Kconfig b/components/driver/Kconfig index ef88b4940e8..056687f9370 100644 --- a/components/driver/Kconfig +++ b/components/driver/Kconfig @@ -230,6 +230,7 @@ menu "Driver Configurations" 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 diff --git a/components/lwip/linker.lf b/components/lwip/linker.lf index 055b2fc55be..97e60e2d690 100644 --- a/components/lwip/linker.lf +++ b/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) diff --git a/components/vfs/CMakeLists.txt b/components/vfs/CMakeLists.txt index 6915429e95f..69d10c2ad2e 100644 --- a/components/vfs/CMakeLists.txt +++ b/components/vfs/CMakeLists.txt @@ -8,6 +8,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}) diff --git a/components/vfs/Kconfig b/components/vfs/Kconfig index 0c7b2ce9727..1665898e9d4 100644 --- a/components/vfs/Kconfig +++ b/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 diff --git a/components/vfs/linker.lf b/components/vfs/linker.lf new file mode 100644 index 00000000000..9c8e69b5f79 --- /dev/null +++ b/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) diff --git a/components/vfs/vfs.c b/components/vfs/vfs.c index 6adf9db1394..e121b3ac869 100644 --- a/components/vfs/vfs.c +++ b/components/vfs/vfs.c @@ -1133,6 +1133,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; }