mbed-os
Dependents: cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more
features/FEATURE_COMMON_PAL/nanostack-hal-mbed-cmsis-rtos/ns_event_loop.c@0:b74591d5ab33, 2017-12-11 (annotated)
- Committer:
- be_bryan
- Date:
- Mon Dec 11 17:54:04 2017 +0000
- Revision:
- 0:b74591d5ab33
motor ++
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
be_bryan | 0:b74591d5ab33 | 1 | /* |
be_bryan | 0:b74591d5ab33 | 2 | * Copyright (c) 2016 ARM Limited, All Rights Reserved |
be_bryan | 0:b74591d5ab33 | 3 | */ |
be_bryan | 0:b74591d5ab33 | 4 | |
be_bryan | 0:b74591d5ab33 | 5 | #include <mbed_assert.h> |
be_bryan | 0:b74591d5ab33 | 6 | #include "cmsis.h" |
be_bryan | 0:b74591d5ab33 | 7 | #include "cmsis_os2.h" |
be_bryan | 0:b74591d5ab33 | 8 | #include "mbed_rtos_storage.h" |
be_bryan | 0:b74591d5ab33 | 9 | #include "ns_trace.h" |
be_bryan | 0:b74591d5ab33 | 10 | |
be_bryan | 0:b74591d5ab33 | 11 | #include "eventOS_scheduler.h" |
be_bryan | 0:b74591d5ab33 | 12 | |
be_bryan | 0:b74591d5ab33 | 13 | #include "ns_event_loop.h" |
be_bryan | 0:b74591d5ab33 | 14 | |
be_bryan | 0:b74591d5ab33 | 15 | #define TRACE_GROUP "evlp" |
be_bryan | 0:b74591d5ab33 | 16 | |
be_bryan | 0:b74591d5ab33 | 17 | static void event_loop_thread(void *arg); |
be_bryan | 0:b74591d5ab33 | 18 | |
be_bryan | 0:b74591d5ab33 | 19 | static uint64_t event_thread_stk[MBED_CONF_NANOSTACK_HAL_EVENT_LOOP_THREAD_STACK_SIZE/8]; |
be_bryan | 0:b74591d5ab33 | 20 | static mbed_rtos_storage_thread_t event_thread_tcb; |
be_bryan | 0:b74591d5ab33 | 21 | static const osThreadAttr_t event_thread_attr = { |
be_bryan | 0:b74591d5ab33 | 22 | .name = "nanostack_event_thread", |
be_bryan | 0:b74591d5ab33 | 23 | .priority = osPriorityNormal, |
be_bryan | 0:b74591d5ab33 | 24 | .stack_mem = &event_thread_stk[0], |
be_bryan | 0:b74591d5ab33 | 25 | .stack_size = sizeof event_thread_stk, |
be_bryan | 0:b74591d5ab33 | 26 | .cb_mem = &event_thread_tcb, |
be_bryan | 0:b74591d5ab33 | 27 | .cb_size = sizeof event_thread_tcb, |
be_bryan | 0:b74591d5ab33 | 28 | }; |
be_bryan | 0:b74591d5ab33 | 29 | static osThreadId_t event_thread_id; |
be_bryan | 0:b74591d5ab33 | 30 | static mbed_rtos_storage_mutex_t event_mutex; |
be_bryan | 0:b74591d5ab33 | 31 | static const osMutexAttr_t event_mutex_attr = { |
be_bryan | 0:b74591d5ab33 | 32 | .name = "nanostack_event_mutex", |
be_bryan | 0:b74591d5ab33 | 33 | .attr_bits = osMutexRecursive | osMutexPrioInherit | osMutexRobust, |
be_bryan | 0:b74591d5ab33 | 34 | .cb_mem = &event_mutex, |
be_bryan | 0:b74591d5ab33 | 35 | .cb_size = sizeof event_mutex, |
be_bryan | 0:b74591d5ab33 | 36 | }; |
be_bryan | 0:b74591d5ab33 | 37 | static osMutexId_t event_mutex_id; |
be_bryan | 0:b74591d5ab33 | 38 | static osThreadId_t event_mutex_owner_id = NULL; |
be_bryan | 0:b74591d5ab33 | 39 | static uint32_t owner_count = 0; |
be_bryan | 0:b74591d5ab33 | 40 | |
be_bryan | 0:b74591d5ab33 | 41 | void eventOS_scheduler_mutex_wait(void) |
be_bryan | 0:b74591d5ab33 | 42 | { |
be_bryan | 0:b74591d5ab33 | 43 | osMutexAcquire(event_mutex_id, osWaitForever); |
be_bryan | 0:b74591d5ab33 | 44 | if (0 == owner_count) { |
be_bryan | 0:b74591d5ab33 | 45 | event_mutex_owner_id = osThreadGetId(); |
be_bryan | 0:b74591d5ab33 | 46 | } |
be_bryan | 0:b74591d5ab33 | 47 | owner_count++; |
be_bryan | 0:b74591d5ab33 | 48 | } |
be_bryan | 0:b74591d5ab33 | 49 | |
be_bryan | 0:b74591d5ab33 | 50 | void eventOS_scheduler_mutex_release(void) |
be_bryan | 0:b74591d5ab33 | 51 | { |
be_bryan | 0:b74591d5ab33 | 52 | owner_count--; |
be_bryan | 0:b74591d5ab33 | 53 | if (0 == owner_count) { |
be_bryan | 0:b74591d5ab33 | 54 | event_mutex_owner_id = NULL; |
be_bryan | 0:b74591d5ab33 | 55 | } |
be_bryan | 0:b74591d5ab33 | 56 | osMutexRelease(event_mutex_id); |
be_bryan | 0:b74591d5ab33 | 57 | } |
be_bryan | 0:b74591d5ab33 | 58 | |
be_bryan | 0:b74591d5ab33 | 59 | uint8_t eventOS_scheduler_mutex_is_owner(void) |
be_bryan | 0:b74591d5ab33 | 60 | { |
be_bryan | 0:b74591d5ab33 | 61 | return osThreadGetId() == event_mutex_owner_id ? 1 : 0; |
be_bryan | 0:b74591d5ab33 | 62 | } |
be_bryan | 0:b74591d5ab33 | 63 | |
be_bryan | 0:b74591d5ab33 | 64 | void eventOS_scheduler_signal(void) |
be_bryan | 0:b74591d5ab33 | 65 | { |
be_bryan | 0:b74591d5ab33 | 66 | // XXX why does signal set lock if called with irqs disabled? |
be_bryan | 0:b74591d5ab33 | 67 | //__enable_irq(); |
be_bryan | 0:b74591d5ab33 | 68 | //tr_debug("signal %p", (void*)event_thread_id); |
be_bryan | 0:b74591d5ab33 | 69 | osThreadFlagsSet(event_thread_id, 1); |
be_bryan | 0:b74591d5ab33 | 70 | //tr_debug("signalled %p", (void*)event_thread_id); |
be_bryan | 0:b74591d5ab33 | 71 | } |
be_bryan | 0:b74591d5ab33 | 72 | |
be_bryan | 0:b74591d5ab33 | 73 | void eventOS_scheduler_idle(void) |
be_bryan | 0:b74591d5ab33 | 74 | { |
be_bryan | 0:b74591d5ab33 | 75 | //tr_debug("idle"); |
be_bryan | 0:b74591d5ab33 | 76 | eventOS_scheduler_mutex_release(); |
be_bryan | 0:b74591d5ab33 | 77 | osThreadFlagsWait(1, 0, osWaitForever); |
be_bryan | 0:b74591d5ab33 | 78 | eventOS_scheduler_mutex_wait(); |
be_bryan | 0:b74591d5ab33 | 79 | } |
be_bryan | 0:b74591d5ab33 | 80 | |
be_bryan | 0:b74591d5ab33 | 81 | static void event_loop_thread(void *arg) |
be_bryan | 0:b74591d5ab33 | 82 | { |
be_bryan | 0:b74591d5ab33 | 83 | (void)arg; |
be_bryan | 0:b74591d5ab33 | 84 | eventOS_scheduler_mutex_wait(); |
be_bryan | 0:b74591d5ab33 | 85 | eventOS_scheduler_run(); //Does not return |
be_bryan | 0:b74591d5ab33 | 86 | } |
be_bryan | 0:b74591d5ab33 | 87 | |
be_bryan | 0:b74591d5ab33 | 88 | void ns_event_loop_thread_create(void) |
be_bryan | 0:b74591d5ab33 | 89 | { |
be_bryan | 0:b74591d5ab33 | 90 | event_mutex_id = osMutexNew(&event_mutex_attr); |
be_bryan | 0:b74591d5ab33 | 91 | MBED_ASSERT(event_mutex_id != NULL); |
be_bryan | 0:b74591d5ab33 | 92 | |
be_bryan | 0:b74591d5ab33 | 93 | event_thread_id = osThreadNew(event_loop_thread, NULL, &event_thread_attr); |
be_bryan | 0:b74591d5ab33 | 94 | MBED_ASSERT(event_thread_id != NULL); |
be_bryan | 0:b74591d5ab33 | 95 | } |
be_bryan | 0:b74591d5ab33 | 96 | |
be_bryan | 0:b74591d5ab33 | 97 | void ns_event_loop_thread_start(void) |
be_bryan | 0:b74591d5ab33 | 98 | { |
be_bryan | 0:b74591d5ab33 | 99 | } |