mbed-os5 only for TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 31 06:02:27 2019 +0000
Revision:
1:9db0e321a9f4
Parent:
0:5b88d5760320
updated based on mbed-os5.15.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /* mbed Microcontroller Library
kenjiArai 1:9db0e321a9f4 2 * Copyright (c) 2006-2019 ARM Limited
kenjiArai 0:5b88d5760320 3 *
kenjiArai 0:5b88d5760320 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
kenjiArai 0:5b88d5760320 5 * of this software and associated documentation files (the "Software"), to deal
kenjiArai 0:5b88d5760320 6 * in the Software without restriction, including without limitation the rights
kenjiArai 0:5b88d5760320 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
kenjiArai 0:5b88d5760320 8 * copies of the Software, and to permit persons to whom the Software is
kenjiArai 0:5b88d5760320 9 * furnished to do so, subject to the following conditions:
kenjiArai 0:5b88d5760320 10 *
kenjiArai 0:5b88d5760320 11 * The above copyright notice and this permission notice shall be included in
kenjiArai 0:5b88d5760320 12 * all copies or substantial portions of the Software.
kenjiArai 0:5b88d5760320 13 *
kenjiArai 0:5b88d5760320 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
kenjiArai 0:5b88d5760320 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
kenjiArai 0:5b88d5760320 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
kenjiArai 0:5b88d5760320 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
kenjiArai 0:5b88d5760320 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:5b88d5760320 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
kenjiArai 0:5b88d5760320 20 * SOFTWARE.
kenjiArai 0:5b88d5760320 21 */
kenjiArai 0:5b88d5760320 22 #ifndef THIS_THREAD_H
kenjiArai 0:5b88d5760320 23 #define THIS_THREAD_H
kenjiArai 0:5b88d5760320 24
kenjiArai 0:5b88d5760320 25 #include <stdint.h>
kenjiArai 1:9db0e321a9f4 26 #include "rtos/mbed_rtos_types.h"
kenjiArai 0:5b88d5760320 27
kenjiArai 0:5b88d5760320 28 namespace rtos {
kenjiArai 1:9db0e321a9f4 29 /** \addtogroup rtos-public-api */
kenjiArai 0:5b88d5760320 30 /** @{*/
kenjiArai 1:9db0e321a9f4 31
kenjiArai 0:5b88d5760320 32 /**
kenjiArai 0:5b88d5760320 33 * \defgroup rtos_ThisThread ThisThread namespace
kenjiArai 0:5b88d5760320 34 * @{
kenjiArai 0:5b88d5760320 35 */
kenjiArai 0:5b88d5760320 36
kenjiArai 0:5b88d5760320 37 /** The ThisThread namespace allows controlling the current thread.
kenjiArai 0:5b88d5760320 38 *
kenjiArai 0:5b88d5760320 39 * Example:
kenjiArai 0:5b88d5760320 40 * @code
kenjiArai 0:5b88d5760320 41 * #include "mbed.h"
kenjiArai 0:5b88d5760320 42 * #include "rtos.h"
kenjiArai 0:5b88d5760320 43 *
kenjiArai 0:5b88d5760320 44 * Thread thread;
kenjiArai 0:5b88d5760320 45 * DigitalOut led1(LED1);
kenjiArai 0:5b88d5760320 46 *
kenjiArai 0:5b88d5760320 47 * #define STOP_FLAG 1
kenjiArai 0:5b88d5760320 48 *
kenjiArai 0:5b88d5760320 49 * // Blink function toggles the led in a long running loop
kenjiArai 0:5b88d5760320 50 * void blink(DigitalOut *led) {
kenjiArai 0:5b88d5760320 51 * while (!ThisThread::flags_wait_any_for(STOP_FLAG, 1000)) {
kenjiArai 0:5b88d5760320 52 * *led = !*led;
kenjiArai 0:5b88d5760320 53 * }
kenjiArai 0:5b88d5760320 54 * }
kenjiArai 0:5b88d5760320 55 *
kenjiArai 0:5b88d5760320 56 * // Spawns a thread to run blink for 5 seconds
kenjiArai 0:5b88d5760320 57 * int main() {
kenjiArai 0:5b88d5760320 58 * thread.start(callback(blink, &led1));
kenjiArai 0:5b88d5760320 59 * ThisThread::sleep_for(5000);
kenjiArai 0:5b88d5760320 60 * thread.signal_set(STOP_FLAG);
kenjiArai 0:5b88d5760320 61 * thread.join();
kenjiArai 0:5b88d5760320 62 * }
kenjiArai 0:5b88d5760320 63 * @endcode
kenjiArai 0:5b88d5760320 64 *
kenjiArai 0:5b88d5760320 65 */
kenjiArai 0:5b88d5760320 66 namespace ThisThread {
kenjiArai 0:5b88d5760320 67 /** Clears the specified Thread Flags of the currently running thread.
kenjiArai 0:5b88d5760320 68 @param flags specifies the flags of the thread that should be cleared.
kenjiArai 0:5b88d5760320 69 @return thread flags before clearing.
kenjiArai 0:5b88d5760320 70 @note You cannot call this function from ISR context.
kenjiArai 0:5b88d5760320 71 @see Thread::flags_set
kenjiArai 0:5b88d5760320 72 */
kenjiArai 0:5b88d5760320 73 uint32_t flags_clear(uint32_t flags);
kenjiArai 0:5b88d5760320 74
kenjiArai 0:5b88d5760320 75 /** Returns the Thread Flags currently set for the currently running thread.
kenjiArai 0:5b88d5760320 76 @return current thread flags or 0 if not in a valid thread.
kenjiArai 0:5b88d5760320 77 @note You cannot call this function from ISR context.
kenjiArai 0:5b88d5760320 78 @see Thread::flags_set
kenjiArai 0:5b88d5760320 79 */
kenjiArai 0:5b88d5760320 80 uint32_t flags_get();
kenjiArai 0:5b88d5760320 81
kenjiArai 0:5b88d5760320 82 /** Wait for all of the specified Thread Flags to become signaled for the current thread.
kenjiArai 0:5b88d5760320 83 @param flags specifies the flags to wait for
kenjiArai 0:5b88d5760320 84 @param clear whether to clear the specified flags after waiting for them. (default: true)
kenjiArai 0:5b88d5760320 85 @return actual thread flags before clearing, which will satisfy the wait
kenjiArai 0:5b88d5760320 86 @note You cannot call this function from ISR context.
kenjiArai 0:5b88d5760320 87 @see Thread::flags_set
kenjiArai 0:5b88d5760320 88 */
kenjiArai 0:5b88d5760320 89 uint32_t flags_wait_all(uint32_t flags, bool clear = true);
kenjiArai 0:5b88d5760320 90
kenjiArai 0:5b88d5760320 91 /** Wait for any of the specified Thread Flags to become signaled for the current thread.
kenjiArai 0:5b88d5760320 92 @param flags specifies the flags to wait for
kenjiArai 0:5b88d5760320 93 @param clear whether to clear the specified flags after waiting for them. (default: true)
kenjiArai 0:5b88d5760320 94 @return actual thread flags before clearing, which will satisfy the wait
kenjiArai 0:5b88d5760320 95 @note You cannot call this function from ISR context.
kenjiArai 0:5b88d5760320 96 @see Thread::flags_set
kenjiArai 0:5b88d5760320 97 */
kenjiArai 0:5b88d5760320 98 uint32_t flags_wait_any(uint32_t flags, bool clear = true);
kenjiArai 0:5b88d5760320 99
kenjiArai 0:5b88d5760320 100 /** Wait for all of the specified Thread Flags to become signaled for the current thread.
kenjiArai 0:5b88d5760320 101 @param flags specifies the flags to wait for
kenjiArai 0:5b88d5760320 102 @param millisec timeout value.
kenjiArai 0:5b88d5760320 103 @param clear whether to clear the specified flags after waiting for them. (default: true)
kenjiArai 0:5b88d5760320 104 @return actual thread flags before clearing, which may not satisfy the wait
kenjiArai 0:5b88d5760320 105 @note You cannot call this function from ISR context.
kenjiArai 0:5b88d5760320 106 @see Thread::flags_set
kenjiArai 0:5b88d5760320 107 */
kenjiArai 0:5b88d5760320 108 uint32_t flags_wait_all_for(uint32_t flags, uint32_t millisec, bool clear = true);
kenjiArai 0:5b88d5760320 109
kenjiArai 0:5b88d5760320 110 /** Wait for all of the specified Thread Flags to become signaled for the current thread.
kenjiArai 0:5b88d5760320 111 @param flags specifies the flags to wait for
kenjiArai 0:5b88d5760320 112 @param millisec absolute timeout time, referenced to Kernel::get_ms_count()
kenjiArai 0:5b88d5760320 113 @param clear whether to clear the specified flags after waiting for them. (default: true)
kenjiArai 0:5b88d5760320 114 @return actual thread flags before clearing, which may not satisfy the wait
kenjiArai 0:5b88d5760320 115 @note You cannot call this function from ISR context.
kenjiArai 0:5b88d5760320 116 @note the underlying RTOS may have a limit to the maximum wait time
kenjiArai 0:5b88d5760320 117 due to internal 32-bit computations, but this is guaranteed to work if the
kenjiArai 0:5b88d5760320 118 wait is <= 0x7fffffff milliseconds (~24 days). If the limit is exceeded,
kenjiArai 0:5b88d5760320 119 the wait will time out earlier than specified.
kenjiArai 0:5b88d5760320 120 @see Thread::flags_set
kenjiArai 0:5b88d5760320 121 */
kenjiArai 0:5b88d5760320 122 uint32_t flags_wait_all_until(uint32_t flags, uint64_t millisec, bool clear = true);
kenjiArai 0:5b88d5760320 123
kenjiArai 0:5b88d5760320 124 /** Wait for any of the specified Thread Flags to become signaled for the current thread.
kenjiArai 0:5b88d5760320 125 @param flags specifies the flags to wait for
kenjiArai 0:5b88d5760320 126 @param millisec timeout value.
kenjiArai 0:5b88d5760320 127 @param clear whether to clear the specified flags after waiting for them. (default: true)
kenjiArai 0:5b88d5760320 128 @return actual thread flags before clearing, which may not satisfy the wait
kenjiArai 0:5b88d5760320 129 @note You cannot call this function from ISR context.
kenjiArai 0:5b88d5760320 130 @see Thread::flags_set
kenjiArai 0:5b88d5760320 131 */
kenjiArai 0:5b88d5760320 132 uint32_t flags_wait_any_for(uint32_t flags, uint32_t millisec, bool clear = true);
kenjiArai 0:5b88d5760320 133
kenjiArai 0:5b88d5760320 134 /** Wait for any of the specified Thread Flags to become signaled for the current thread.
kenjiArai 0:5b88d5760320 135 @param flags specifies the flags to wait for
kenjiArai 0:5b88d5760320 136 @param millisec absolute timeout time, referenced to Kernel::get_ms_count()
kenjiArai 0:5b88d5760320 137 @param clear whether to clear the specified flags after waiting for them. (default: true)
kenjiArai 0:5b88d5760320 138 @return actual thread flags before clearing, which may not satisfy the wait
kenjiArai 0:5b88d5760320 139 @note You cannot call this function from ISR context.
kenjiArai 0:5b88d5760320 140 @note the underlying RTOS may have a limit to the maximum wait time
kenjiArai 0:5b88d5760320 141 due to internal 32-bit computations, but this is guaranteed to work if the
kenjiArai 0:5b88d5760320 142 wait is <= 0x7fffffff milliseconds (~24 days). If the limit is exceeded,
kenjiArai 0:5b88d5760320 143 the wait will time out earlier than specified.
kenjiArai 0:5b88d5760320 144 @see Thread::flags_set
kenjiArai 0:5b88d5760320 145 */
kenjiArai 0:5b88d5760320 146 uint32_t flags_wait_any_until(uint32_t flags, uint64_t millisec, bool clear = true);
kenjiArai 0:5b88d5760320 147
kenjiArai 0:5b88d5760320 148 /** Sleep for a specified time period in millisec:
kenjiArai 0:5b88d5760320 149 @param millisec time delay value
kenjiArai 0:5b88d5760320 150 @note You cannot call this function from ISR context.
kenjiArai 1:9db0e321a9f4 151 @note The equivalent functionality is accessible in C via thread_sleep_for.
kenjiArai 0:5b88d5760320 152 */
kenjiArai 0:5b88d5760320 153 void sleep_for(uint32_t millisec);
kenjiArai 0:5b88d5760320 154
kenjiArai 0:5b88d5760320 155 /** Sleep until a specified time in millisec
kenjiArai 0:5b88d5760320 156 The specified time is according to Kernel::get_ms_count().
kenjiArai 0:5b88d5760320 157 @param millisec absolute time in millisec
kenjiArai 0:5b88d5760320 158 @note You cannot call this function from ISR context.
kenjiArai 0:5b88d5760320 159 @note if millisec is equal to or lower than the current tick count, this
kenjiArai 0:5b88d5760320 160 returns immediately.
kenjiArai 1:9db0e321a9f4 161 @note The equivalent functionality is accessible in C via thread_sleep_until.
kenjiArai 0:5b88d5760320 162 */
kenjiArai 0:5b88d5760320 163 void sleep_until(uint64_t millisec);
kenjiArai 0:5b88d5760320 164
kenjiArai 0:5b88d5760320 165 /** Pass control to next equal-priority thread that is in state READY.
kenjiArai 0:5b88d5760320 166 (Higher-priority READY threads would prevent us from running; this
kenjiArai 0:5b88d5760320 167 will not enable lower-priority threads to run, as we remain READY).
kenjiArai 0:5b88d5760320 168 @note You cannot call this function from ISR context.
kenjiArai 0:5b88d5760320 169 */
kenjiArai 0:5b88d5760320 170 void yield();
kenjiArai 0:5b88d5760320 171
kenjiArai 0:5b88d5760320 172 /** Get the thread id of the current running thread.
kenjiArai 1:9db0e321a9f4 173 @return thread ID for reference by other functions or nullptr in case of error or in ISR context.
kenjiArai 0:5b88d5760320 174 @note You may call this function from ISR context.
kenjiArai 0:5b88d5760320 175 */
kenjiArai 0:5b88d5760320 176 osThreadId_t get_id();
kenjiArai 0:5b88d5760320 177
kenjiArai 0:5b88d5760320 178 /** Get the thread name of the current running thread.
kenjiArai 1:9db0e321a9f4 179 @return thread name pointer or nullptr if thread has no name or in case of error.
kenjiArai 0:5b88d5760320 180 @note You cannot call this function from ISR context.
kenjiArai 0:5b88d5760320 181 */
kenjiArai 0:5b88d5760320 182 const char *get_name();
kenjiArai 0:5b88d5760320 183
kenjiArai 0:5b88d5760320 184 };
kenjiArai 0:5b88d5760320 185 /** @}*/
kenjiArai 0:5b88d5760320 186 /** @}*/
kenjiArai 1:9db0e321a9f4 187
kenjiArai 1:9db0e321a9f4 188
kenjiArai 1:9db0e321a9f4 189 namespace internal {
kenjiArai 1:9db0e321a9f4 190 /** \addtogroup rtos-internal-api */
kenjiArai 1:9db0e321a9f4 191 /** @{*/
kenjiArai 1:9db0e321a9f4 192
kenjiArai 1:9db0e321a9f4 193 struct flags_check_capture {
kenjiArai 1:9db0e321a9f4 194 uint32_t *flags;
kenjiArai 1:9db0e321a9f4 195 uint32_t options;
kenjiArai 1:9db0e321a9f4 196 uint32_t flags_wanted;
kenjiArai 1:9db0e321a9f4 197 uint32_t result;
kenjiArai 1:9db0e321a9f4 198 bool match;
kenjiArai 1:9db0e321a9f4 199 };
kenjiArai 1:9db0e321a9f4 200
kenjiArai 1:9db0e321a9f4 201 bool non_rtos_check_flags(void *handle);
kenjiArai 1:9db0e321a9f4 202
kenjiArai 1:9db0e321a9f4 203 }
kenjiArai 1:9db0e321a9f4 204 /** @}*/
kenjiArai 0:5b88d5760320 205 }
kenjiArai 0:5b88d5760320 206 #endif