xref: /nrf52832-nimble/rt-thread/components/CMSIS/RTOS/cmsis_rtthread.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero #include "cmsis_os.h"
2*10465441SEvalZero 
3*10465441SEvalZero // Kernel Control Public API
4*10465441SEvalZero 
5*10465441SEvalZero /// Start the RTOS Kernel with executing the specified thread
osKernelStart(void)6*10465441SEvalZero osStatus osKernelStart(void)
7*10465441SEvalZero {
8*10465441SEvalZero     rt_system_scheduler_start();
9*10465441SEvalZero 
10*10465441SEvalZero     return osOK;
11*10465441SEvalZero }
12*10465441SEvalZero 
13*10465441SEvalZero /// Check if the RTOS kernel is already started
osKernelRunning(void)14*10465441SEvalZero int32_t osKernelRunning(void)
15*10465441SEvalZero {
16*10465441SEvalZero     return (rt_thread_self() != RT_NULL) ?  1 : 0;
17*10465441SEvalZero }
18*10465441SEvalZero 
19*10465441SEvalZero // Thread Public API
20*10465441SEvalZero 
21*10465441SEvalZero /// Create a thread and add it to Active Threads and set it to state READY
osThreadCreate(osThreadDef_t * thread_def,void * argument)22*10465441SEvalZero osThreadId osThreadCreate(osThreadDef_t *thread_def, void *argument)
23*10465441SEvalZero {
24*10465441SEvalZero     osThreadId thread;
25*10465441SEvalZero     int size;
26*10465441SEvalZero 
27*10465441SEvalZero     size = thread_def->stack_size;
28*10465441SEvalZero     if (size == 0)
29*10465441SEvalZero     {
30*10465441SEvalZero         size = 4096;
31*10465441SEvalZero     }
32*10465441SEvalZero 
33*10465441SEvalZero     thread = rt_thread_create(thread_def->name, thread_def->entry, argument, size, thread_def->priority, thread_def->tick);
34*10465441SEvalZero     if (thread != RT_NULL)
35*10465441SEvalZero         rt_thread_startup(thread);
36*10465441SEvalZero 
37*10465441SEvalZero     return thread;
38*10465441SEvalZero }
39*10465441SEvalZero 
40*10465441SEvalZero /// Return the thread ID of the current running thread
osThreadGetId(void)41*10465441SEvalZero osThreadId osThreadGetId(void)
42*10465441SEvalZero {
43*10465441SEvalZero     return rt_thread_self();
44*10465441SEvalZero }
45*10465441SEvalZero 
46*10465441SEvalZero /// Terminate execution of a thread and remove it from ActiveThreads
osThreadTerminate(osThreadId thread_id)47*10465441SEvalZero osStatus osThreadTerminate(osThreadId thread_id)
48*10465441SEvalZero {
49*10465441SEvalZero     rt_err_t result;
50*10465441SEvalZero 
51*10465441SEvalZero     result = rt_thread_delete(thread_id);
52*10465441SEvalZero 
53*10465441SEvalZero     if (result == RT_EOK)
54*10465441SEvalZero         return osOK;
55*10465441SEvalZero     else
56*10465441SEvalZero         return osErrorOS;
57*10465441SEvalZero }
58*10465441SEvalZero 
59*10465441SEvalZero /// Pass control to next thread that is in state READY
osThreadYield(void)60*10465441SEvalZero osStatus osThreadYield(void)
61*10465441SEvalZero {
62*10465441SEvalZero     rt_err_t result;
63*10465441SEvalZero 
64*10465441SEvalZero     result = rt_thread_yield();
65*10465441SEvalZero 
66*10465441SEvalZero     if (result == RT_EOK)
67*10465441SEvalZero         return osOK;
68*10465441SEvalZero     else
69*10465441SEvalZero         return osErrorOS;
70*10465441SEvalZero }
71*10465441SEvalZero 
72*10465441SEvalZero /// Change prority of an active thread
osThreadSetPriority(osThreadId thread_id,osPriority priority)73*10465441SEvalZero osStatus osThreadSetPriority(osThreadId thread_id, osPriority priority)
74*10465441SEvalZero {
75*10465441SEvalZero     rt_err_t result;
76*10465441SEvalZero 
77*10465441SEvalZero     if (thread_id == RT_NULL)
78*10465441SEvalZero         return osErrorOS;
79*10465441SEvalZero 
80*10465441SEvalZero     if (priority < osPriorityIdle || priority > osPriorityRealtime)
81*10465441SEvalZero         return osErrorPriority;
82*10465441SEvalZero 
83*10465441SEvalZero     result = rt_thread_control(thread_id, RT_THREAD_CTRL_CHANGE_PRIORITY, &priority);
84*10465441SEvalZero 
85*10465441SEvalZero     if (result == RT_EOK)
86*10465441SEvalZero         return osOK;
87*10465441SEvalZero     else
88*10465441SEvalZero         return osErrorOS;
89*10465441SEvalZero }
90*10465441SEvalZero 
91*10465441SEvalZero /// Get current prority of an active thread
osThreadGetPriority(osThreadId thread_id)92*10465441SEvalZero osPriority osThreadGetPriority(osThreadId thread_id)
93*10465441SEvalZero {
94*10465441SEvalZero     if (thread_id == RT_NULL)
95*10465441SEvalZero         return osPriorityError;
96*10465441SEvalZero 
97*10465441SEvalZero     if ((osPriority)thread_id->current_priority < osPriorityIdle || (osPriority)thread_id->current_priority > osPriorityRealtime)
98*10465441SEvalZero         return osPriorityError;
99*10465441SEvalZero 
100*10465441SEvalZero     return thread_id->current_priority;
101*10465441SEvalZero }
102*10465441SEvalZero 
103*10465441SEvalZero // Generic Wait API
104*10465441SEvalZero 
105*10465441SEvalZero /// Wait for Timeout (Time Delay)
osDelay(uint32_t millisec)106*10465441SEvalZero osStatus osDelay(uint32_t millisec)
107*10465441SEvalZero {
108*10465441SEvalZero     rt_err_t result;
109*10465441SEvalZero     rt_tick_t ticks;
110*10465441SEvalZero 
111*10465441SEvalZero     ticks = rt_tick_from_millisecond(millisec);
112*10465441SEvalZero     result = rt_thread_delay(ticks);
113*10465441SEvalZero 
114*10465441SEvalZero     if (result == RT_EOK)
115*10465441SEvalZero         return osOK;
116*10465441SEvalZero     else
117*10465441SEvalZero         return osErrorOS;
118*10465441SEvalZero }
119*10465441SEvalZero 
120*10465441SEvalZero /// Wait for Signal, Message, Mail, or Timeout
osWait(uint32_t millisec)121*10465441SEvalZero osEvent osWait(uint32_t millisec)
122*10465441SEvalZero {
123*10465441SEvalZero     rt_err_t result;
124*10465441SEvalZero     rt_tick_t ticks;
125*10465441SEvalZero 
126*10465441SEvalZero     ticks = rt_tick_from_millisecond(millisec);
127*10465441SEvalZero     result = rt_thread_delay(ticks);
128*10465441SEvalZero /*
129*10465441SEvalZero     if (result == RT_EOK)
130*10465441SEvalZero         return osOK;
131*10465441SEvalZero     else
132*10465441SEvalZero         return osErrorOS;
133*10465441SEvalZero */
134*10465441SEvalZero }
135*10465441SEvalZero 
136*10465441SEvalZero // Timer Management Public API
137*10465441SEvalZero 
138*10465441SEvalZero /// Create timer
osTimerCreate(osTimerDef_t * timer_def,os_timer_type type,void * argument)139*10465441SEvalZero osTimerId osTimerCreate(osTimerDef_t *timer_def, os_timer_type type, void *argument)
140*10465441SEvalZero {
141*10465441SEvalZero     uint8_t flag = RT_TIMER_FLAG_SOFT_TIMER;
142*10465441SEvalZero 
143*10465441SEvalZero     if (type == osTimerPeriodic)
144*10465441SEvalZero     {
145*10465441SEvalZero         flag |= RT_TIMER_FLAG_PERIODIC;
146*10465441SEvalZero     }
147*10465441SEvalZero 
148*10465441SEvalZero     return rt_timer_create(timer_def->name, timer_def->timeout, argument, timer_def->time, flag);
149*10465441SEvalZero }
150*10465441SEvalZero 
151*10465441SEvalZero /// Start or restart timer
osTimerStart(osTimerId timer_id,uint32_t millisec)152*10465441SEvalZero osStatus osTimerStart(osTimerId timer_id, uint32_t millisec)
153*10465441SEvalZero {
154*10465441SEvalZero     rt_err_t result;
155*10465441SEvalZero     rt_tick_t ticks;
156*10465441SEvalZero 
157*10465441SEvalZero     ticks = rt_tick_from_millisecond(millisec);
158*10465441SEvalZero     rt_timer_control(timer_id, RT_TIMER_CTRL_SET_TIME, &ticks);
159*10465441SEvalZero     result = rt_timer_start(timer_id);
160*10465441SEvalZero     if (result == RT_EOK)
161*10465441SEvalZero         return osOK;
162*10465441SEvalZero     else
163*10465441SEvalZero         return osErrorOS;
164*10465441SEvalZero }
165*10465441SEvalZero 
166*10465441SEvalZero /// Stop timer
osTimerStop(osTimerId timer_id)167*10465441SEvalZero osStatus osTimerStop(osTimerId timer_id)
168*10465441SEvalZero {
169*10465441SEvalZero     rt_err_t result;
170*10465441SEvalZero 
171*10465441SEvalZero     result = rt_timer_stop(timer_id);
172*10465441SEvalZero     if (result == RT_EOK)
173*10465441SEvalZero         return osOK;
174*10465441SEvalZero     else
175*10465441SEvalZero         return osErrorOS;
176*10465441SEvalZero }
177*10465441SEvalZero 
178*10465441SEvalZero // Mutex Public API
179*10465441SEvalZero 
180*10465441SEvalZero /// Create and Initialize a Mutex object
osMutexCreate(osMutexDef_t * mutex_def)181*10465441SEvalZero osMutexId osMutexCreate(osMutexDef_t *mutex_def)
182*10465441SEvalZero {
183*10465441SEvalZero     return rt_mutex_create(mutex_def->name, mutex_def->flag);
184*10465441SEvalZero }
185*10465441SEvalZero 
186*10465441SEvalZero /// Wait until a Mutex becomes available
osMutexWait(osMutexId mutex_id,uint32_t millisec)187*10465441SEvalZero osStatus osMutexWait(osMutexId mutex_id, uint32_t millisec)
188*10465441SEvalZero {
189*10465441SEvalZero     rt_err_t result;
190*10465441SEvalZero     rt_tick_t ticks;
191*10465441SEvalZero 
192*10465441SEvalZero     ticks = rt_tick_from_millisecond(millisec);
193*10465441SEvalZero     result = rt_mutex_take(mutex_id, ticks);
194*10465441SEvalZero 
195*10465441SEvalZero     if (result == RT_EOK)
196*10465441SEvalZero         return osOK;
197*10465441SEvalZero     else
198*10465441SEvalZero         return osErrorOS;
199*10465441SEvalZero }
200*10465441SEvalZero 
201*10465441SEvalZero /// Release a Mutex that was obtained with osMutexWait
osMutexRelease(osMutexId mutex_id)202*10465441SEvalZero osStatus osMutexRelease(osMutexId mutex_id)
203*10465441SEvalZero {
204*10465441SEvalZero     rt_err_t result;
205*10465441SEvalZero 
206*10465441SEvalZero     result = rt_mutex_release(mutex_id);
207*10465441SEvalZero 
208*10465441SEvalZero     if (result == RT_EOK)
209*10465441SEvalZero         return osOK;
210*10465441SEvalZero     else
211*10465441SEvalZero         return osErrorOS;
212*10465441SEvalZero }
213*10465441SEvalZero 
osMutexDelete(osMutexId mutex_id)214*10465441SEvalZero osStatus osMutexDelete (osMutexId mutex_id)
215*10465441SEvalZero {
216*10465441SEvalZero     rt_err_t result;
217*10465441SEvalZero 
218*10465441SEvalZero     result = rt_mutex_delete(mutex_id);
219*10465441SEvalZero 
220*10465441SEvalZero     if (result == RT_EOK)
221*10465441SEvalZero         return osOK;
222*10465441SEvalZero     else
223*10465441SEvalZero         return osErrorOS;
224*10465441SEvalZero }
225*10465441SEvalZero 
226*10465441SEvalZero // Semaphore Public API
227*10465441SEvalZero 
228*10465441SEvalZero /// Create and Initialize a Semaphore object
osSemaphoreCreate(osSemaphoreDef_t * semaphore_def,int32_t count)229*10465441SEvalZero osSemaphoreId osSemaphoreCreate(osSemaphoreDef_t *semaphore_def, int32_t count)
230*10465441SEvalZero {
231*10465441SEvalZero     return rt_sem_create(semaphore_def->name, count, semaphore_def->flag);
232*10465441SEvalZero }
233*10465441SEvalZero 
234*10465441SEvalZero /// Wait until a Semaphore becomes available
osSemaphoreWait(osSemaphoreId semaphore_id,uint32_t millisec)235*10465441SEvalZero int32_t osSemaphoreWait(osSemaphoreId semaphore_id, uint32_t millisec)
236*10465441SEvalZero {
237*10465441SEvalZero     rt_tick_t ticks;
238*10465441SEvalZero 
239*10465441SEvalZero     if (semaphore_id == RT_NULL)
240*10465441SEvalZero         return -1;
241*10465441SEvalZero 
242*10465441SEvalZero     ticks = rt_tick_from_millisecond(millisec);
243*10465441SEvalZero     rt_sem_take(semaphore_id, ticks);
244*10465441SEvalZero 
245*10465441SEvalZero     return semaphore_id->value;
246*10465441SEvalZero }
247*10465441SEvalZero 
248*10465441SEvalZero /// Release a Semaphore
osSemaphoreRelease(osSemaphoreId semaphore_id)249*10465441SEvalZero osStatus osSemaphoreRelease(osSemaphoreId semaphore_id)
250*10465441SEvalZero {
251*10465441SEvalZero     rt_err_t result;
252*10465441SEvalZero 
253*10465441SEvalZero     result = rt_sem_release(semaphore_id);
254*10465441SEvalZero 
255*10465441SEvalZero     if (result == RT_EOK)
256*10465441SEvalZero         return osOK;
257*10465441SEvalZero     else
258*10465441SEvalZero         return osErrorOS;
259*10465441SEvalZero }
260*10465441SEvalZero 
261*10465441SEvalZero // Memory Management Public API
262*10465441SEvalZero 
263*10465441SEvalZero /// Create and Initialize memory pool
osPoolCreate(osPoolDef_t * pool_def)264*10465441SEvalZero osPoolId osPoolCreate(osPoolDef_t *pool_def)
265*10465441SEvalZero {
266*10465441SEvalZero     return rt_mp_create(pool_def->name, pool_def->block_count, pool_def->block_size);
267*10465441SEvalZero }
268*10465441SEvalZero 
269*10465441SEvalZero /// Allocate a memory block from a memory pool
osPoolAlloc(osPoolId pool_id)270*10465441SEvalZero void *osPoolAlloc(osPoolId pool_id)
271*10465441SEvalZero {
272*10465441SEvalZero     return rt_mp_alloc(pool_id, 0);
273*10465441SEvalZero }
274*10465441SEvalZero 
275*10465441SEvalZero /// Allocate a memory block from a memory pool and set memory block to zero
osPoolCAlloc(osPoolId pool_id)276*10465441SEvalZero void *osPoolCAlloc(osPoolId pool_id)
277*10465441SEvalZero {
278*10465441SEvalZero     return RT_NULL;
279*10465441SEvalZero }
280*10465441SEvalZero 
281*10465441SEvalZero /// Return an allocated memory block back to a specific memory pool
osPoolFree(osPoolId pool_id,void * block)282*10465441SEvalZero osStatus osPoolFree(osPoolId pool_id, void *block)
283*10465441SEvalZero {
284*10465441SEvalZero     rt_mp_free(block);
285*10465441SEvalZero 
286*10465441SEvalZero     return osOK;
287*10465441SEvalZero }
288*10465441SEvalZero 
289*10465441SEvalZero // Message Queue Management Public API
290*10465441SEvalZero 
291*10465441SEvalZero /// Create and Initialize Message Queue
osMessageCreate(osMessageQDef_t * queue_def,osThreadId thread_id)292*10465441SEvalZero osMessageQId osMessageCreate(osMessageQDef_t *queue_def, osThreadId thread_id)
293*10465441SEvalZero {
294*10465441SEvalZero     return rt_mq_create(queue_def->name, queue_def->msg_size, queue_def->max_msgs, queue_def->flag);
295*10465441SEvalZero }
296*10465441SEvalZero 
297*10465441SEvalZero /// Put a Message to a Queue
osMessagePut(osMessageQId queue_id,uint32_t info,uint32_t millisec)298*10465441SEvalZero osStatus osMessagePut(osMessageQId queue_id, uint32_t info, uint32_t millisec)
299*10465441SEvalZero {
300*10465441SEvalZero     rt_err_t result;
301*10465441SEvalZero 
302*10465441SEvalZero     result = rt_mq_send(queue_id, &info, 4);
303*10465441SEvalZero 
304*10465441SEvalZero     if (result == RT_EOK)
305*10465441SEvalZero         return osOK;
306*10465441SEvalZero     else
307*10465441SEvalZero         return osErrorOS;
308*10465441SEvalZero }
309*10465441SEvalZero 
310*10465441SEvalZero /// Get a Message or Wait for a Message from a Queue
osMessageGet(osMessageQId queue_id,uint32_t millisec)311*10465441SEvalZero osEvent osMessageGet(osMessageQId queue_id, uint32_t millisec)
312*10465441SEvalZero {
313*10465441SEvalZero     osEvent event;
314*10465441SEvalZero     rt_err_t result;
315*10465441SEvalZero     rt_tick_t ticks;
316*10465441SEvalZero 
317*10465441SEvalZero     ticks = rt_tick_from_millisecond(millisec);
318*10465441SEvalZero     result = rt_mq_recv(queue_id, &event.value, 4, ticks);
319*10465441SEvalZero 
320*10465441SEvalZero     if (result == RT_EOK)
321*10465441SEvalZero     {
322*10465441SEvalZero         event.status = osEventMessage;
323*10465441SEvalZero     }
324*10465441SEvalZero     else
325*10465441SEvalZero     {
326*10465441SEvalZero         event.status = osEventTimeout;
327*10465441SEvalZero     }
328*10465441SEvalZero 
329*10465441SEvalZero     return event;
330*10465441SEvalZero }
331*10465441SEvalZero 
332*10465441SEvalZero // Mail Queue Management Public API
333*10465441SEvalZero 
334*10465441SEvalZero /// Create and Initialize mail queue
osMailCreate(osMailQDef_t * queue_def,osThreadId thread_id)335*10465441SEvalZero osMailQId osMailCreate(osMailQDef_t *queue_def, osThreadId thread_id)
336*10465441SEvalZero {
337*10465441SEvalZero     return RT_NULL;
338*10465441SEvalZero }
339*10465441SEvalZero 
340*10465441SEvalZero /// Allocate a memory block from a mail
osMailAlloc(osMailQId queue_id,uint32_t millisec)341*10465441SEvalZero void *osMailAlloc(osMailQId queue_id, uint32_t millisec)
342*10465441SEvalZero {
343*10465441SEvalZero     return RT_NULL;
344*10465441SEvalZero }
345*10465441SEvalZero 
346*10465441SEvalZero /// Allocate a memory block from a mail and set memory block to zero
osMailCAlloc(osMailQId queue_id,uint32_t millisec)347*10465441SEvalZero void *osMailCAlloc(osMailQId queue_id, uint32_t millisec)
348*10465441SEvalZero {
349*10465441SEvalZero     return RT_NULL;
350*10465441SEvalZero }
351*10465441SEvalZero 
352*10465441SEvalZero /// Free a memory block from a mail
osMailFree(osMailQId queue_id,void * mail)353*10465441SEvalZero osStatus osMailFree(osMailQId queue_id, void *mail)
354*10465441SEvalZero {
355*10465441SEvalZero     return osErrorOS;
356*10465441SEvalZero }
357*10465441SEvalZero 
358*10465441SEvalZero /// Put a mail to a queue
osMailPut(osMailQId queue_id,void * mail)359*10465441SEvalZero osStatus osMailPut(osMailQId queue_id, void *mail)
360*10465441SEvalZero {
361*10465441SEvalZero     return osErrorOS;
362*10465441SEvalZero }
363*10465441SEvalZero 
364*10465441SEvalZero /// Get a mail from a queue
osMailGet(osMailQId queue_id,uint32_t millisec)365*10465441SEvalZero osEvent osMailGet(osMailQId queue_id, uint32_t millisec)
366*10465441SEvalZero {
367*10465441SEvalZero   osEvent ret;
368*10465441SEvalZero 
369*10465441SEvalZero   if (queue_id == NULL) {
370*10465441SEvalZero     ret.status = osErrorParameter;
371*10465441SEvalZero     return ret;
372*10465441SEvalZero   }
373*10465441SEvalZero 
374*10465441SEvalZero   ret = osMessageGet(*((void **)queue_id), millisec);
375*10465441SEvalZero   if (ret.status == osEventMessage) ret.status = osEventMail;
376*10465441SEvalZero 
377*10465441SEvalZero   return ret;
378*10465441SEvalZero }
379*10465441SEvalZero 
380*10465441SEvalZero 
381