mbed-os

Dependents:   cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more

Committer:
be_bryan
Date:
Mon Dec 11 17:54:04 2017 +0000
Revision:
0:b74591d5ab33
motor ++

Who changed what in which revision?

UserRevisionLine numberNew 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 }