Rtos API example

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ns_event_loop.c Source File

ns_event_loop.c

00001 /*
00002  * Copyright (c) 2016 ARM Limited, All Rights Reserved
00003  */
00004 
00005 #include <mbed_assert.h>
00006 #include "cmsis.h"
00007 #include "cmsis_os2.h"
00008 #include "mbed_rtos_storage.h"
00009 #include "ns_trace.h"
00010 
00011 #include "eventOS_scheduler.h"
00012 
00013 #include "ns_event_loop.h"
00014 
00015 #define TRACE_GROUP "evlp"
00016 
00017 static void event_loop_thread(void *arg);
00018 
00019 static uint64_t event_thread_stk[MBED_CONF_NANOSTACK_HAL_EVENT_LOOP_THREAD_STACK_SIZE/8];
00020 static mbed_rtos_storage_thread_t event_thread_tcb;
00021 static const osThreadAttr_t event_thread_attr = {
00022     .name = "nanostack_event_thread",
00023     .priority = osPriorityNormal,
00024     .stack_mem = &event_thread_stk[0],
00025     .stack_size = sizeof event_thread_stk,
00026     .cb_mem = &event_thread_tcb,
00027     .cb_size = sizeof event_thread_tcb,
00028 };
00029 static osThreadId_t event_thread_id;
00030 static mbed_rtos_storage_mutex_t event_mutex;
00031 static const osMutexAttr_t event_mutex_attr = {
00032   .name = "nanostack_event_mutex",
00033   .attr_bits = osMutexRecursive | osMutexPrioInherit | osMutexRobust,
00034   .cb_mem = &event_mutex,
00035   .cb_size = sizeof event_mutex,
00036 };
00037 static osMutexId_t event_mutex_id;
00038 static osThreadId_t event_mutex_owner_id = NULL;
00039 static uint32_t owner_count = 0;
00040 
00041 void eventOS_scheduler_mutex_wait(void)
00042 {
00043     osMutexAcquire(event_mutex_id, osWaitForever);
00044     if (0 == owner_count) {
00045         event_mutex_owner_id = osThreadGetId();
00046     }
00047     owner_count++;
00048 }
00049 
00050 void eventOS_scheduler_mutex_release(void)
00051 {
00052     owner_count--;
00053     if (0 == owner_count) {
00054         event_mutex_owner_id = NULL;
00055     }
00056     osMutexRelease(event_mutex_id);
00057 }
00058 
00059 uint8_t eventOS_scheduler_mutex_is_owner(void)
00060 {
00061     return osThreadGetId() == event_mutex_owner_id ? 1 : 0;
00062 }
00063 
00064 void eventOS_scheduler_signal(void)
00065 {
00066     // XXX why does signal set lock if called with irqs disabled?
00067     //__enable_irq();
00068     //tr_debug("signal %p", (void*)event_thread_id);
00069     osThreadFlagsSet(event_thread_id, 1);
00070     //tr_debug("signalled %p", (void*)event_thread_id);
00071 }
00072 
00073 void eventOS_scheduler_idle(void)
00074 {
00075     //tr_debug("idle");
00076     eventOS_scheduler_mutex_release();
00077     osThreadFlagsWait(1, 0, osWaitForever);
00078     eventOS_scheduler_mutex_wait();
00079 }
00080 
00081 static void event_loop_thread(void *arg)
00082 {
00083     (void)arg;
00084     eventOS_scheduler_mutex_wait();
00085     eventOS_scheduler_run(); //Does not return
00086 }
00087 
00088 void ns_event_loop_thread_create(void)
00089 {
00090     event_mutex_id = osMutexNew(&event_mutex_attr);
00091     MBED_ASSERT(event_mutex_id != NULL);
00092 
00093     event_thread_id = osThreadNew(event_loop_thread, NULL, &event_thread_attr);
00094     MBED_ASSERT(event_thread_id != NULL);
00095 }
00096 
00097 void ns_event_loop_thread_start(void)
00098 {
00099 }