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