From 283d7b5ebdf7a5a28f71dea5a41792775e6fc196 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Tue, 1 Sep 2026 10:30:42 +0800 Subject: [PATCH 1/2] fix(esp_system): wait for idle after light sleep stress tasks Self-deleted worker tasks are only freed once idle runs. A 500us periodic esp_timer can starve that cleanup and trip Unity's leak check. --- .../test_apps/esp_system_unity_tests/main/test_sleep.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/components/esp_system/test_apps/esp_system_unity_tests/main/test_sleep.c b/components/esp_system/test_apps/esp_system_unity_tests/main/test_sleep.c index 91fd82e6074..9899493bafb 100644 --- a/components/esp_system/test_apps/esp_system_unity_tests/main/test_sleep.c +++ b/components/esp_system/test_apps/esp_system_unity_tests/main/test_sleep.c @@ -97,6 +97,8 @@ TEST_CASE("light sleep stress test", "[lightsleep]") #if CONFIG_FREERTOS_NUMBER_OF_CORES == 2 xSemaphoreTake(done, portMAX_DELAY); #endif + /* vTaskDelete() only queues TCB/stack for idle; wait for two idle passes. */ + vTaskDelay(2); vSemaphoreDelete(done); } @@ -123,9 +125,12 @@ TEST_CASE("light sleep stress test with periodic esp_timer", "[lightsleep]") #if CONFIG_FREERTOS_NUMBER_OF_CORES == 2 xSemaphoreTake(done, portMAX_DELAY); #endif - vSemaphoreDelete(done); + /* Stop the periodic timer first, otherwise it starves idle and the + * self-deleted worker looks like a leak to Unity. */ esp_timer_stop(timer); esp_timer_delete(timer); + vTaskDelay(2); + vSemaphoreDelete(done); } #endif // !(CONFIG_SPIRAM) || (CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL >= 16384) From 85bb3faa5f0d4ef2a6887b3eef8259ec86d033a6 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Tue, 1 Sep 2026 10:39:56 +0800 Subject: [PATCH 2/2] fix(esp_system): delay after light sleep stress cleanup --- .../test_apps/esp_system_unity_tests/main/test_sleep.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/components/esp_system/test_apps/esp_system_unity_tests/main/test_sleep.c b/components/esp_system/test_apps/esp_system_unity_tests/main/test_sleep.c index 9899493bafb..dca43299e55 100644 --- a/components/esp_system/test_apps/esp_system_unity_tests/main/test_sleep.c +++ b/components/esp_system/test_apps/esp_system_unity_tests/main/test_sleep.c @@ -97,9 +97,8 @@ TEST_CASE("light sleep stress test", "[lightsleep]") #if CONFIG_FREERTOS_NUMBER_OF_CORES == 2 xSemaphoreTake(done, portMAX_DELAY); #endif - /* vTaskDelete() only queues TCB/stack for idle; wait for two idle passes. */ - vTaskDelay(2); vSemaphoreDelete(done); + vTaskDelay(10); } static void timer_func(void* arg) @@ -125,12 +124,10 @@ TEST_CASE("light sleep stress test with periodic esp_timer", "[lightsleep]") #if CONFIG_FREERTOS_NUMBER_OF_CORES == 2 xSemaphoreTake(done, portMAX_DELAY); #endif - /* Stop the periodic timer first, otherwise it starves idle and the - * self-deleted worker looks like a leak to Unity. */ + vSemaphoreDelete(done); esp_timer_stop(timer); esp_timer_delete(timer); - vTaskDelay(2); - vSemaphoreDelete(done); + vTaskDelay(10); } #endif // !(CONFIG_SPIRAM) || (CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL >= 16384)