From b95d74bfcb5c3372c43625c16ce3ebcf0632e888 Mon Sep 17 00:00:00 2001 From: lhdjply <1029652979@qq.com> Date: Fri, 3 Nov 2023 17:54:11 +0800 Subject: [PATCH] feat(os): add rt-thread for osal (#4746) --- Kconfig | 1 + lv_conf_template.h | 1 + src/lv_conf_internal.h | 1 + src/misc/lv_types.h | 1 + src/osal/lv_os.h | 2 + src/osal/lv_rtthread.c | 184 +++++++++++++++++++++++++++++++++++++++++ src/osal/lv_rtthread.h | 54 ++++++++++++ 7 files changed, 244 insertions(+) create mode 100644 src/osal/lv_rtthread.c create mode 100644 src/osal/lv_rtthread.h diff --git a/Kconfig b/Kconfig index fe10f3246..0babfd84a 100644 --- a/Kconfig +++ b/Kconfig @@ -179,6 +179,7 @@ menu "LVGL configuration" 1:LV_OS_PTHREAD 2:LV_OS_FREERTOS 3:LV_OS_CMSIS_RTOS2 + 4:LV_OS_RTTHREAD 255:LV_OS_CUSTOM config LV_USE_DRAW_SW diff --git a/lv_conf_template.h b/lv_conf_template.h index 1dd19e8c2..929cfaeab 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -134,6 +134,7 @@ * - LV_OS_PTHREAD * - LV_OS_FREERTOS * - LV_OS_CMSIS_RTOS2 + * - LV_OS_RTTHREAD * - LV_OS_CUSTOM */ #define LV_USE_OS LV_OS_NONE diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index c0e14cebf..5b0caea92 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -332,6 +332,7 @@ * - LV_OS_PTHREAD * - LV_OS_FREERTOS * - LV_OS_CMSIS_RTOS2 + * - LV_OS_RTTHREAD * - LV_OS_CUSTOM */ #ifndef LV_USE_OS #ifdef CONFIG_LV_USE_OS diff --git a/src/misc/lv_types.h b/src/misc/lv_types.h index ee263c4f0..ecfc12d97 100644 --- a/src/misc/lv_types.h +++ b/src/misc/lv_types.h @@ -36,6 +36,7 @@ extern "C" { #define LV_OS_PTHREAD 1 #define LV_OS_FREERTOS 2 #define LV_OS_CMSIS_RTOS2 3 +#define LV_OS_RTTHREAD 4 #define LV_OS_CUSTOM 255 #define LV_STDLIB_BUILTIN 0 diff --git a/src/osal/lv_os.h b/src/osal/lv_os.h index 488686a71..2b007af11 100644 --- a/src/osal/lv_os.h +++ b/src/osal/lv_os.h @@ -30,6 +30,8 @@ extern "C" { #include "lv_freertos.h" #elif LV_USE_OS == LV_OS_CMSIS_RTOS2 #include "lv_cmsis_rtos2.h" +#elif LV_USE_OS == LV_OS_RTTHREAD +#include "lv_rtthread.h" #elif LV_USE_OS == LV_OS_CUSTOM #include LV_OS_CUSTOM_INCLUDE #endif diff --git a/src/osal/lv_rtthread.c b/src/osal/lv_rtthread.c new file mode 100644 index 000000000..956cbd2a3 --- /dev/null +++ b/src/osal/lv_rtthread.c @@ -0,0 +1,184 @@ +/** + * @file lv_rtthread.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_os.h" + +#if LV_USE_OS == LV_OS_RTTHREAD + +#include "../misc/lv_log.h" + +/********************* + * DEFINES + *********************/ + +#define THREAD_TIMESLICE 20U + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_thread_init(lv_thread_t * thread, lv_thread_prio_t prio, void (*callback)(void *), size_t stack_size, + void * user_data) +{ + thread->thread = rt_thread_create("thread", + callback, + user_data, + stack_size, + prio, + THREAD_TIMESLICE); + rt_err_t ret = rt_thread_startup(thread->thread); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_thread_delete(lv_thread_t * thread) +{ + rt_err_t ret = rt_thread_delete(thread->thread); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_init(lv_mutex_t * mutex) +{ + mutex->mutex = rt_mutex_create("mutex", RT_IPC_FLAG_PRIO); + if(mutex->mutex == RT_NULL) { + LV_LOG_WARN("create mutex failed"); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_lock(lv_mutex_t * mutex) +{ + rt_err_t ret = rt_mutex_take(mutex->mutex, RT_WAITING_NO); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) +{ + rt_err_t ret = rt_mutex_take(mutex->mutex, RT_WAITING_FOREVER); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) +{ + rt_err_t ret = rt_mutex_release(mutex->mutex); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_delete(lv_mutex_t * mutex) +{ + rt_err_t ret = rt_mutex_delete(mutex->mutex); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) +{ + sync->sem = rt_sem_create("sem", RT_IPC_FLAG_PRIO); + if(sync->sem == RT_NULL) { + LV_LOG_WARN("create semaphore failed"); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) +{ + rt_err_t ret = rt_sem_take(sync->sem, RT_WAITING_FOREVER); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) +{ + rt_err_t ret = rt_sem_release(sync->sem); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) +{ + rt_err_t ret = rt_sem_delete(sync->sem); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_OS == LV_OS_RTTHREAD*/ diff --git a/src/osal/lv_rtthread.h b/src/osal/lv_rtthread.h new file mode 100644 index 000000000..c1dfbcddf --- /dev/null +++ b/src/osal/lv_rtthread.h @@ -0,0 +1,54 @@ +/** + * @file lv_rtthread.h + * + */ + +#ifndef LV_RTTHREAD_H +#define LV_RTTHREAD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#if LV_USE_OS == LV_OS_RTTHREAD + +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + rt_thread thread; +} lv_thread_t; + +typedef struct { + rt_mutex_t mutex; +} lv_mutex_t; + +typedef struct { + rt_sem_t sem; +} lv_thread_sync_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OS == LV_OS_RTTHREAD*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_RTTHREAD_H*/