1 /**
2  * @file lv_rtthread.c
3  *
4  */
5 
6 /*********************
7  *      INCLUDES
8  *********************/
9 #include "lv_os.h"
10 
11 #if LV_USE_OS == LV_OS_RTTHREAD
12 
13 #include "../misc/lv_log.h"
14 
15 /*********************
16  *      DEFINES
17  *********************/
18 
19 #define THREAD_TIMESLICE 20U
20 
21 /**********************
22  *      TYPEDEFS
23  **********************/
24 
25 /**********************
26  *  STATIC PROTOTYPES
27  **********************/
28 
29 /**********************
30  *  STATIC VARIABLES
31  **********************/
32 
33 /**********************
34  *      MACROS
35  **********************/
36 
37 /**********************
38  *   GLOBAL FUNCTIONS
39  **********************/
40 
lv_thread_init(lv_thread_t * thread,const char * const name,lv_thread_prio_t prio,void (* callback)(void *),size_t stack_size,void * user_data)41 lv_result_t lv_thread_init(lv_thread_t * thread, const char * const name, lv_thread_prio_t prio,
42                            void (*callback)(void *), size_t stack_size,
43                            void * user_data)
44 {
45     thread->thread = rt_thread_create(name,
46                                       callback,
47                                       user_data,
48                                       stack_size,
49                                       prio,
50                                       THREAD_TIMESLICE);
51     rt_err_t ret = rt_thread_startup(thread->thread);
52     if(ret) {
53         LV_LOG_WARN("Error: %d", ret);
54         return LV_RESULT_INVALID;
55     }
56     else {
57         return LV_RESULT_OK;
58     }
59 }
60 
lv_thread_delete(lv_thread_t * thread)61 lv_result_t lv_thread_delete(lv_thread_t * thread)
62 {
63     rt_err_t ret = rt_thread_delete(thread->thread);
64     if(ret) {
65         LV_LOG_WARN("Error: %d", ret);
66         return LV_RESULT_INVALID;
67     }
68     else {
69         return LV_RESULT_OK;
70     }
71 }
72 
lv_mutex_init(lv_mutex_t * mutex)73 lv_result_t lv_mutex_init(lv_mutex_t * mutex)
74 {
75     mutex->mutex = rt_mutex_create("mutex", RT_IPC_FLAG_PRIO);
76     if(mutex->mutex == RT_NULL) {
77         LV_LOG_WARN("create mutex failed");
78         return LV_RESULT_INVALID;
79     }
80     else {
81         return LV_RESULT_OK;
82     }
83 }
84 
lv_mutex_lock(lv_mutex_t * mutex)85 lv_result_t lv_mutex_lock(lv_mutex_t * mutex)
86 {
87     rt_err_t ret = rt_mutex_take(mutex->mutex, RT_WAITING_FOREVER);
88     if(ret) {
89         LV_LOG_WARN("Error: %d", ret);
90         return LV_RESULT_INVALID;
91     }
92     else {
93         return LV_RESULT_OK;
94     }
95 }
96 
lv_mutex_lock_isr(lv_mutex_t * mutex)97 lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex)
98 {
99     rt_err_t ret = rt_mutex_take(mutex->mutex, RT_WAITING_FOREVER);
100     if(ret) {
101         LV_LOG_WARN("Error: %d", ret);
102         return LV_RESULT_INVALID;
103     }
104     else {
105         return LV_RESULT_OK;
106     }
107 }
108 
lv_mutex_unlock(lv_mutex_t * mutex)109 lv_result_t lv_mutex_unlock(lv_mutex_t * mutex)
110 {
111     rt_err_t ret = rt_mutex_release(mutex->mutex);
112     if(ret) {
113         LV_LOG_WARN("Error: %d", ret);
114         return LV_RESULT_INVALID;
115     }
116     else {
117         return LV_RESULT_OK;
118     }
119 }
120 
lv_mutex_delete(lv_mutex_t * mutex)121 lv_result_t lv_mutex_delete(lv_mutex_t * mutex)
122 {
123     rt_err_t ret = rt_mutex_delete(mutex->mutex);
124     if(ret) {
125         LV_LOG_WARN("Error: %d", ret);
126         return LV_RESULT_INVALID;
127     }
128     else {
129         return LV_RESULT_OK;
130     }
131 }
132 
lv_thread_sync_init(lv_thread_sync_t * sync)133 lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync)
134 {
135     sync->sem = rt_sem_create("sem", 0, RT_IPC_FLAG_PRIO);
136     if(sync->sem == RT_NULL) {
137         LV_LOG_WARN("create semaphore failed");
138         return LV_RESULT_INVALID;
139     }
140     else {
141         return LV_RESULT_OK;
142     }
143 }
144 
lv_thread_sync_wait(lv_thread_sync_t * sync)145 lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync)
146 {
147     rt_err_t ret = rt_sem_take(sync->sem, RT_WAITING_FOREVER);
148     if(ret) {
149         LV_LOG_WARN("Error: %d", ret);
150         return LV_RESULT_INVALID;
151     }
152     else {
153         return LV_RESULT_OK;
154     }
155 }
156 
lv_thread_sync_signal(lv_thread_sync_t * sync)157 lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync)
158 {
159     rt_err_t ret = rt_sem_release(sync->sem);
160     if(ret) {
161         LV_LOG_WARN("Error: %d", ret);
162         return LV_RESULT_INVALID;
163     }
164     else {
165         return LV_RESULT_OK;
166     }
167 }
168 
lv_thread_sync_delete(lv_thread_sync_t * sync)169 lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync)
170 {
171     rt_err_t ret = rt_sem_delete(sync->sem);
172     if(ret) {
173         LV_LOG_WARN("Error: %d", ret);
174         return LV_RESULT_INVALID;
175     }
176     else {
177         return LV_RESULT_OK;
178     }
179 }
180 
lv_thread_sync_signal_isr(lv_thread_sync_t * sync)181 lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * sync)
182 {
183     LV_UNUSED(sync);
184     return LV_RESULT_INVALID;
185 }
186 
187 /**********************
188  *   STATIC FUNCTIONS
189  **********************/
190 
191 #endif /*LV_USE_OS == LV_OS_RTTHREAD*/
192