11/*
2- * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
2+ * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
33 *
44 * SPDX-License-Identifier: Apache-2.0
55 */
@@ -72,9 +72,11 @@ typedef struct {
7272
7373typedef struct lvgl_port_ctx_s {
7474 SemaphoreHandle_t lvgl_mux ;
75+ SemaphoreHandle_t task_sem ;
7576 esp_timer_handle_t tick_timer ;
7677 bool running ;
7778 int task_max_sleep_ms ;
79+ int task_stop_to_ms ;
7880#ifdef ESP_LVGL_PORT_USB_HOST_HID_COMPONENT
7981 lvgl_port_usb_hid_ctx_t hid_ctx ;
8082#endif
@@ -184,8 +186,15 @@ esp_err_t lvgl_port_init(const lvgl_port_cfg_t *cfg)
184186 if (lvgl_port_ctx .task_max_sleep_ms == 0 ) {
185187 lvgl_port_ctx .task_max_sleep_ms = 500 ;
186188 }
189+ lvgl_port_ctx .task_stop_to_ms = cfg -> task_stop_to_ms ;
190+ if (lvgl_port_ctx .task_stop_to_ms == 0 ) {
191+ lvgl_port_ctx .task_stop_to_ms = 3000 ;
192+ }
187193 lvgl_port_ctx .lvgl_mux = xSemaphoreCreateRecursiveMutex ();
188194 ESP_GOTO_ON_FALSE (lvgl_port_ctx .lvgl_mux , ESP_ERR_NO_MEM , err , TAG , "Create LVGL mutex fail!" );
195+ lvgl_port_ctx .task_sem = xSemaphoreCreateBinary ();
196+ ESP_GOTO_ON_FALSE (lvgl_port_ctx .task_sem , ESP_ERR_NO_MEM , err , TAG , "Create LVGL task sem fail!" );
197+ ESP_GOTO_ON_FALSE (xSemaphoreGive (lvgl_port_ctx .task_sem ), ESP_FAIL , err , TAG , "Give LVGL task sem fail!" );
189198
190199 BaseType_t res ;
191200 if (cfg -> task_affinity < 0 ) {
@@ -239,9 +248,14 @@ esp_err_t lvgl_port_deinit(void)
239248 /* Stop running task */
240249 if (lvgl_port_ctx .running ) {
241250 lvgl_port_ctx .running = false;
242- } else {
243- lvgl_port_task_deinit ();
251+ /* Use the task semaphore to verify the task has stopped */
252+ if (xSemaphoreTake (lvgl_port_ctx .task_sem , pdMS_TO_TICKS (lvgl_port_ctx .task_stop_to_ms )) != pdTRUE ) {
253+ ESP_LOGE (TAG , "Failed to stop LVGL task" );
254+ return ESP_ERR_TIMEOUT ;
255+ }
256+ ESP_LOGI (TAG , "Stopped LVGL task" );
244257 }
258+ lvgl_port_task_deinit ();
245259
246260 return ESP_OK ;
247261}
@@ -682,6 +696,13 @@ void lvgl_port_flush_ready(lv_disp_t *disp)
682696
683697static void lvgl_port_task (void * arg )
684698{
699+ /* Take the task semaphore */
700+ if (xSemaphoreTake (lvgl_port_ctx .task_sem , 0 ) != pdTRUE ) {
701+ ESP_LOGE (TAG , "Failed to take LVGL task sem" );
702+ lvgl_port_task_deinit ();
703+ vTaskDelete ( NULL );
704+ }
705+
685706 uint32_t task_delay_ms = lvgl_port_ctx .task_max_sleep_ms ;
686707
687708 ESP_LOGI (TAG , "Starting LVGL task" );
@@ -699,7 +720,8 @@ static void lvgl_port_task(void *arg)
699720 vTaskDelay (pdMS_TO_TICKS (task_delay_ms ));
700721 }
701722
702- lvgl_port_task_deinit ();
723+ /* Give semaphore back */
724+ xSemaphoreGive (lvgl_port_ctx .task_sem );
703725
704726 /* Close task */
705727 vTaskDelete ( NULL );
@@ -710,6 +732,9 @@ static void lvgl_port_task_deinit(void)
710732 if (lvgl_port_ctx .lvgl_mux ) {
711733 vSemaphoreDelete (lvgl_port_ctx .lvgl_mux );
712734 }
735+ if (lvgl_port_ctx .task_sem ) {
736+ vSemaphoreDelete (lvgl_port_ctx .task_sem );
737+ }
713738 memset (& lvgl_port_ctx , 0 , sizeof (lvgl_port_ctx ));
714739#if LV_ENABLE_GC || !LV_MEM_CUSTOM
715740 /* Deinitialize LVGL */
0 commit comments