diff --git a/components/esp_rom/linux/esp_rom_sys.c b/components/esp_rom/linux/esp_rom_sys.c index 041b86f93f..ab9ce23cea 100644 --- a/components/esp_rom/linux/esp_rom_sys.c +++ b/components/esp_rom/linux/esp_rom_sys.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -10,6 +10,8 @@ #include #include #include +#include +#include #include "esp_rom_sys.h" static void call_linux_putc(char c); @@ -264,9 +266,16 @@ int esp_rom_printf(const char *fmt, ...) void esp_rom_delay_us(uint32_t us) { - int sleep_result = usleep(us); - assert(sleep_result == 0); - (void)sleep_result; // Prevents compiler from optimizing out usleep() due to unused result. Also prevents warning. + struct timespec wait_time = { + .tv_sec = us / 1000000, + .tv_nsec = us % 1000000 * 1000, + }; + /* + If nanosleep() is interrupted by a signal handler, nanosleep() + returns -1, sets errno to EINTR, and writes the remaining time. + The remaining time is used to call nanosleep() again and complete the specified pause. + */ + while (nanosleep(&wait_time, &wait_time) == -1 && errno == EINTR) { }; } void esp_rom_install_channel_putc(int channel, void (*putc)(char c)) diff --git a/tools/test_apps/linux_compatible/linux_freertos/components/kernel_tests/tasks/test_freertos_task_delete.c b/tools/test_apps/linux_compatible/linux_freertos/components/kernel_tests/tasks/test_freertos_task_delete.c index 459a03ee6e..9e2df436fd 100644 --- a/tools/test_apps/linux_compatible/linux_freertos/components/kernel_tests/tasks/test_freertos_task_delete.c +++ b/tools/test_apps/linux_compatible/linux_freertos/components/kernel_tests/tasks/test_freertos_task_delete.c @@ -60,7 +60,7 @@ static void tsk_blocks_frequently(void *param) } } -TEST_CASE("FreeRTOS Delete Blocked Tasks", "[freertos][ignore]") // TODO: esp_rom_delay_us is interrupted by signal +TEST_CASE("FreeRTOS Delete Blocked Tasks", "[freertos]") { TaskHandle_t blocking_tasks[configNUM_CORES + 1]; // one per CPU, plus one unpinned task tsk_blocks_param_t params[configNUM_CORES + 1] = { 0 };