Marco Zecchini
/
Example_RTOS
Rtos API example
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Sun Jul 17 2022 08:25:28 by 1.7.2