From 9d624b64bd35d3d30c6a7d3d197856155e702bf3 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Thu, 2 Nov 2023 11:06:06 +0100 Subject: [PATCH] fix(freertos): do not reinitalize mutex condition --- ...not-reinitialize-the-mutex-condition.patch | 44 +++++++++++ ...dd-unit_count-to-figure-out-if-other.patch | 78 +++++++++++++++++++ src/osal/lv_freertos.c | 6 +- 3 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 0001-fix-freertos-Do-not-reinitialize-the-mutex-condition.patch create mode 100644 0002-feat-draw_unit-Add-unit_count-to-figure-out-if-other.patch diff --git a/0001-fix-freertos-Do-not-reinitialize-the-mutex-condition.patch b/0001-fix-freertos-Do-not-reinitialize-the-mutex-condition.patch new file mode 100644 index 000000000..afb0b1100 --- /dev/null +++ b/0001-fix-freertos-Do-not-reinitialize-the-mutex-condition.patch @@ -0,0 +1,44 @@ +From c5bd602452a72e031cc91050e2dc7a04e8d6bc49 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Nicu=C8=99or=20C=C3=AE=C8=9Bu?= +Date: Mon, 30 Oct 2023 15:07:38 +0200 +Subject: [PATCH 1/2] fix(freertos) Do not reinitialize the mutex/conditional + if already done. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +In some cases, the mutex_lock() gets called before its creation so it will perform the init first. +Next, if mutex_init() gets eventually called, do not reinit the mutex. + +Signed-off-by: Nicușor Cîțu +--- + src/osal/lv_freertos.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/src/osal/lv_freertos.c b/src/osal/lv_freertos.c +index 49192402d..bc3f7d9d8 100644 +--- a/src/osal/lv_freertos.c ++++ b/src/osal/lv_freertos.c +@@ -96,7 +96,8 @@ lv_result_t lv_thread_delete(lv_thread_t * pxThread) + + lv_result_t lv_mutex_init(lv_mutex_t * pxMutex) + { +- prvMutexInit(pxMutex); ++ /* If mutex in uninitialized, perform initialization. */ ++ prvCheckMutexInit(pxMutex); + + return LV_RESULT_OK; + } +@@ -165,7 +166,8 @@ lv_result_t lv_thread_sync_init(lv_thread_sync_t * pxCond) + /* Store the handle of the calling task. */ + pxCond->xTaskToNotify = xTaskGetCurrentTaskHandle(); + #else +- prvCondInit(pxCond); ++ /* If the cond is uninitialized, perform initialization. */ ++ prvCheckCondInit(pxCond); + #endif + + return LV_RESULT_OK; +-- +2.25.1 + diff --git a/0002-feat-draw_unit-Add-unit_count-to-figure-out-if-other.patch b/0002-feat-draw_unit-Add-unit_count-to-figure-out-if-other.patch new file mode 100644 index 000000000..3e6c500d0 --- /dev/null +++ b/0002-feat-draw_unit-Add-unit_count-to-figure-out-if-other.patch @@ -0,0 +1,78 @@ +From d4c7c547c1c3ea36c08a5decf6b9d68ce4739044 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Nicu=C8=99or=20C=C3=AE=C8=9Bu?= +Date: Wed, 1 Nov 2023 10:57:34 +0200 +Subject: [PATCH 2/2] feat(draw_unit) Add unit_count to figure out if other + units are available. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Nicușor Cîțu +--- + src/draw/lv_draw.c | 1 + + src/draw/lv_draw.h | 1 + + src/draw/nxp/vglite/lv_draw_vglite.c | 10 ++++++++-- + 3 files changed, 10 insertions(+), 2 deletions(-) + +diff --git a/src/draw/lv_draw.c b/src/draw/lv_draw.c +index c84816c91..0f6f85bbf 100644 +--- a/src/draw/lv_draw.c ++++ b/src/draw/lv_draw.c +@@ -57,6 +57,7 @@ void * lv_draw_create_unit(size_t size) + + new_unit->next = _draw_info.unit_head; + _draw_info.unit_head = new_unit; ++ _draw_info.unit_count++; + + return new_unit; + } +diff --git a/src/draw/lv_draw.h b/src/draw/lv_draw.h +index 6eb99e71a..497a444be 100644 +--- a/src/draw/lv_draw.h ++++ b/src/draw/lv_draw.h +@@ -174,6 +174,7 @@ typedef struct { + + typedef struct { + lv_draw_unit_t * unit_head; ++ uint32_t unit_count; + uint32_t used_memory_for_layers_kb; + #if LV_USE_OS + lv_thread_sync_t sync; +diff --git a/src/draw/nxp/vglite/lv_draw_vglite.c b/src/draw/nxp/vglite/lv_draw_vglite.c +index 3278bb548..fe2fd8179 100644 +--- a/src/draw/nxp/vglite/lv_draw_vglite.c ++++ b/src/draw/nxp/vglite/lv_draw_vglite.c +@@ -20,12 +20,15 @@ + #include "lv_vglite_buf.h" + #include "lv_vglite_utils.h" + ++#include "../../../core/lv_global.h" + #include "../../../display/lv_display_private.h" + + /********************* + * DEFINES + *********************/ + ++#define _draw_info LV_GLOBAL_DEFAULT()->draw_info ++ + #define DRAW_UNIT_ID_VGLITE 2 + + #if LV_USE_OS +@@ -237,9 +240,12 @@ static int32_t _vglite_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) + /* Try to get an ready to draw. */ + lv_draw_task_t * t = lv_draw_get_next_available_task(layer, NULL, DRAW_UNIT_ID_VGLITE); + +- /* Return 0 is no selection, some tasks can be supported by other units. */ ++ /* If no selection: ++ * return 0 if any other unit is available and might support the task ++ * return -1 if no more units ++ */ + if(t == NULL || t->preferred_draw_unit_id != DRAW_UNIT_ID_VGLITE) +- return 0; ++ return (_draw_info.unit_count > 1 ? 0 : -1); + + void * buf = lv_draw_layer_alloc_buf(layer); + if(buf == NULL) +-- +2.25.1 + diff --git a/src/osal/lv_freertos.c b/src/osal/lv_freertos.c index 49192402d..bc3f7d9d8 100644 --- a/src/osal/lv_freertos.c +++ b/src/osal/lv_freertos.c @@ -96,7 +96,8 @@ lv_result_t lv_thread_delete(lv_thread_t * pxThread) lv_result_t lv_mutex_init(lv_mutex_t * pxMutex) { - prvMutexInit(pxMutex); + /* If mutex in uninitialized, perform initialization. */ + prvCheckMutexInit(pxMutex); return LV_RESULT_OK; } @@ -165,7 +166,8 @@ lv_result_t lv_thread_sync_init(lv_thread_sync_t * pxCond) /* Store the handle of the calling task. */ pxCond->xTaskToNotify = xTaskGetCurrentTaskHandle(); #else - prvCondInit(pxCond); + /* If the cond is uninitialized, perform initialization. */ + prvCheckCondInit(pxCond); #endif return LV_RESULT_OK;