1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-14 06:42:58 +08:00

fix(freertos): do not reinitalize mutex condition

This commit is contained in:
Gabor Kiss-Vamosi 2023-11-02 11:06:06 +01:00
parent 3922858f02
commit 9d624b64bd
3 changed files with 126 additions and 2 deletions

View File

@ -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?= <nicusor.citu@nxp.com>
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 <nicusor.citu@nxp.com>
---
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

View File

@ -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?= <nicusor.citu@nxp.com>
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 <nicusor.citu@nxp.com>
---
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

View File

@ -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;