Avion Radio IUT / Mbed 2 deprecated MecatroPWM

Dependencies:   mbed

Committer:
qmaker
Date:
Thu Mar 11 08:00:49 2021 +0000
Revision:
0:0d257bbf5c05
mpu6050 corrige

Who changed what in which revision?

UserRevisionLine numberNew contents of line
qmaker 0:0d257bbf5c05 1 /* mbed Microcontroller Library
qmaker 0:0d257bbf5c05 2 * Copyright (c) 2006-2012 ARM Limited
qmaker 0:0d257bbf5c05 3 *
qmaker 0:0d257bbf5c05 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
qmaker 0:0d257bbf5c05 5 * of this software and associated documentation files (the "Software"), to deal
qmaker 0:0d257bbf5c05 6 * in the Software without restriction, including without limitation the rights
qmaker 0:0d257bbf5c05 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
qmaker 0:0d257bbf5c05 8 * copies of the Software, and to permit persons to whom the Software is
qmaker 0:0d257bbf5c05 9 * furnished to do so, subject to the following conditions:
qmaker 0:0d257bbf5c05 10 *
qmaker 0:0d257bbf5c05 11 * The above copyright notice and this permission notice shall be included in
qmaker 0:0d257bbf5c05 12 * all copies or substantial portions of the Software.
qmaker 0:0d257bbf5c05 13 *
qmaker 0:0d257bbf5c05 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
qmaker 0:0d257bbf5c05 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
qmaker 0:0d257bbf5c05 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
qmaker 0:0d257bbf5c05 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
qmaker 0:0d257bbf5c05 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
qmaker 0:0d257bbf5c05 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
qmaker 0:0d257bbf5c05 20 * SOFTWARE.
qmaker 0:0d257bbf5c05 21 */
qmaker 0:0d257bbf5c05 22 #include "rtos/Thread.h"
qmaker 0:0d257bbf5c05 23
qmaker 0:0d257bbf5c05 24 #include "mbed.h"
qmaker 0:0d257bbf5c05 25 #include "rtos/rtos_idle.h"
qmaker 0:0d257bbf5c05 26
qmaker 0:0d257bbf5c05 27 // rt_tid2ptcb is an internal function which we exposed to get TCB for thread id
qmaker 0:0d257bbf5c05 28 #undef NULL //Workaround for conflicting macros in rt_TypeDef.h and stdio.h
qmaker 0:0d257bbf5c05 29 #include "rt_TypeDef.h"
qmaker 0:0d257bbf5c05 30
qmaker 0:0d257bbf5c05 31 extern "C" P_TCB rt_tid2ptcb(osThreadId thread_id);
qmaker 0:0d257bbf5c05 32
qmaker 0:0d257bbf5c05 33
qmaker 0:0d257bbf5c05 34 static void (*terminate_hook)(osThreadId id) = 0;
qmaker 0:0d257bbf5c05 35 extern "C" void thread_terminate_hook(osThreadId id)
qmaker 0:0d257bbf5c05 36 {
qmaker 0:0d257bbf5c05 37 if (terminate_hook != (void (*)(osThreadId))NULL) {
qmaker 0:0d257bbf5c05 38 terminate_hook(id);
qmaker 0:0d257bbf5c05 39 }
qmaker 0:0d257bbf5c05 40 }
qmaker 0:0d257bbf5c05 41
qmaker 0:0d257bbf5c05 42 namespace rtos {
qmaker 0:0d257bbf5c05 43
qmaker 0:0d257bbf5c05 44 void Thread::constructor(osPriority priority,
qmaker 0:0d257bbf5c05 45 uint32_t stack_size, unsigned char *stack_pointer) {
qmaker 0:0d257bbf5c05 46 _tid = 0;
qmaker 0:0d257bbf5c05 47 _dynamic_stack = (stack_pointer == NULL);
qmaker 0:0d257bbf5c05 48
qmaker 0:0d257bbf5c05 49 #if defined(__MBED_CMSIS_RTOS_CA9) || defined(__MBED_CMSIS_RTOS_CM)
qmaker 0:0d257bbf5c05 50 _thread_def.tpriority = priority;
qmaker 0:0d257bbf5c05 51 _thread_def.stacksize = stack_size;
qmaker 0:0d257bbf5c05 52 _thread_def.stack_pointer = (uint32_t*)stack_pointer;
qmaker 0:0d257bbf5c05 53 #endif
qmaker 0:0d257bbf5c05 54 }
qmaker 0:0d257bbf5c05 55
qmaker 0:0d257bbf5c05 56 void Thread::constructor(Callback<void()> task,
qmaker 0:0d257bbf5c05 57 osPriority priority, uint32_t stack_size, unsigned char *stack_pointer) {
qmaker 0:0d257bbf5c05 58 constructor(priority, stack_size, stack_pointer);
qmaker 0:0d257bbf5c05 59
qmaker 0:0d257bbf5c05 60 switch (start(task)) {
qmaker 0:0d257bbf5c05 61 case osErrorResource:
qmaker 0:0d257bbf5c05 62 error("OS ran out of threads!\n");
qmaker 0:0d257bbf5c05 63 break;
qmaker 0:0d257bbf5c05 64 case osErrorParameter:
qmaker 0:0d257bbf5c05 65 error("Thread already running!\n");
qmaker 0:0d257bbf5c05 66 break;
qmaker 0:0d257bbf5c05 67 case osErrorNoMemory:
qmaker 0:0d257bbf5c05 68 error("Error allocating the stack memory\n");
qmaker 0:0d257bbf5c05 69 default:
qmaker 0:0d257bbf5c05 70 break;
qmaker 0:0d257bbf5c05 71 }
qmaker 0:0d257bbf5c05 72 }
qmaker 0:0d257bbf5c05 73
qmaker 0:0d257bbf5c05 74 osStatus Thread::start(Callback<void()> task) {
qmaker 0:0d257bbf5c05 75 _mutex.lock();
qmaker 0:0d257bbf5c05 76
qmaker 0:0d257bbf5c05 77 if (_tid != 0) {
qmaker 0:0d257bbf5c05 78 _mutex.unlock();
qmaker 0:0d257bbf5c05 79 return osErrorParameter;
qmaker 0:0d257bbf5c05 80 }
qmaker 0:0d257bbf5c05 81
qmaker 0:0d257bbf5c05 82 #if defined(__MBED_CMSIS_RTOS_CA9) || defined(__MBED_CMSIS_RTOS_CM)
qmaker 0:0d257bbf5c05 83 _thread_def.pthread = Thread::_thunk;
qmaker 0:0d257bbf5c05 84 if (_thread_def.stack_pointer == NULL) {
qmaker 0:0d257bbf5c05 85 _thread_def.stack_pointer = new uint32_t[_thread_def.stacksize/sizeof(uint32_t)];
qmaker 0:0d257bbf5c05 86 MBED_ASSERT(_thread_def.stack_pointer != NULL);
qmaker 0:0d257bbf5c05 87 }
qmaker 0:0d257bbf5c05 88
qmaker 0:0d257bbf5c05 89 //Fill the stack with a magic word for maximum usage checking
qmaker 0:0d257bbf5c05 90 for (uint32_t i = 0; i < (_thread_def.stacksize / sizeof(uint32_t)); i++) {
qmaker 0:0d257bbf5c05 91 _thread_def.stack_pointer[i] = 0xE25A2EA5;
qmaker 0:0d257bbf5c05 92 }
qmaker 0:0d257bbf5c05 93 #endif
qmaker 0:0d257bbf5c05 94 _task = task;
qmaker 0:0d257bbf5c05 95 _tid = osThreadCreate(&_thread_def, this);
qmaker 0:0d257bbf5c05 96 if (_tid == NULL) {
qmaker 0:0d257bbf5c05 97 if (_dynamic_stack) {
qmaker 0:0d257bbf5c05 98 delete[] (_thread_def.stack_pointer);
qmaker 0:0d257bbf5c05 99 _thread_def.stack_pointer = (uint32_t*)NULL;
qmaker 0:0d257bbf5c05 100 }
qmaker 0:0d257bbf5c05 101 _mutex.unlock();
qmaker 0:0d257bbf5c05 102 _join_sem.release();
qmaker 0:0d257bbf5c05 103 return osErrorResource;
qmaker 0:0d257bbf5c05 104 }
qmaker 0:0d257bbf5c05 105
qmaker 0:0d257bbf5c05 106 _mutex.unlock();
qmaker 0:0d257bbf5c05 107 return osOK;
qmaker 0:0d257bbf5c05 108 }
qmaker 0:0d257bbf5c05 109
qmaker 0:0d257bbf5c05 110 osStatus Thread::terminate() {
qmaker 0:0d257bbf5c05 111 osStatus ret;
qmaker 0:0d257bbf5c05 112 _mutex.lock();
qmaker 0:0d257bbf5c05 113
qmaker 0:0d257bbf5c05 114 // Set the Thread's tid to NULL and
qmaker 0:0d257bbf5c05 115 // release the semaphore before terminating
qmaker 0:0d257bbf5c05 116 // since this thread could be terminating itself
qmaker 0:0d257bbf5c05 117 osThreadId local_id = _tid;
qmaker 0:0d257bbf5c05 118 _join_sem.release();
qmaker 0:0d257bbf5c05 119 _tid = (osThreadId)NULL;
qmaker 0:0d257bbf5c05 120
qmaker 0:0d257bbf5c05 121 ret = osThreadTerminate(local_id);
qmaker 0:0d257bbf5c05 122
qmaker 0:0d257bbf5c05 123 _mutex.unlock();
qmaker 0:0d257bbf5c05 124 return ret;
qmaker 0:0d257bbf5c05 125 }
qmaker 0:0d257bbf5c05 126
qmaker 0:0d257bbf5c05 127 osStatus Thread::join() {
qmaker 0:0d257bbf5c05 128 int32_t ret = _join_sem.wait();
qmaker 0:0d257bbf5c05 129 if (ret < 0) {
qmaker 0:0d257bbf5c05 130 return osErrorOS;
qmaker 0:0d257bbf5c05 131 }
qmaker 0:0d257bbf5c05 132
qmaker 0:0d257bbf5c05 133 // The semaphore has been released so this thread is being
qmaker 0:0d257bbf5c05 134 // terminated or has been terminated. Once the mutex has
qmaker 0:0d257bbf5c05 135 // been locked it is ensured that the thread is deleted.
qmaker 0:0d257bbf5c05 136 _mutex.lock();
qmaker 0:0d257bbf5c05 137 MBED_ASSERT(NULL == _tid);
qmaker 0:0d257bbf5c05 138 _mutex.unlock();
qmaker 0:0d257bbf5c05 139
qmaker 0:0d257bbf5c05 140 // Release sem so any other threads joining this thread wake up
qmaker 0:0d257bbf5c05 141 _join_sem.release();
qmaker 0:0d257bbf5c05 142 return osOK;
qmaker 0:0d257bbf5c05 143 }
qmaker 0:0d257bbf5c05 144
qmaker 0:0d257bbf5c05 145 osStatus Thread::set_priority(osPriority priority) {
qmaker 0:0d257bbf5c05 146 osStatus ret;
qmaker 0:0d257bbf5c05 147 _mutex.lock();
qmaker 0:0d257bbf5c05 148
qmaker 0:0d257bbf5c05 149 ret = osThreadSetPriority(_tid, priority);
qmaker 0:0d257bbf5c05 150
qmaker 0:0d257bbf5c05 151 _mutex.unlock();
qmaker 0:0d257bbf5c05 152 return ret;
qmaker 0:0d257bbf5c05 153 }
qmaker 0:0d257bbf5c05 154
qmaker 0:0d257bbf5c05 155 osPriority Thread::get_priority() {
qmaker 0:0d257bbf5c05 156 osPriority ret;
qmaker 0:0d257bbf5c05 157 _mutex.lock();
qmaker 0:0d257bbf5c05 158
qmaker 0:0d257bbf5c05 159 ret = osThreadGetPriority(_tid);
qmaker 0:0d257bbf5c05 160
qmaker 0:0d257bbf5c05 161 _mutex.unlock();
qmaker 0:0d257bbf5c05 162 return ret;
qmaker 0:0d257bbf5c05 163 }
qmaker 0:0d257bbf5c05 164
qmaker 0:0d257bbf5c05 165 int32_t Thread::signal_set(int32_t signals) {
qmaker 0:0d257bbf5c05 166 // osSignalSet is thread safe as long as the underlying
qmaker 0:0d257bbf5c05 167 // thread does not get terminated or return from main
qmaker 0:0d257bbf5c05 168 return osSignalSet(_tid, signals);
qmaker 0:0d257bbf5c05 169 }
qmaker 0:0d257bbf5c05 170
qmaker 0:0d257bbf5c05 171 int32_t Thread::signal_clr(int32_t signals) {
qmaker 0:0d257bbf5c05 172 // osSignalClear is thread safe as long as the underlying
qmaker 0:0d257bbf5c05 173 // thread does not get terminated or return from main
qmaker 0:0d257bbf5c05 174 return osSignalClear(_tid, signals);
qmaker 0:0d257bbf5c05 175 }
qmaker 0:0d257bbf5c05 176
qmaker 0:0d257bbf5c05 177 Thread::State Thread::get_state() {
qmaker 0:0d257bbf5c05 178 #if !defined(__MBED_CMSIS_RTOS_CA9) && !defined(__MBED_CMSIS_RTOS_CM)
qmaker 0:0d257bbf5c05 179 #ifdef CMSIS_OS_RTX
qmaker 0:0d257bbf5c05 180 State status = Deleted;
qmaker 0:0d257bbf5c05 181 _mutex.lock();
qmaker 0:0d257bbf5c05 182
qmaker 0:0d257bbf5c05 183 if (_tid != NULL) {
qmaker 0:0d257bbf5c05 184 status = (State)_thread_def.tcb.state;
qmaker 0:0d257bbf5c05 185 }
qmaker 0:0d257bbf5c05 186
qmaker 0:0d257bbf5c05 187 _mutex.unlock();
qmaker 0:0d257bbf5c05 188 return status;
qmaker 0:0d257bbf5c05 189 #endif
qmaker 0:0d257bbf5c05 190 #else
qmaker 0:0d257bbf5c05 191 State status = Deleted;
qmaker 0:0d257bbf5c05 192 _mutex.lock();
qmaker 0:0d257bbf5c05 193
qmaker 0:0d257bbf5c05 194 if (_tid != NULL) {
qmaker 0:0d257bbf5c05 195 status = (State)osThreadGetState(_tid);
qmaker 0:0d257bbf5c05 196 }
qmaker 0:0d257bbf5c05 197
qmaker 0:0d257bbf5c05 198 _mutex.unlock();
qmaker 0:0d257bbf5c05 199 return status;
qmaker 0:0d257bbf5c05 200 #endif
qmaker 0:0d257bbf5c05 201 }
qmaker 0:0d257bbf5c05 202
qmaker 0:0d257bbf5c05 203 uint32_t Thread::stack_size() {
qmaker 0:0d257bbf5c05 204 #ifndef __MBED_CMSIS_RTOS_CA9
qmaker 0:0d257bbf5c05 205 #if defined(CMSIS_OS_RTX) && !defined(__MBED_CMSIS_RTOS_CM)
qmaker 0:0d257bbf5c05 206 uint32_t size = 0;
qmaker 0:0d257bbf5c05 207 _mutex.lock();
qmaker 0:0d257bbf5c05 208
qmaker 0:0d257bbf5c05 209 if (_tid != NULL) {
qmaker 0:0d257bbf5c05 210 size = _thread_def.tcb.priv_stack;
qmaker 0:0d257bbf5c05 211 }
qmaker 0:0d257bbf5c05 212
qmaker 0:0d257bbf5c05 213 _mutex.unlock();
qmaker 0:0d257bbf5c05 214 return size;
qmaker 0:0d257bbf5c05 215 #else
qmaker 0:0d257bbf5c05 216 uint32_t size = 0;
qmaker 0:0d257bbf5c05 217 _mutex.lock();
qmaker 0:0d257bbf5c05 218
qmaker 0:0d257bbf5c05 219 if (_tid != NULL) {
qmaker 0:0d257bbf5c05 220 P_TCB tcb = rt_tid2ptcb(_tid);
qmaker 0:0d257bbf5c05 221 size = tcb->priv_stack;
qmaker 0:0d257bbf5c05 222 }
qmaker 0:0d257bbf5c05 223
qmaker 0:0d257bbf5c05 224 _mutex.unlock();
qmaker 0:0d257bbf5c05 225 return size;
qmaker 0:0d257bbf5c05 226 #endif
qmaker 0:0d257bbf5c05 227 #else
qmaker 0:0d257bbf5c05 228 return 0;
qmaker 0:0d257bbf5c05 229 #endif
qmaker 0:0d257bbf5c05 230 }
qmaker 0:0d257bbf5c05 231
qmaker 0:0d257bbf5c05 232 uint32_t Thread::free_stack() {
qmaker 0:0d257bbf5c05 233 #ifndef __MBED_CMSIS_RTOS_CA9
qmaker 0:0d257bbf5c05 234 #if defined(CMSIS_OS_RTX) && !defined(__MBED_CMSIS_RTOS_CM)
qmaker 0:0d257bbf5c05 235 uint32_t size = 0;
qmaker 0:0d257bbf5c05 236 _mutex.lock();
qmaker 0:0d257bbf5c05 237
qmaker 0:0d257bbf5c05 238 if (_tid != NULL) {
qmaker 0:0d257bbf5c05 239 uint32_t bottom = (uint32_t)_thread_def.tcb.stack;
qmaker 0:0d257bbf5c05 240 size = _thread_def.tcb.tsk_stack - bottom;
qmaker 0:0d257bbf5c05 241 }
qmaker 0:0d257bbf5c05 242
qmaker 0:0d257bbf5c05 243 _mutex.unlock();
qmaker 0:0d257bbf5c05 244 return size;
qmaker 0:0d257bbf5c05 245 #else
qmaker 0:0d257bbf5c05 246 uint32_t size = 0;
qmaker 0:0d257bbf5c05 247 _mutex.lock();
qmaker 0:0d257bbf5c05 248
qmaker 0:0d257bbf5c05 249 if (_tid != NULL) {
qmaker 0:0d257bbf5c05 250 P_TCB tcb = rt_tid2ptcb(_tid);
qmaker 0:0d257bbf5c05 251 uint32_t bottom = (uint32_t)tcb->stack;
qmaker 0:0d257bbf5c05 252 size = tcb->tsk_stack - bottom;
qmaker 0:0d257bbf5c05 253 }
qmaker 0:0d257bbf5c05 254
qmaker 0:0d257bbf5c05 255 _mutex.unlock();
qmaker 0:0d257bbf5c05 256 return size;
qmaker 0:0d257bbf5c05 257 #endif
qmaker 0:0d257bbf5c05 258 #else
qmaker 0:0d257bbf5c05 259 return 0;
qmaker 0:0d257bbf5c05 260 #endif
qmaker 0:0d257bbf5c05 261 }
qmaker 0:0d257bbf5c05 262
qmaker 0:0d257bbf5c05 263 uint32_t Thread::used_stack() {
qmaker 0:0d257bbf5c05 264 #ifndef __MBED_CMSIS_RTOS_CA9
qmaker 0:0d257bbf5c05 265 #if defined(CMSIS_OS_RTX) && !defined(__MBED_CMSIS_RTOS_CM)
qmaker 0:0d257bbf5c05 266 uint32_t size = 0;
qmaker 0:0d257bbf5c05 267 _mutex.lock();
qmaker 0:0d257bbf5c05 268
qmaker 0:0d257bbf5c05 269 if (_tid != NULL) {
qmaker 0:0d257bbf5c05 270 uint32_t top = (uint32_t)_thread_def.tcb.stack + _thread_def.tcb.priv_stack;
qmaker 0:0d257bbf5c05 271 size = top - _thread_def.tcb.tsk_stack;
qmaker 0:0d257bbf5c05 272 }
qmaker 0:0d257bbf5c05 273
qmaker 0:0d257bbf5c05 274 _mutex.unlock();
qmaker 0:0d257bbf5c05 275 return size;
qmaker 0:0d257bbf5c05 276 #else
qmaker 0:0d257bbf5c05 277 uint32_t size = 0;
qmaker 0:0d257bbf5c05 278 _mutex.lock();
qmaker 0:0d257bbf5c05 279
qmaker 0:0d257bbf5c05 280 if (_tid != NULL) {
qmaker 0:0d257bbf5c05 281 P_TCB tcb = rt_tid2ptcb(_tid);
qmaker 0:0d257bbf5c05 282 uint32_t top = (uint32_t)tcb->stack + tcb->priv_stack;
qmaker 0:0d257bbf5c05 283 size = top - tcb->tsk_stack;
qmaker 0:0d257bbf5c05 284 }
qmaker 0:0d257bbf5c05 285
qmaker 0:0d257bbf5c05 286 _mutex.unlock();
qmaker 0:0d257bbf5c05 287 return size;
qmaker 0:0d257bbf5c05 288 #endif
qmaker 0:0d257bbf5c05 289 #else
qmaker 0:0d257bbf5c05 290 return 0;
qmaker 0:0d257bbf5c05 291 #endif
qmaker 0:0d257bbf5c05 292 }
qmaker 0:0d257bbf5c05 293
qmaker 0:0d257bbf5c05 294 uint32_t Thread::max_stack() {
qmaker 0:0d257bbf5c05 295 #ifndef __MBED_CMSIS_RTOS_CA9
qmaker 0:0d257bbf5c05 296 #if defined(CMSIS_OS_RTX) && !defined(__MBED_CMSIS_RTOS_CM)
qmaker 0:0d257bbf5c05 297 uint32_t size = 0;
qmaker 0:0d257bbf5c05 298 _mutex.lock();
qmaker 0:0d257bbf5c05 299
qmaker 0:0d257bbf5c05 300 if (_tid != NULL) {
qmaker 0:0d257bbf5c05 301 uint32_t high_mark = 0;
qmaker 0:0d257bbf5c05 302 while (_thread_def.tcb.stack[high_mark] == 0xE25A2EA5)
qmaker 0:0d257bbf5c05 303 high_mark++;
qmaker 0:0d257bbf5c05 304 size = _thread_def.tcb.priv_stack - (high_mark * 4);
qmaker 0:0d257bbf5c05 305 }
qmaker 0:0d257bbf5c05 306
qmaker 0:0d257bbf5c05 307 _mutex.unlock();
qmaker 0:0d257bbf5c05 308 return size;
qmaker 0:0d257bbf5c05 309 #else
qmaker 0:0d257bbf5c05 310 uint32_t size = 0;
qmaker 0:0d257bbf5c05 311 _mutex.lock();
qmaker 0:0d257bbf5c05 312
qmaker 0:0d257bbf5c05 313 if (_tid != NULL) {
qmaker 0:0d257bbf5c05 314 P_TCB tcb = rt_tid2ptcb(_tid);
qmaker 0:0d257bbf5c05 315 uint32_t high_mark = 0;
qmaker 0:0d257bbf5c05 316 while (tcb->stack[high_mark] == 0xE25A2EA5)
qmaker 0:0d257bbf5c05 317 high_mark++;
qmaker 0:0d257bbf5c05 318 size = tcb->priv_stack - (high_mark * 4);
qmaker 0:0d257bbf5c05 319 }
qmaker 0:0d257bbf5c05 320
qmaker 0:0d257bbf5c05 321 _mutex.unlock();
qmaker 0:0d257bbf5c05 322 return size;
qmaker 0:0d257bbf5c05 323 #endif
qmaker 0:0d257bbf5c05 324 #else
qmaker 0:0d257bbf5c05 325 return 0;
qmaker 0:0d257bbf5c05 326 #endif
qmaker 0:0d257bbf5c05 327 }
qmaker 0:0d257bbf5c05 328
qmaker 0:0d257bbf5c05 329 osEvent Thread::signal_wait(int32_t signals, uint32_t millisec) {
qmaker 0:0d257bbf5c05 330 return osSignalWait(signals, millisec);
qmaker 0:0d257bbf5c05 331 }
qmaker 0:0d257bbf5c05 332
qmaker 0:0d257bbf5c05 333 osStatus Thread::wait(uint32_t millisec) {
qmaker 0:0d257bbf5c05 334 return osDelay(millisec);
qmaker 0:0d257bbf5c05 335 }
qmaker 0:0d257bbf5c05 336
qmaker 0:0d257bbf5c05 337 osStatus Thread::yield() {
qmaker 0:0d257bbf5c05 338 return osThreadYield();
qmaker 0:0d257bbf5c05 339 }
qmaker 0:0d257bbf5c05 340
qmaker 0:0d257bbf5c05 341 osThreadId Thread::gettid() {
qmaker 0:0d257bbf5c05 342 return osThreadGetId();
qmaker 0:0d257bbf5c05 343 }
qmaker 0:0d257bbf5c05 344
qmaker 0:0d257bbf5c05 345 void Thread::attach_idle_hook(void (*fptr)(void)) {
qmaker 0:0d257bbf5c05 346 rtos_attach_idle_hook(fptr);
qmaker 0:0d257bbf5c05 347 }
qmaker 0:0d257bbf5c05 348
qmaker 0:0d257bbf5c05 349 void Thread::attach_terminate_hook(void (*fptr)(osThreadId id)) {
qmaker 0:0d257bbf5c05 350 terminate_hook = fptr;
qmaker 0:0d257bbf5c05 351 }
qmaker 0:0d257bbf5c05 352
qmaker 0:0d257bbf5c05 353 Thread::~Thread() {
qmaker 0:0d257bbf5c05 354 // terminate is thread safe
qmaker 0:0d257bbf5c05 355 terminate();
qmaker 0:0d257bbf5c05 356 #ifdef __MBED_CMSIS_RTOS_CM
qmaker 0:0d257bbf5c05 357 if (_dynamic_stack) {
qmaker 0:0d257bbf5c05 358 delete[] (_thread_def.stack_pointer);
qmaker 0:0d257bbf5c05 359 _thread_def.stack_pointer = (uint32_t*)NULL;
qmaker 0:0d257bbf5c05 360 }
qmaker 0:0d257bbf5c05 361 #endif
qmaker 0:0d257bbf5c05 362 }
qmaker 0:0d257bbf5c05 363
qmaker 0:0d257bbf5c05 364 void Thread::_thunk(const void * thread_ptr)
qmaker 0:0d257bbf5c05 365 {
qmaker 0:0d257bbf5c05 366 Thread *t = (Thread*)thread_ptr;
qmaker 0:0d257bbf5c05 367 t->_task();
qmaker 0:0d257bbf5c05 368 t->_mutex.lock();
qmaker 0:0d257bbf5c05 369 t->_tid = (osThreadId)NULL;
qmaker 0:0d257bbf5c05 370 t->_join_sem.release();
qmaker 0:0d257bbf5c05 371 // rtos will release the mutex automatically
qmaker 0:0d257bbf5c05 372 }
qmaker 0:0d257bbf5c05 373
qmaker 0:0d257bbf5c05 374 }