Donald Meyers / Mbed OS evan
Committer:
djmeyers
Date:
Sat Mar 18 22:37:16 2017 +0000
Revision:
0:06ee5f8a484a
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
djmeyers 0:06ee5f8a484a 1 /*
djmeyers 0:06ee5f8a484a 2 * Copyright (c) 2016 ARM Limited. All rights reserved.
djmeyers 0:06ee5f8a484a 3 * SPDX-License-Identifier: Apache-2.0
djmeyers 0:06ee5f8a484a 4 * Licensed under the Apache License, Version 2.0 (the License); you may
djmeyers 0:06ee5f8a484a 5 * not use this file except in compliance with the License.
djmeyers 0:06ee5f8a484a 6 * You may obtain a copy of the License at
djmeyers 0:06ee5f8a484a 7 *
djmeyers 0:06ee5f8a484a 8 * http://www.apache.org/licenses/LICENSE-2.0
djmeyers 0:06ee5f8a484a 9 *
djmeyers 0:06ee5f8a484a 10 * Unless required by applicable law or agreed to in writing, software
djmeyers 0:06ee5f8a484a 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
djmeyers 0:06ee5f8a484a 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
djmeyers 0:06ee5f8a484a 13 * See the License for the specific language governing permissions and
djmeyers 0:06ee5f8a484a 14 * limitations under the License.
djmeyers 0:06ee5f8a484a 15 */
djmeyers 0:06ee5f8a484a 16
djmeyers 0:06ee5f8a484a 17
djmeyers 0:06ee5f8a484a 18 #include "pal_rtos.h"
djmeyers 0:06ee5f8a484a 19 #include "pal_plat_rtos.h"
djmeyers 0:06ee5f8a484a 20
djmeyers 0:06ee5f8a484a 21 #if PAL_UNIQUE_THREAD_PRIORITY
djmeyers 0:06ee5f8a484a 22 //! Threads priorities array.
djmeyers 0:06ee5f8a484a 23 uint8_t g_palThreadPriorities[PAL_MAX_NUMBER_OF_THREADS] = {0};
djmeyers 0:06ee5f8a484a 24 #endif //PAL_UNIQUE_THREAD_PRIORITY
djmeyers 0:06ee5f8a484a 25
djmeyers 0:06ee5f8a484a 26 void pal_osReboot(void)
djmeyers 0:06ee5f8a484a 27 {
djmeyers 0:06ee5f8a484a 28 pal_plat_osReboot();
djmeyers 0:06ee5f8a484a 29 }
djmeyers 0:06ee5f8a484a 30
djmeyers 0:06ee5f8a484a 31 uint32_t pal_osKernelSysTick(void)
djmeyers 0:06ee5f8a484a 32 {
djmeyers 0:06ee5f8a484a 33 uint32_t result;
djmeyers 0:06ee5f8a484a 34 result = pal_plat_osKernelSysTick();
djmeyers 0:06ee5f8a484a 35 return result;
djmeyers 0:06ee5f8a484a 36 }
djmeyers 0:06ee5f8a484a 37
djmeyers 0:06ee5f8a484a 38
djmeyers 0:06ee5f8a484a 39 uint64_t pal_osKernelSysTick64(void)
djmeyers 0:06ee5f8a484a 40 {
djmeyers 0:06ee5f8a484a 41
djmeyers 0:06ee5f8a484a 42 #if PAL_RTOS_64BIT_TICK_SUPPORTED
djmeyers 0:06ee5f8a484a 43 uint64_t result;
djmeyers 0:06ee5f8a484a 44 result = pal_plat_osKernelSysTick64();
djmeyers 0:06ee5f8a484a 45 return result;
djmeyers 0:06ee5f8a484a 46 #else
djmeyers 0:06ee5f8a484a 47 static uint64_t lastValue = 0;
djmeyers 0:06ee5f8a484a 48 static uint64_t wraparoundsDetected = 0;
djmeyers 0:06ee5f8a484a 49 const uint64_t one = 1;
djmeyers 0:06ee5f8a484a 50 uint64_t tmp = pal_plat_osKernelSysTick() + (wraparoundsDetected << 32);
djmeyers 0:06ee5f8a484a 51 if (tmp < lastValue) //erez's "wraparound algorithm" if we detect a wrap around add 1 to the higher 32 bits
djmeyers 0:06ee5f8a484a 52 {
djmeyers 0:06ee5f8a484a 53 tmp = tmp + (one << 32);
djmeyers 0:06ee5f8a484a 54 wraparoundsDetected++;
djmeyers 0:06ee5f8a484a 55 }
djmeyers 0:06ee5f8a484a 56 lastValue = tmp;
djmeyers 0:06ee5f8a484a 57 return (uint64_t)tmp;
djmeyers 0:06ee5f8a484a 58 #endif
djmeyers 0:06ee5f8a484a 59 }
djmeyers 0:06ee5f8a484a 60
djmeyers 0:06ee5f8a484a 61 uint64_t pal_osKernelSysTickMicroSec(uint64_t microseconds)
djmeyers 0:06ee5f8a484a 62 {
djmeyers 0:06ee5f8a484a 63 uint64_t result;
djmeyers 0:06ee5f8a484a 64 result = pal_plat_osKernelSysTickMicroSec(microseconds);
djmeyers 0:06ee5f8a484a 65 return result;
djmeyers 0:06ee5f8a484a 66 }
djmeyers 0:06ee5f8a484a 67
djmeyers 0:06ee5f8a484a 68 uint64_t pal_osKernelSysMilliSecTick(uint64_t sysTicks)
djmeyers 0:06ee5f8a484a 69 {
djmeyers 0:06ee5f8a484a 70 uint64_t result;
djmeyers 0:06ee5f8a484a 71 result = pal_plat_osKernelSysMilliSecTick(sysTicks);
djmeyers 0:06ee5f8a484a 72 return result;
djmeyers 0:06ee5f8a484a 73 }
djmeyers 0:06ee5f8a484a 74
djmeyers 0:06ee5f8a484a 75 uint64_t pal_osKernelSysTickFrequency(void)
djmeyers 0:06ee5f8a484a 76 {
djmeyers 0:06ee5f8a484a 77 uint64_t result;
djmeyers 0:06ee5f8a484a 78 result = pal_plat_osKernelSysTickFrequency();
djmeyers 0:06ee5f8a484a 79 return result;
djmeyers 0:06ee5f8a484a 80 }
djmeyers 0:06ee5f8a484a 81
djmeyers 0:06ee5f8a484a 82 palStatus_t pal_osThreadCreate(palThreadFuncPtr function, void* funcArgument, palThreadPriority_t priority, uint32_t stackSize, uint32_t* stackPtr, palThreadLocalStore_t* store, palThreadID_t* threadID)
djmeyers 0:06ee5f8a484a 83 {
djmeyers 0:06ee5f8a484a 84 palStatus_t status = PAL_SUCCESS;
djmeyers 0:06ee5f8a484a 85
djmeyers 0:06ee5f8a484a 86 #if PAL_UNIQUE_THREAD_PRIORITY
djmeyers 0:06ee5f8a484a 87 //! check if the priority have been used by other thread before
djmeyers 0:06ee5f8a484a 88 if(PAL_osPriorityError == priority)
djmeyers 0:06ee5f8a484a 89 {
djmeyers 0:06ee5f8a484a 90 status = PAL_ERR_INVALID_ARGUMENT;
djmeyers 0:06ee5f8a484a 91 }
djmeyers 0:06ee5f8a484a 92
djmeyers 0:06ee5f8a484a 93 if ((PAL_SUCCESS == status) && (g_palThreadPriorities[priority+PRIORYT_INDEX_OFFSET]))
djmeyers 0:06ee5f8a484a 94 {
djmeyers 0:06ee5f8a484a 95 *threadID = NULLPTR;
djmeyers 0:06ee5f8a484a 96 status = PAL_ERR_RTOS_PRIORITY;
djmeyers 0:06ee5f8a484a 97 }
djmeyers 0:06ee5f8a484a 98 #endif //PAL_IGNORE_UNIQUE_THREAD_PRIORITY
djmeyers 0:06ee5f8a484a 99
djmeyers 0:06ee5f8a484a 100 if (PAL_SUCCESS == status)
djmeyers 0:06ee5f8a484a 101 {
djmeyers 0:06ee5f8a484a 102 status = pal_plat_osThreadCreate(function, funcArgument, priority, stackSize, stackPtr, store, threadID);
djmeyers 0:06ee5f8a484a 103 }
djmeyers 0:06ee5f8a484a 104 return status;
djmeyers 0:06ee5f8a484a 105 }
djmeyers 0:06ee5f8a484a 106
djmeyers 0:06ee5f8a484a 107 palStatus_t pal_osThreadTerminate(palThreadID_t* threadID)
djmeyers 0:06ee5f8a484a 108 {
djmeyers 0:06ee5f8a484a 109 palStatus_t status;
djmeyers 0:06ee5f8a484a 110 status = pal_plat_osThreadTerminate(threadID);
djmeyers 0:06ee5f8a484a 111 return status;
djmeyers 0:06ee5f8a484a 112 }
djmeyers 0:06ee5f8a484a 113
djmeyers 0:06ee5f8a484a 114 palThreadID_t pal_osThreadGetId(void)
djmeyers 0:06ee5f8a484a 115 {
djmeyers 0:06ee5f8a484a 116 palThreadID_t result;
djmeyers 0:06ee5f8a484a 117 result = pal_plat_osThreadGetId();
djmeyers 0:06ee5f8a484a 118 return result;
djmeyers 0:06ee5f8a484a 119 }
djmeyers 0:06ee5f8a484a 120
djmeyers 0:06ee5f8a484a 121 void* pal_osThreadGetLocalStore(void)
djmeyers 0:06ee5f8a484a 122 {
djmeyers 0:06ee5f8a484a 123 void* result;
djmeyers 0:06ee5f8a484a 124 result = pal_plat_osThreadGetLocalStore();
djmeyers 0:06ee5f8a484a 125 return result;
djmeyers 0:06ee5f8a484a 126 }
djmeyers 0:06ee5f8a484a 127
djmeyers 0:06ee5f8a484a 128 palStatus_t pal_osDelay(uint32_t milliseconds)
djmeyers 0:06ee5f8a484a 129 {
djmeyers 0:06ee5f8a484a 130 palStatus_t status;
djmeyers 0:06ee5f8a484a 131 status = pal_plat_osDelay(milliseconds);
djmeyers 0:06ee5f8a484a 132 return status;
djmeyers 0:06ee5f8a484a 133 }
djmeyers 0:06ee5f8a484a 134
djmeyers 0:06ee5f8a484a 135
djmeyers 0:06ee5f8a484a 136 palStatus_t pal_osTimerCreate(palTimerFuncPtr function, void* funcArgument, palTimerType_t timerType, palTimerID_t* timerID)
djmeyers 0:06ee5f8a484a 137 {
djmeyers 0:06ee5f8a484a 138 palStatus_t status;
djmeyers 0:06ee5f8a484a 139 status = pal_plat_osTimerCreate(function, funcArgument, timerType, timerID);
djmeyers 0:06ee5f8a484a 140 return status;
djmeyers 0:06ee5f8a484a 141 }
djmeyers 0:06ee5f8a484a 142
djmeyers 0:06ee5f8a484a 143 palStatus_t pal_osTimerStart(palTimerID_t timerID, uint32_t millisec)
djmeyers 0:06ee5f8a484a 144 {
djmeyers 0:06ee5f8a484a 145 palStatus_t status;
djmeyers 0:06ee5f8a484a 146 status = pal_plat_osTimerStart(timerID, millisec);
djmeyers 0:06ee5f8a484a 147 return status;
djmeyers 0:06ee5f8a484a 148 }
djmeyers 0:06ee5f8a484a 149
djmeyers 0:06ee5f8a484a 150 palStatus_t pal_osTimerStop(palTimerID_t timerID)
djmeyers 0:06ee5f8a484a 151 {
djmeyers 0:06ee5f8a484a 152 palStatus_t status;
djmeyers 0:06ee5f8a484a 153 status = pal_plat_osTimerStop(timerID);
djmeyers 0:06ee5f8a484a 154 return status;
djmeyers 0:06ee5f8a484a 155 }
djmeyers 0:06ee5f8a484a 156
djmeyers 0:06ee5f8a484a 157 palStatus_t pal_osTimerDelete(palTimerID_t* timerID)
djmeyers 0:06ee5f8a484a 158 {
djmeyers 0:06ee5f8a484a 159 palStatus_t status;
djmeyers 0:06ee5f8a484a 160 status = pal_plat_osTimerDelete(timerID);
djmeyers 0:06ee5f8a484a 161 return status;
djmeyers 0:06ee5f8a484a 162 }
djmeyers 0:06ee5f8a484a 163
djmeyers 0:06ee5f8a484a 164 palStatus_t pal_osMutexCreate(palMutexID_t* mutexID)
djmeyers 0:06ee5f8a484a 165 {
djmeyers 0:06ee5f8a484a 166 palStatus_t status;
djmeyers 0:06ee5f8a484a 167 status = pal_plat_osMutexCreate(mutexID);
djmeyers 0:06ee5f8a484a 168 return status;
djmeyers 0:06ee5f8a484a 169 }
djmeyers 0:06ee5f8a484a 170
djmeyers 0:06ee5f8a484a 171 palStatus_t pal_osMutexWait(palMutexID_t mutexID, uint32_t millisec)
djmeyers 0:06ee5f8a484a 172 {
djmeyers 0:06ee5f8a484a 173 palStatus_t status;
djmeyers 0:06ee5f8a484a 174 status = pal_plat_osMutexWait(mutexID, millisec);
djmeyers 0:06ee5f8a484a 175 return status;
djmeyers 0:06ee5f8a484a 176 }
djmeyers 0:06ee5f8a484a 177
djmeyers 0:06ee5f8a484a 178 palStatus_t pal_osMutexRelease(palMutexID_t mutexID)
djmeyers 0:06ee5f8a484a 179 {
djmeyers 0:06ee5f8a484a 180 palStatus_t status;
djmeyers 0:06ee5f8a484a 181 status = pal_plat_osMutexRelease(mutexID);
djmeyers 0:06ee5f8a484a 182 return status;
djmeyers 0:06ee5f8a484a 183 }
djmeyers 0:06ee5f8a484a 184
djmeyers 0:06ee5f8a484a 185 palStatus_t pal_osMutexDelete(palMutexID_t* mutexID)
djmeyers 0:06ee5f8a484a 186 {
djmeyers 0:06ee5f8a484a 187 palStatus_t status;
djmeyers 0:06ee5f8a484a 188 status = pal_plat_osMutexDelete(mutexID);
djmeyers 0:06ee5f8a484a 189 return status;
djmeyers 0:06ee5f8a484a 190 }
djmeyers 0:06ee5f8a484a 191 palStatus_t pal_osSemaphoreCreate(uint32_t count, palSemaphoreID_t* semaphoreID)
djmeyers 0:06ee5f8a484a 192 {
djmeyers 0:06ee5f8a484a 193 palStatus_t status;
djmeyers 0:06ee5f8a484a 194 status = pal_plat_osSemaphoreCreate(count, semaphoreID);
djmeyers 0:06ee5f8a484a 195 return status;
djmeyers 0:06ee5f8a484a 196 }
djmeyers 0:06ee5f8a484a 197
djmeyers 0:06ee5f8a484a 198 palStatus_t pal_osSemaphoreWait(palSemaphoreID_t semaphoreID, uint32_t millisec, int32_t* countersAvailable)
djmeyers 0:06ee5f8a484a 199 {
djmeyers 0:06ee5f8a484a 200 palStatus_t status;
djmeyers 0:06ee5f8a484a 201 status = pal_plat_osSemaphoreWait(semaphoreID, millisec, countersAvailable);
djmeyers 0:06ee5f8a484a 202 return status;
djmeyers 0:06ee5f8a484a 203 }
djmeyers 0:06ee5f8a484a 204
djmeyers 0:06ee5f8a484a 205 palStatus_t pal_osSemaphoreRelease(palSemaphoreID_t semaphoreID)
djmeyers 0:06ee5f8a484a 206 {
djmeyers 0:06ee5f8a484a 207 palStatus_t status;
djmeyers 0:06ee5f8a484a 208 status = pal_plat_osSemaphoreRelease(semaphoreID);
djmeyers 0:06ee5f8a484a 209 return status;
djmeyers 0:06ee5f8a484a 210 }
djmeyers 0:06ee5f8a484a 211
djmeyers 0:06ee5f8a484a 212 palStatus_t pal_osSemaphoreDelete(palSemaphoreID_t* semaphoreID)
djmeyers 0:06ee5f8a484a 213 {
djmeyers 0:06ee5f8a484a 214 palStatus_t status;
djmeyers 0:06ee5f8a484a 215 status = pal_plat_osSemaphoreDelete(semaphoreID);
djmeyers 0:06ee5f8a484a 216 return status;
djmeyers 0:06ee5f8a484a 217 }
djmeyers 0:06ee5f8a484a 218
djmeyers 0:06ee5f8a484a 219 palStatus_t pal_osPoolCreate(uint32_t blockSize, uint32_t blockCount, palMemoryPoolID_t* memoryPoolID)
djmeyers 0:06ee5f8a484a 220 {
djmeyers 0:06ee5f8a484a 221 palStatus_t status;
djmeyers 0:06ee5f8a484a 222 status = pal_plat_osPoolCreate(blockSize, blockCount, memoryPoolID);
djmeyers 0:06ee5f8a484a 223 return status;
djmeyers 0:06ee5f8a484a 224 }
djmeyers 0:06ee5f8a484a 225
djmeyers 0:06ee5f8a484a 226 void* pal_osPoolAlloc(palMemoryPoolID_t memoryPoolID)
djmeyers 0:06ee5f8a484a 227 {
djmeyers 0:06ee5f8a484a 228 void* result;
djmeyers 0:06ee5f8a484a 229 result = pal_plat_osPoolAlloc(memoryPoolID);
djmeyers 0:06ee5f8a484a 230 return result;
djmeyers 0:06ee5f8a484a 231 }
djmeyers 0:06ee5f8a484a 232
djmeyers 0:06ee5f8a484a 233 void* pal_osPoolCAlloc(palMemoryPoolID_t memoryPoolID)
djmeyers 0:06ee5f8a484a 234 {
djmeyers 0:06ee5f8a484a 235 void* result;
djmeyers 0:06ee5f8a484a 236 //TODO(nirson01): debug print in case of failed alloc?
djmeyers 0:06ee5f8a484a 237 result = pal_plat_osPoolCAlloc(memoryPoolID);
djmeyers 0:06ee5f8a484a 238 return result;
djmeyers 0:06ee5f8a484a 239 }
djmeyers 0:06ee5f8a484a 240
djmeyers 0:06ee5f8a484a 241 palStatus_t pal_osPoolFree(palMemoryPoolID_t memoryPoolID, void* block)
djmeyers 0:06ee5f8a484a 242 {
djmeyers 0:06ee5f8a484a 243 palStatus_t status;
djmeyers 0:06ee5f8a484a 244 //TODO(nirson01): debug print in case of failed alloc?
djmeyers 0:06ee5f8a484a 245 status = pal_plat_osPoolFree(memoryPoolID, block);
djmeyers 0:06ee5f8a484a 246 return status;
djmeyers 0:06ee5f8a484a 247 }
djmeyers 0:06ee5f8a484a 248
djmeyers 0:06ee5f8a484a 249 palStatus_t pal_osPoolDestroy(palMemoryPoolID_t* memoryPoolID)
djmeyers 0:06ee5f8a484a 250 {
djmeyers 0:06ee5f8a484a 251 palStatus_t status;
djmeyers 0:06ee5f8a484a 252 status = pal_plat_osPoolDestroy(memoryPoolID);
djmeyers 0:06ee5f8a484a 253 return status;
djmeyers 0:06ee5f8a484a 254 }
djmeyers 0:06ee5f8a484a 255
djmeyers 0:06ee5f8a484a 256 palStatus_t pal_osMessageQueueCreate(uint32_t messageQSize, palMessageQID_t* messageQID)
djmeyers 0:06ee5f8a484a 257 {
djmeyers 0:06ee5f8a484a 258 palStatus_t status;
djmeyers 0:06ee5f8a484a 259 status = pal_plat_osMessageQueueCreate(messageQSize, messageQID);
djmeyers 0:06ee5f8a484a 260 return status;
djmeyers 0:06ee5f8a484a 261 }
djmeyers 0:06ee5f8a484a 262
djmeyers 0:06ee5f8a484a 263 palStatus_t pal_osMessagePut(palMessageQID_t messageQID, uint32_t info, uint32_t timeout)
djmeyers 0:06ee5f8a484a 264 {
djmeyers 0:06ee5f8a484a 265 palStatus_t status;
djmeyers 0:06ee5f8a484a 266 status = pal_plat_osMessagePut(messageQID, info, timeout);
djmeyers 0:06ee5f8a484a 267 return status;
djmeyers 0:06ee5f8a484a 268 }
djmeyers 0:06ee5f8a484a 269
djmeyers 0:06ee5f8a484a 270 palStatus_t pal_osMessageGet(palMessageQID_t messageQID, uint32_t timeout, uint32_t* messageValue)
djmeyers 0:06ee5f8a484a 271 {
djmeyers 0:06ee5f8a484a 272 palStatus_t status;
djmeyers 0:06ee5f8a484a 273 status = pal_plat_osMessageGet(messageQID, timeout, messageValue);
djmeyers 0:06ee5f8a484a 274 return status;
djmeyers 0:06ee5f8a484a 275 }
djmeyers 0:06ee5f8a484a 276
djmeyers 0:06ee5f8a484a 277 palStatus_t pal_osMessageQueueDestroy(palMessageQID_t* messageQID)
djmeyers 0:06ee5f8a484a 278 {
djmeyers 0:06ee5f8a484a 279 palStatus_t status;
djmeyers 0:06ee5f8a484a 280 status = pal_plat_osMessageQueueDestroy(messageQID);
djmeyers 0:06ee5f8a484a 281 return status;
djmeyers 0:06ee5f8a484a 282 }
djmeyers 0:06ee5f8a484a 283
djmeyers 0:06ee5f8a484a 284 int32_t pal_osAtomicIncrement(int32_t* valuePtr, int32_t increment)
djmeyers 0:06ee5f8a484a 285 {
djmeyers 0:06ee5f8a484a 286 int32_t result;
djmeyers 0:06ee5f8a484a 287 result = pal_plat_osAtomicIncrement(valuePtr, increment);
djmeyers 0:06ee5f8a484a 288 return result;
djmeyers 0:06ee5f8a484a 289 }
djmeyers 0:06ee5f8a484a 290
djmeyers 0:06ee5f8a484a 291
djmeyers 0:06ee5f8a484a 292
djmeyers 0:06ee5f8a484a 293 #ifdef DEBUG
djmeyers 0:06ee5f8a484a 294 #include "stdarg.h"
djmeyers 0:06ee5f8a484a 295 #endif
djmeyers 0:06ee5f8a484a 296
djmeyers 0:06ee5f8a484a 297 void dbgPrintf( const char* function, uint32_t line, const char * format, ... )
djmeyers 0:06ee5f8a484a 298 {
djmeyers 0:06ee5f8a484a 299 #ifdef DEBUG
djmeyers 0:06ee5f8a484a 300 static palMutexID_t printfMutex = NULLPTR;
djmeyers 0:06ee5f8a484a 301
djmeyers 0:06ee5f8a484a 302 va_list args;
djmeyers 0:06ee5f8a484a 303 if (!printfMutex)
djmeyers 0:06ee5f8a484a 304 {
djmeyers 0:06ee5f8a484a 305 pal_osMutexCreate(&printfMutex);
djmeyers 0:06ee5f8a484a 306 }
djmeyers 0:06ee5f8a484a 307 pal_osMutexWait(printfMutex, PAL_MAX_UINT32);
djmeyers 0:06ee5f8a484a 308 #ifdef VERBOSE
djmeyers 0:06ee5f8a484a 309 pal_plat_printf("%s:%ld\t",function,line);
djmeyers 0:06ee5f8a484a 310 #endif
djmeyers 0:06ee5f8a484a 311 va_start (args, format);
djmeyers 0:06ee5f8a484a 312 pal_plat_vprintf (format, args);
djmeyers 0:06ee5f8a484a 313 va_end (args);
djmeyers 0:06ee5f8a484a 314 pal_osMutexRelease(printfMutex);
djmeyers 0:06ee5f8a484a 315 #endif
djmeyers 0:06ee5f8a484a 316 }
djmeyers 0:06ee5f8a484a 317
djmeyers 0:06ee5f8a484a 318
djmeyers 0:06ee5f8a484a 319