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/sal-stack-nanostack-eventloop/nanostack-event-loop/eventOS_scheduler.h@0:9b3d4731edbb, 2018-06-21 (annotated)
- Committer:
- WFKnight
- Date:
- Thu Jun 21 13:51:43 2018 +0000
- Revision:
- 0:9b3d4731edbb
UART, RTOS, LED
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| WFKnight | 0:9b3d4731edbb | 1 | /* |
| WFKnight | 0:9b3d4731edbb | 2 | * Copyright (c) 2014-2015 ARM Limited. All rights reserved. |
| WFKnight | 0:9b3d4731edbb | 3 | * SPDX-License-Identifier: Apache-2.0 |
| WFKnight | 0:9b3d4731edbb | 4 | * Licensed under the Apache License, Version 2.0 (the License); you may |
| WFKnight | 0:9b3d4731edbb | 5 | * not use this file except in compliance with the License. |
| WFKnight | 0:9b3d4731edbb | 6 | * You may obtain a copy of the License at |
| WFKnight | 0:9b3d4731edbb | 7 | * |
| WFKnight | 0:9b3d4731edbb | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| WFKnight | 0:9b3d4731edbb | 9 | * |
| WFKnight | 0:9b3d4731edbb | 10 | * Unless required by applicable law or agreed to in writing, software |
| WFKnight | 0:9b3d4731edbb | 11 | * distributed under the License is distributed on an AS IS BASIS, WITHOUT |
| WFKnight | 0:9b3d4731edbb | 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| WFKnight | 0:9b3d4731edbb | 13 | * See the License for the specific language governing permissions and |
| WFKnight | 0:9b3d4731edbb | 14 | * limitations under the License. |
| WFKnight | 0:9b3d4731edbb | 15 | */ |
| WFKnight | 0:9b3d4731edbb | 16 | #ifndef EVENTOS_SCHEDULER_H_ |
| WFKnight | 0:9b3d4731edbb | 17 | #define EVENTOS_SCHEDULER_H_ |
| WFKnight | 0:9b3d4731edbb | 18 | |
| WFKnight | 0:9b3d4731edbb | 19 | #ifdef __cplusplus |
| WFKnight | 0:9b3d4731edbb | 20 | extern "C" { |
| WFKnight | 0:9b3d4731edbb | 21 | #endif |
| WFKnight | 0:9b3d4731edbb | 22 | #include "ns_types.h" |
| WFKnight | 0:9b3d4731edbb | 23 | |
| WFKnight | 0:9b3d4731edbb | 24 | /* Compatibility with older ns_types.h */ |
| WFKnight | 0:9b3d4731edbb | 25 | #ifndef NS_NORETURN |
| WFKnight | 0:9b3d4731edbb | 26 | #define NS_NORETURN |
| WFKnight | 0:9b3d4731edbb | 27 | #endif |
| WFKnight | 0:9b3d4731edbb | 28 | |
| WFKnight | 0:9b3d4731edbb | 29 | /** |
| WFKnight | 0:9b3d4731edbb | 30 | * \brief Initialise event scheduler. |
| WFKnight | 0:9b3d4731edbb | 31 | * |
| WFKnight | 0:9b3d4731edbb | 32 | */ |
| WFKnight | 0:9b3d4731edbb | 33 | extern void eventOS_scheduler_init(void); |
| WFKnight | 0:9b3d4731edbb | 34 | |
| WFKnight | 0:9b3d4731edbb | 35 | /** |
| WFKnight | 0:9b3d4731edbb | 36 | * Process one event from event queue. |
| WFKnight | 0:9b3d4731edbb | 37 | * Do not call this directly from application. Requires to be public so that simulator can call this. |
| WFKnight | 0:9b3d4731edbb | 38 | * Use eventOS_scheduler_run() or eventOS_scheduler_run_until_idle(). |
| WFKnight | 0:9b3d4731edbb | 39 | * \return true If there was event processed, false if the event queue was empty. |
| WFKnight | 0:9b3d4731edbb | 40 | */ |
| WFKnight | 0:9b3d4731edbb | 41 | bool eventOS_scheduler_dispatch_event(void); |
| WFKnight | 0:9b3d4731edbb | 42 | |
| WFKnight | 0:9b3d4731edbb | 43 | /** |
| WFKnight | 0:9b3d4731edbb | 44 | * \brief Process events until no more events to process. |
| WFKnight | 0:9b3d4731edbb | 45 | */ |
| WFKnight | 0:9b3d4731edbb | 46 | extern void eventOS_scheduler_run_until_idle(void); |
| WFKnight | 0:9b3d4731edbb | 47 | |
| WFKnight | 0:9b3d4731edbb | 48 | /** |
| WFKnight | 0:9b3d4731edbb | 49 | * \brief Start Event scheduler. |
| WFKnight | 0:9b3d4731edbb | 50 | * Loops forever processing events from the queue. |
| WFKnight | 0:9b3d4731edbb | 51 | * Calls eventOS_scheduler_idle() whenever event queue is empty. |
| WFKnight | 0:9b3d4731edbb | 52 | */ |
| WFKnight | 0:9b3d4731edbb | 53 | NS_NORETURN extern void eventOS_scheduler_run(void); |
| WFKnight | 0:9b3d4731edbb | 54 | /** |
| WFKnight | 0:9b3d4731edbb | 55 | * \brief Disable Event scheduler Timers |
| WFKnight | 0:9b3d4731edbb | 56 | * |
| WFKnight | 0:9b3d4731edbb | 57 | * \return 0 Timer Stop OK |
| WFKnight | 0:9b3d4731edbb | 58 | * \return -1 Timer Stop Fail |
| WFKnight | 0:9b3d4731edbb | 59 | * |
| WFKnight | 0:9b3d4731edbb | 60 | * */ |
| WFKnight | 0:9b3d4731edbb | 61 | int eventOS_scheduler_timer_stop(void); |
| WFKnight | 0:9b3d4731edbb | 62 | |
| WFKnight | 0:9b3d4731edbb | 63 | /** |
| WFKnight | 0:9b3d4731edbb | 64 | * \brief Synch Event scheduler timer after sleep |
| WFKnight | 0:9b3d4731edbb | 65 | * |
| WFKnight | 0:9b3d4731edbb | 66 | * \param sleep_ticks time in milli seconds |
| WFKnight | 0:9b3d4731edbb | 67 | * |
| WFKnight | 0:9b3d4731edbb | 68 | * \return 0 Timer Synch OK |
| WFKnight | 0:9b3d4731edbb | 69 | * \return -1 Timer Synch & Start Fail |
| WFKnight | 0:9b3d4731edbb | 70 | * |
| WFKnight | 0:9b3d4731edbb | 71 | * */ |
| WFKnight | 0:9b3d4731edbb | 72 | int eventOS_scheduler_timer_synch_after_sleep(uint32_t sleep_ticks); |
| WFKnight | 0:9b3d4731edbb | 73 | |
| WFKnight | 0:9b3d4731edbb | 74 | /** |
| WFKnight | 0:9b3d4731edbb | 75 | * \brief Read current active Tasklet ID |
| WFKnight | 0:9b3d4731edbb | 76 | * |
| WFKnight | 0:9b3d4731edbb | 77 | * This function not return valid information called inside interrupt |
| WFKnight | 0:9b3d4731edbb | 78 | * |
| WFKnight | 0:9b3d4731edbb | 79 | * \return curret active tasklet id |
| WFKnight | 0:9b3d4731edbb | 80 | * |
| WFKnight | 0:9b3d4731edbb | 81 | * */ |
| WFKnight | 0:9b3d4731edbb | 82 | extern int8_t eventOS_scheduler_get_active_tasklet(void); |
| WFKnight | 0:9b3d4731edbb | 83 | |
| WFKnight | 0:9b3d4731edbb | 84 | /** |
| WFKnight | 0:9b3d4731edbb | 85 | * \brief Set manually Active Tasklet ID |
| WFKnight | 0:9b3d4731edbb | 86 | * |
| WFKnight | 0:9b3d4731edbb | 87 | * \param tasklet requested tasklet ID |
| WFKnight | 0:9b3d4731edbb | 88 | * |
| WFKnight | 0:9b3d4731edbb | 89 | * */ |
| WFKnight | 0:9b3d4731edbb | 90 | extern void eventOS_scheduler_set_active_tasklet(int8_t tasklet); |
| WFKnight | 0:9b3d4731edbb | 91 | |
| WFKnight | 0:9b3d4731edbb | 92 | /** |
| WFKnight | 0:9b3d4731edbb | 93 | * \brief Event scheduler loop idle Callback. |
| WFKnight | 0:9b3d4731edbb | 94 | |
| WFKnight | 0:9b3d4731edbb | 95 | * Note! This method is called only by eventOS_scheduler_run, needs to be |
| WFKnight | 0:9b3d4731edbb | 96 | * ported for the platform only if you are using eventOS_scheduler_run(). |
| WFKnight | 0:9b3d4731edbb | 97 | */ |
| WFKnight | 0:9b3d4731edbb | 98 | extern void eventOS_scheduler_idle(void); |
| WFKnight | 0:9b3d4731edbb | 99 | |
| WFKnight | 0:9b3d4731edbb | 100 | /** |
| WFKnight | 0:9b3d4731edbb | 101 | * \brief This function will be called when stack enter idle state and start |
| WFKnight | 0:9b3d4731edbb | 102 | * waiting signal. |
| WFKnight | 0:9b3d4731edbb | 103 | * |
| WFKnight | 0:9b3d4731edbb | 104 | * Note! This method is called only by reference implementation of idle. Needs |
| WFKnight | 0:9b3d4731edbb | 105 | * to be ported for the platform only if you are using reference implementation. |
| WFKnight | 0:9b3d4731edbb | 106 | */ |
| WFKnight | 0:9b3d4731edbb | 107 | extern void eventOS_scheduler_wait(void); |
| WFKnight | 0:9b3d4731edbb | 108 | |
| WFKnight | 0:9b3d4731edbb | 109 | /** |
| WFKnight | 0:9b3d4731edbb | 110 | * \brief This function will be called when stack receives an event. |
| WFKnight | 0:9b3d4731edbb | 111 | */ |
| WFKnight | 0:9b3d4731edbb | 112 | extern void eventOS_scheduler_signal(void); |
| WFKnight | 0:9b3d4731edbb | 113 | |
| WFKnight | 0:9b3d4731edbb | 114 | /** |
| WFKnight | 0:9b3d4731edbb | 115 | * \brief This function will be called when stack can enter deep sleep state in detected time. |
| WFKnight | 0:9b3d4731edbb | 116 | * |
| WFKnight | 0:9b3d4731edbb | 117 | * Note! This method is called only by reference implementation of idle. Needs to be |
| WFKnight | 0:9b3d4731edbb | 118 | * ported for the platform only if you are using reference implementation. |
| WFKnight | 0:9b3d4731edbb | 119 | * |
| WFKnight | 0:9b3d4731edbb | 120 | * \param sleep_time_ms Time in milliseconds to sleep |
| WFKnight | 0:9b3d4731edbb | 121 | * \return time slept in milliseconds |
| WFKnight | 0:9b3d4731edbb | 122 | */ |
| WFKnight | 0:9b3d4731edbb | 123 | extern uint32_t eventOS_scheduler_sleep(uint32_t sleep_time_ms); |
| WFKnight | 0:9b3d4731edbb | 124 | |
| WFKnight | 0:9b3d4731edbb | 125 | /** |
| WFKnight | 0:9b3d4731edbb | 126 | * \brief Lock a thread against the event loop thread |
| WFKnight | 0:9b3d4731edbb | 127 | * |
| WFKnight | 0:9b3d4731edbb | 128 | * This method can be provided by multi-threaded platforms to allow |
| WFKnight | 0:9b3d4731edbb | 129 | * mutual exclusion with the event loop thread, for cases where |
| WFKnight | 0:9b3d4731edbb | 130 | * code wants to work with both the event loop and other threads. |
| WFKnight | 0:9b3d4731edbb | 131 | * |
| WFKnight | 0:9b3d4731edbb | 132 | * A typical platform implementation would claim the same mutex |
| WFKnight | 0:9b3d4731edbb | 133 | * before calling eventOS_scheduler_run() or |
| WFKnight | 0:9b3d4731edbb | 134 | * eventOS_scheduler_dispatch(), and release it during |
| WFKnight | 0:9b3d4731edbb | 135 | * eventOS_scheduler_idle(). |
| WFKnight | 0:9b3d4731edbb | 136 | * |
| WFKnight | 0:9b3d4731edbb | 137 | * The mutex must count - nested calls from one thread return |
| WFKnight | 0:9b3d4731edbb | 138 | * immediately. Thus calling this from inside an event callback |
| WFKnight | 0:9b3d4731edbb | 139 | * is harmless. |
| WFKnight | 0:9b3d4731edbb | 140 | */ |
| WFKnight | 0:9b3d4731edbb | 141 | extern void eventOS_scheduler_mutex_wait(void); |
| WFKnight | 0:9b3d4731edbb | 142 | |
| WFKnight | 0:9b3d4731edbb | 143 | /** |
| WFKnight | 0:9b3d4731edbb | 144 | * \brief Release the event loop mutex |
| WFKnight | 0:9b3d4731edbb | 145 | * |
| WFKnight | 0:9b3d4731edbb | 146 | * Release the mutex claimed with eventOS_scheduler_mutex_wait(), |
| WFKnight | 0:9b3d4731edbb | 147 | * allowing the event loop to continue processing. |
| WFKnight | 0:9b3d4731edbb | 148 | */ |
| WFKnight | 0:9b3d4731edbb | 149 | extern void eventOS_scheduler_mutex_release(void); |
| WFKnight | 0:9b3d4731edbb | 150 | |
| WFKnight | 0:9b3d4731edbb | 151 | /** |
| WFKnight | 0:9b3d4731edbb | 152 | * \brief Check if the current thread owns the event mutex |
| WFKnight | 0:9b3d4731edbb | 153 | * |
| WFKnight | 0:9b3d4731edbb | 154 | * Check if the calling thread owns the scheduler mutex. |
| WFKnight | 0:9b3d4731edbb | 155 | * This allows the ownership to be asserted if a function |
| WFKnight | 0:9b3d4731edbb | 156 | * requires the mutex to be locked externally. |
| WFKnight | 0:9b3d4731edbb | 157 | * |
| WFKnight | 0:9b3d4731edbb | 158 | * The function is only intended as a debugging aid for |
| WFKnight | 0:9b3d4731edbb | 159 | * users of eventOS_scheduler_mutex_wait() - it is not |
| WFKnight | 0:9b3d4731edbb | 160 | * used by the event loop core itself. |
| WFKnight | 0:9b3d4731edbb | 161 | * |
| WFKnight | 0:9b3d4731edbb | 162 | * If the underlying mutex system does not support it, |
| WFKnight | 0:9b3d4731edbb | 163 | * this may be implemented to always return true. |
| WFKnight | 0:9b3d4731edbb | 164 | * |
| WFKnight | 0:9b3d4731edbb | 165 | * \return true if the current thread owns the mutex |
| WFKnight | 0:9b3d4731edbb | 166 | */ |
| WFKnight | 0:9b3d4731edbb | 167 | extern bool eventOS_scheduler_mutex_am_owner(void); |
| WFKnight | 0:9b3d4731edbb | 168 | |
| WFKnight | 0:9b3d4731edbb | 169 | #ifdef __cplusplus |
| WFKnight | 0:9b3d4731edbb | 170 | } |
| WFKnight | 0:9b3d4731edbb | 171 | #endif |
| WFKnight | 0:9b3d4731edbb | 172 | |
| WFKnight | 0:9b3d4731edbb | 173 | #endif /* EVENTOS_SCHEDULER_H_ */ |