PES4 / Mbed OS Queue_02
Committer:
demayer
Date:
Sat Apr 11 08:15:48 2020 +0000
Revision:
1:b36bbc1c6d27
Parent:
0:6bf0743ece18
IMU-library in .h und .cpp file aufgeteilt

Who changed what in which revision?

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