Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
mbed-os/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop.c@0:8fdf9a60065b, 2018-10-10 (annotated)
- Committer:
- kadonotakashi
- Date:
- Wed Oct 10 00:33:53 2018 +0000
- Revision:
- 0:8fdf9a60065b
how to make mbed librry
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| kadonotakashi | 0:8fdf9a60065b | 1 | /* | 
| kadonotakashi | 0:8fdf9a60065b | 2 | * Copyright (c) 2016-2018 ARM Limited. All rights reserved. | 
| kadonotakashi | 0:8fdf9a60065b | 3 | * SPDX-License-Identifier: Apache-2.0 | 
| kadonotakashi | 0:8fdf9a60065b | 4 | * Licensed under the Apache License, Version 2.0 (the License); you may | 
| kadonotakashi | 0:8fdf9a60065b | 5 | * not use this file except in compliance with the License. | 
| kadonotakashi | 0:8fdf9a60065b | 6 | * You may obtain a copy of the License at | 
| kadonotakashi | 0:8fdf9a60065b | 7 | * | 
| kadonotakashi | 0:8fdf9a60065b | 8 | * http://www.apache.org/licenses/LICENSE-2.0 | 
| kadonotakashi | 0:8fdf9a60065b | 9 | * | 
| kadonotakashi | 0:8fdf9a60065b | 10 | * Unless required by applicable law or agreed to in writing, software | 
| kadonotakashi | 0:8fdf9a60065b | 11 | * distributed under the License is distributed on an AS IS BASIS, WITHOUT | 
| kadonotakashi | 0:8fdf9a60065b | 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
| kadonotakashi | 0:8fdf9a60065b | 13 | * See the License for the specific language governing permissions and | 
| kadonotakashi | 0:8fdf9a60065b | 14 | * limitations under the License. | 
| kadonotakashi | 0:8fdf9a60065b | 15 | */ | 
| kadonotakashi | 0:8fdf9a60065b | 16 | |
| kadonotakashi | 0:8fdf9a60065b | 17 | #include "mbed_assert.h" | 
| kadonotakashi | 0:8fdf9a60065b | 18 | #include "cmsis.h" | 
| kadonotakashi | 0:8fdf9a60065b | 19 | #include "cmsis_os2.h" | 
| kadonotakashi | 0:8fdf9a60065b | 20 | #include "mbed_rtos_storage.h" | 
| kadonotakashi | 0:8fdf9a60065b | 21 | #include "ns_trace.h" | 
| kadonotakashi | 0:8fdf9a60065b | 22 | |
| kadonotakashi | 0:8fdf9a60065b | 23 | #include "eventOS_scheduler.h" | 
| kadonotakashi | 0:8fdf9a60065b | 24 | |
| kadonotakashi | 0:8fdf9a60065b | 25 | #include "ns_event_loop_mutex.h" | 
| kadonotakashi | 0:8fdf9a60065b | 26 | #include "ns_event_loop.h" | 
| kadonotakashi | 0:8fdf9a60065b | 27 | |
| kadonotakashi | 0:8fdf9a60065b | 28 | #define TRACE_GROUP "evlp" | 
| kadonotakashi | 0:8fdf9a60065b | 29 | |
| kadonotakashi | 0:8fdf9a60065b | 30 | #if !MBED_CONF_NANOSTACK_HAL_EVENT_LOOP_USE_MBED_EVENTS | 
| kadonotakashi | 0:8fdf9a60065b | 31 | |
| kadonotakashi | 0:8fdf9a60065b | 32 | #if MBED_CONF_NANOSTACK_HAL_EVENT_LOOP_DISPATCH_FROM_APPLICATION | 
| kadonotakashi | 0:8fdf9a60065b | 33 | |
| kadonotakashi | 0:8fdf9a60065b | 34 | static mbed_rtos_storage_event_flags_t event_flag_cb; | 
| kadonotakashi | 0:8fdf9a60065b | 35 | static const osEventFlagsAttr_t event_flags_attr = { | 
| kadonotakashi | 0:8fdf9a60065b | 36 | .name = "nanostack_event_flags", | 
| kadonotakashi | 0:8fdf9a60065b | 37 | .cb_mem = &event_flag_cb, | 
| kadonotakashi | 0:8fdf9a60065b | 38 | .cb_size = sizeof event_flag_cb | 
| kadonotakashi | 0:8fdf9a60065b | 39 | }; | 
| kadonotakashi | 0:8fdf9a60065b | 40 | static osEventFlagsId_t event_flag_id; | 
| kadonotakashi | 0:8fdf9a60065b | 41 | |
| kadonotakashi | 0:8fdf9a60065b | 42 | #else | 
| kadonotakashi | 0:8fdf9a60065b | 43 | |
| kadonotakashi | 0:8fdf9a60065b | 44 | #ifndef MBED_TZ_DEFAULT_ACCESS | 
| kadonotakashi | 0:8fdf9a60065b | 45 | #define MBED_TZ_DEFAULT_ACCESS 0 | 
| kadonotakashi | 0:8fdf9a60065b | 46 | #endif | 
| kadonotakashi | 0:8fdf9a60065b | 47 | |
| kadonotakashi | 0:8fdf9a60065b | 48 | static void event_loop_thread(void *arg); | 
| kadonotakashi | 0:8fdf9a60065b | 49 | |
| kadonotakashi | 0:8fdf9a60065b | 50 | static uint64_t event_thread_stk[MBED_CONF_NANOSTACK_HAL_EVENT_LOOP_THREAD_STACK_SIZE/8]; | 
| kadonotakashi | 0:8fdf9a60065b | 51 | static mbed_rtos_storage_thread_t event_thread_tcb; | 
| kadonotakashi | 0:8fdf9a60065b | 52 | static const osThreadAttr_t event_thread_attr = { | 
| kadonotakashi | 0:8fdf9a60065b | 53 | .name = "nanostack_event_thread", | 
| kadonotakashi | 0:8fdf9a60065b | 54 | .priority = osPriorityNormal, | 
| kadonotakashi | 0:8fdf9a60065b | 55 | .stack_mem = &event_thread_stk[0], | 
| kadonotakashi | 0:8fdf9a60065b | 56 | .stack_size = sizeof event_thread_stk, | 
| kadonotakashi | 0:8fdf9a60065b | 57 | .cb_mem = &event_thread_tcb, | 
| kadonotakashi | 0:8fdf9a60065b | 58 | .cb_size = sizeof event_thread_tcb, | 
| kadonotakashi | 0:8fdf9a60065b | 59 | .tz_module = MBED_TZ_DEFAULT_ACCESS, | 
| kadonotakashi | 0:8fdf9a60065b | 60 | }; | 
| kadonotakashi | 0:8fdf9a60065b | 61 | #endif | 
| kadonotakashi | 0:8fdf9a60065b | 62 | |
| kadonotakashi | 0:8fdf9a60065b | 63 | #if !MBED_CONF_NANOSTACK_HAL_EVENT_LOOP_DISPATCH_FROM_APPLICATION | 
| kadonotakashi | 0:8fdf9a60065b | 64 | static osThreadId_t event_thread_id; | 
| kadonotakashi | 0:8fdf9a60065b | 65 | #endif | 
| kadonotakashi | 0:8fdf9a60065b | 66 | |
| kadonotakashi | 0:8fdf9a60065b | 67 | void eventOS_scheduler_signal(void) | 
| kadonotakashi | 0:8fdf9a60065b | 68 | { | 
| kadonotakashi | 0:8fdf9a60065b | 69 | // XXX why does signal set lock if called with irqs disabled? | 
| kadonotakashi | 0:8fdf9a60065b | 70 | //__enable_irq(); | 
| kadonotakashi | 0:8fdf9a60065b | 71 | //tr_debug("signal %p", (void*)event_thread_id); | 
| kadonotakashi | 0:8fdf9a60065b | 72 | #if MBED_CONF_NANOSTACK_HAL_EVENT_LOOP_DISPATCH_FROM_APPLICATION | 
| kadonotakashi | 0:8fdf9a60065b | 73 | osEventFlagsSet(event_flag_id, 1); | 
| kadonotakashi | 0:8fdf9a60065b | 74 | #else | 
| kadonotakashi | 0:8fdf9a60065b | 75 | osThreadFlagsSet(event_thread_id, 1); | 
| kadonotakashi | 0:8fdf9a60065b | 76 | #endif | 
| kadonotakashi | 0:8fdf9a60065b | 77 | //tr_debug("signalled %p", (void*)event_thread_id); | 
| kadonotakashi | 0:8fdf9a60065b | 78 | } | 
| kadonotakashi | 0:8fdf9a60065b | 79 | |
| kadonotakashi | 0:8fdf9a60065b | 80 | void eventOS_scheduler_idle(void) | 
| kadonotakashi | 0:8fdf9a60065b | 81 | { | 
| kadonotakashi | 0:8fdf9a60065b | 82 | //tr_debug("idle"); | 
| kadonotakashi | 0:8fdf9a60065b | 83 | eventOS_scheduler_mutex_release(); | 
| kadonotakashi | 0:8fdf9a60065b | 84 | |
| kadonotakashi | 0:8fdf9a60065b | 85 | #if MBED_CONF_NANOSTACK_HAL_EVENT_LOOP_DISPATCH_FROM_APPLICATION | 
| kadonotakashi | 0:8fdf9a60065b | 86 | osEventFlagsWait(event_flag_id, 1, osFlagsWaitAny, osWaitForever); | 
| kadonotakashi | 0:8fdf9a60065b | 87 | #else | 
| kadonotakashi | 0:8fdf9a60065b | 88 | osThreadFlagsWait(1, 0, osWaitForever); | 
| kadonotakashi | 0:8fdf9a60065b | 89 | #endif | 
| kadonotakashi | 0:8fdf9a60065b | 90 | |
| kadonotakashi | 0:8fdf9a60065b | 91 | eventOS_scheduler_mutex_wait(); | 
| kadonotakashi | 0:8fdf9a60065b | 92 | } | 
| kadonotakashi | 0:8fdf9a60065b | 93 | |
| kadonotakashi | 0:8fdf9a60065b | 94 | #if !MBED_CONF_NANOSTACK_HAL_EVENT_LOOP_DISPATCH_FROM_APPLICATION | 
| kadonotakashi | 0:8fdf9a60065b | 95 | static void event_loop_thread(void *arg) | 
| kadonotakashi | 0:8fdf9a60065b | 96 | { | 
| kadonotakashi | 0:8fdf9a60065b | 97 | (void)arg; | 
| kadonotakashi | 0:8fdf9a60065b | 98 | eventOS_scheduler_mutex_wait(); | 
| kadonotakashi | 0:8fdf9a60065b | 99 | eventOS_scheduler_run(); //Does not return | 
| kadonotakashi | 0:8fdf9a60065b | 100 | } | 
| kadonotakashi | 0:8fdf9a60065b | 101 | #endif | 
| kadonotakashi | 0:8fdf9a60065b | 102 | |
| kadonotakashi | 0:8fdf9a60065b | 103 | // This is used to initialize the lock used by event loop even | 
| kadonotakashi | 0:8fdf9a60065b | 104 | // if it is not ran in a separate thread. | 
| kadonotakashi | 0:8fdf9a60065b | 105 | void ns_event_loop_init(void) | 
| kadonotakashi | 0:8fdf9a60065b | 106 | { | 
| kadonotakashi | 0:8fdf9a60065b | 107 | ns_event_loop_mutex_init(); | 
| kadonotakashi | 0:8fdf9a60065b | 108 | |
| kadonotakashi | 0:8fdf9a60065b | 109 | // If a separate event loop thread is not used, the signaling | 
| kadonotakashi | 0:8fdf9a60065b | 110 | // happens via event flags instead of thread flags. This allows one to | 
| kadonotakashi | 0:8fdf9a60065b | 111 | // perform the initialization from any thread and removes need to know the id | 
| kadonotakashi | 0:8fdf9a60065b | 112 | // of event loop dispatch thread. | 
| kadonotakashi | 0:8fdf9a60065b | 113 | #if MBED_CONF_NANOSTACK_HAL_EVENT_LOOP_DISPATCH_FROM_APPLICATION | 
| kadonotakashi | 0:8fdf9a60065b | 114 | event_flag_id = osEventFlagsNew(&event_flags_attr); | 
| kadonotakashi | 0:8fdf9a60065b | 115 | MBED_ASSERT(event_flag_id != NULL); | 
| kadonotakashi | 0:8fdf9a60065b | 116 | #endif | 
| kadonotakashi | 0:8fdf9a60065b | 117 | } | 
| kadonotakashi | 0:8fdf9a60065b | 118 | |
| kadonotakashi | 0:8fdf9a60065b | 119 | #if !MBED_CONF_NANOSTACK_HAL_EVENT_LOOP_DISPATCH_FROM_APPLICATION | 
| kadonotakashi | 0:8fdf9a60065b | 120 | void ns_event_loop_thread_create(void) | 
| kadonotakashi | 0:8fdf9a60065b | 121 | { | 
| kadonotakashi | 0:8fdf9a60065b | 122 | event_thread_id = osThreadNew(event_loop_thread, NULL, &event_thread_attr); | 
| kadonotakashi | 0:8fdf9a60065b | 123 | MBED_ASSERT(event_thread_id != NULL); | 
| kadonotakashi | 0:8fdf9a60065b | 124 | } | 
| kadonotakashi | 0:8fdf9a60065b | 125 | |
| kadonotakashi | 0:8fdf9a60065b | 126 | void ns_event_loop_thread_start(void) | 
| kadonotakashi | 0:8fdf9a60065b | 127 | { | 
| kadonotakashi | 0:8fdf9a60065b | 128 | } | 
| kadonotakashi | 0:8fdf9a60065b | 129 | #endif | 
| kadonotakashi | 0:8fdf9a60065b | 130 | |
| kadonotakashi | 0:8fdf9a60065b | 131 | #endif // !MBED_CONF_NANOSTACK_HAL_EVENT_LOOP_USE_MBED_EVENTS |