RTC auf true

Committer:
kevman
Date:
Wed Nov 28 15:10:15 2018 +0000
Revision:
0:38ceb79fef03
RTC modified

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 0:38ceb79fef03 1 /* mbed Microcontroller Library
kevman 0:38ceb79fef03 2 * Copyright (c) 2006-2012 ARM Limited
kevman 0:38ceb79fef03 3 *
kevman 0:38ceb79fef03 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
kevman 0:38ceb79fef03 5 * of this software and associated documentation files (the "Software"), to deal
kevman 0:38ceb79fef03 6 * in the Software without restriction, including without limitation the rights
kevman 0:38ceb79fef03 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
kevman 0:38ceb79fef03 8 * copies of the Software, and to permit persons to whom the Software is
kevman 0:38ceb79fef03 9 * furnished to do so, subject to the following conditions:
kevman 0:38ceb79fef03 10 *
kevman 0:38ceb79fef03 11 * The above copyright notice and this permission notice shall be included in
kevman 0:38ceb79fef03 12 * all copies or substantial portions of the Software.
kevman 0:38ceb79fef03 13 *
kevman 0:38ceb79fef03 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
kevman 0:38ceb79fef03 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
kevman 0:38ceb79fef03 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
kevman 0:38ceb79fef03 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
kevman 0:38ceb79fef03 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kevman 0:38ceb79fef03 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
kevman 0:38ceb79fef03 20 * SOFTWARE.
kevman 0:38ceb79fef03 21 */
kevman 0:38ceb79fef03 22
kevman 0:38ceb79fef03 23 #define __STDC_LIMIT_MACROS
kevman 0:38ceb79fef03 24 #include "rtos/ThisThread.h"
kevman 0:38ceb79fef03 25
kevman 0:38ceb79fef03 26 #include "mbed.h"
kevman 0:38ceb79fef03 27 #include "rtos/rtos_idle.h"
kevman 0:38ceb79fef03 28 #include "mbed_assert.h"
kevman 0:38ceb79fef03 29
kevman 0:38ceb79fef03 30 namespace rtos {
kevman 0:38ceb79fef03 31
kevman 0:38ceb79fef03 32 uint32_t ThisThread::flags_clear(uint32_t flags)
kevman 0:38ceb79fef03 33 {
kevman 0:38ceb79fef03 34 flags = osThreadFlagsClear(flags);
kevman 0:38ceb79fef03 35 MBED_ASSERT(!(flags & osFlagsError));
kevman 0:38ceb79fef03 36 return flags;
kevman 0:38ceb79fef03 37 }
kevman 0:38ceb79fef03 38
kevman 0:38ceb79fef03 39 uint32_t ThisThread::flags_get()
kevman 0:38ceb79fef03 40 {
kevman 0:38ceb79fef03 41 return osThreadFlagsGet();
kevman 0:38ceb79fef03 42 }
kevman 0:38ceb79fef03 43
kevman 0:38ceb79fef03 44 static uint32_t flags_wait_for(uint32_t flags, uint32_t millisec, bool clear, uint32_t options)
kevman 0:38ceb79fef03 45 {
kevman 0:38ceb79fef03 46 if (!clear) {
kevman 0:38ceb79fef03 47 options |= osFlagsNoClear;
kevman 0:38ceb79fef03 48 }
kevman 0:38ceb79fef03 49 flags = osThreadFlagsWait(flags, options, millisec);
kevman 0:38ceb79fef03 50 if (flags & osFlagsError) {
kevman 0:38ceb79fef03 51 MBED_ASSERT((flags == osFlagsErrorTimeout && millisec != osWaitForever) ||
kevman 0:38ceb79fef03 52 (flags == osFlagsErrorResource && millisec == 0));
kevman 0:38ceb79fef03 53 flags = ThisThread::flags_get();
kevman 0:38ceb79fef03 54 }
kevman 0:38ceb79fef03 55
kevman 0:38ceb79fef03 56 return flags;
kevman 0:38ceb79fef03 57 }
kevman 0:38ceb79fef03 58
kevman 0:38ceb79fef03 59 static uint32_t flags_wait_until(uint32_t flags, uint64_t millisec, bool clear, uint32_t options)
kevman 0:38ceb79fef03 60 {
kevman 0:38ceb79fef03 61 uint64_t now = Kernel::get_ms_count();
kevman 0:38ceb79fef03 62
kevman 0:38ceb79fef03 63 uint32_t delay;
kevman 0:38ceb79fef03 64 if (now >= millisec) {
kevman 0:38ceb79fef03 65 delay = 0;
kevman 0:38ceb79fef03 66 } else if (millisec - now >= osWaitForever) {
kevman 0:38ceb79fef03 67 // Documentation permits early return for big offsets
kevman 0:38ceb79fef03 68 delay = osWaitForever - 1;
kevman 0:38ceb79fef03 69 } else {
kevman 0:38ceb79fef03 70 delay = millisec - now;
kevman 0:38ceb79fef03 71 }
kevman 0:38ceb79fef03 72 return flags_wait_for(flags, delay, clear, options);
kevman 0:38ceb79fef03 73 }
kevman 0:38ceb79fef03 74
kevman 0:38ceb79fef03 75 uint32_t ThisThread::flags_wait_all(uint32_t flags, bool clear)
kevman 0:38ceb79fef03 76 {
kevman 0:38ceb79fef03 77 return flags_wait_for(flags, osWaitForever, clear, osFlagsWaitAll);
kevman 0:38ceb79fef03 78 }
kevman 0:38ceb79fef03 79
kevman 0:38ceb79fef03 80 uint32_t ThisThread::flags_wait_all_for(uint32_t flags, uint32_t millisec, bool clear)
kevman 0:38ceb79fef03 81 {
kevman 0:38ceb79fef03 82 return flags_wait_for(flags, millisec, clear, osFlagsWaitAll);
kevman 0:38ceb79fef03 83 }
kevman 0:38ceb79fef03 84
kevman 0:38ceb79fef03 85 uint32_t ThisThread::flags_wait_all_until(uint32_t flags, uint64_t millisec, bool clear)
kevman 0:38ceb79fef03 86 {
kevman 0:38ceb79fef03 87 return flags_wait_until(flags, millisec, clear, osFlagsWaitAll);
kevman 0:38ceb79fef03 88 }
kevman 0:38ceb79fef03 89
kevman 0:38ceb79fef03 90 uint32_t ThisThread::flags_wait_any(uint32_t flags, bool clear)
kevman 0:38ceb79fef03 91 {
kevman 0:38ceb79fef03 92 return flags_wait_for(flags, osWaitForever, clear, osFlagsWaitAny);
kevman 0:38ceb79fef03 93 }
kevman 0:38ceb79fef03 94
kevman 0:38ceb79fef03 95 uint32_t ThisThread::flags_wait_any_for(uint32_t flags, uint32_t millisec, bool clear)
kevman 0:38ceb79fef03 96 {
kevman 0:38ceb79fef03 97 return flags_wait_for(flags, millisec, clear, osFlagsWaitAny);
kevman 0:38ceb79fef03 98 }
kevman 0:38ceb79fef03 99
kevman 0:38ceb79fef03 100 uint32_t ThisThread::flags_wait_any_until(uint32_t flags, uint64_t millisec, bool clear)
kevman 0:38ceb79fef03 101 {
kevman 0:38ceb79fef03 102 return flags_wait_until(flags, millisec, clear, osFlagsWaitAny);
kevman 0:38ceb79fef03 103 }
kevman 0:38ceb79fef03 104
kevman 0:38ceb79fef03 105 void ThisThread::sleep_for(uint32_t millisec)
kevman 0:38ceb79fef03 106 {
kevman 0:38ceb79fef03 107 osStatus_t status = osDelay(millisec);
kevman 0:38ceb79fef03 108 MBED_ASSERT(status == osOK);
kevman 0:38ceb79fef03 109 }
kevman 0:38ceb79fef03 110
kevman 0:38ceb79fef03 111 void ThisThread::sleep_until(uint64_t millisec)
kevman 0:38ceb79fef03 112 {
kevman 0:38ceb79fef03 113 // CMSIS-RTOS 2.1.0 had 64-bit time and osDelayUntil, but that's been revoked.
kevman 0:38ceb79fef03 114 // Limit ourselves to manual implementation assuming a >=32-bit osDelay.
kevman 0:38ceb79fef03 115
kevman 0:38ceb79fef03 116 // 64-bit time doesn't wrap (for half a billion years, at last)
kevman 0:38ceb79fef03 117 // make the effort to loop for unlimited sleep, as it doesn't cost much
kevman 0:38ceb79fef03 118 uint64_t now;
kevman 0:38ceb79fef03 119
kevman 0:38ceb79fef03 120 while ((now = Kernel::get_ms_count()) < millisec) {
kevman 0:38ceb79fef03 121 if (millisec - now > UINT32_MAX) {
kevman 0:38ceb79fef03 122 sleep_for(UINT32_MAX);
kevman 0:38ceb79fef03 123 continue;
kevman 0:38ceb79fef03 124 } else {
kevman 0:38ceb79fef03 125 sleep_for(millisec - now);
kevman 0:38ceb79fef03 126 break;
kevman 0:38ceb79fef03 127 }
kevman 0:38ceb79fef03 128 }
kevman 0:38ceb79fef03 129 }
kevman 0:38ceb79fef03 130
kevman 0:38ceb79fef03 131 void ThisThread::yield()
kevman 0:38ceb79fef03 132 {
kevman 0:38ceb79fef03 133 osThreadYield();
kevman 0:38ceb79fef03 134 }
kevman 0:38ceb79fef03 135
kevman 0:38ceb79fef03 136 osThreadId_t ThisThread::get_id()
kevman 0:38ceb79fef03 137 {
kevman 0:38ceb79fef03 138 return osThreadGetId();
kevman 0:38ceb79fef03 139 }
kevman 0:38ceb79fef03 140
kevman 0:38ceb79fef03 141 }