00001
00027 #include "OSAL_FreeRTOS.h"
00028
00029
00030 void OSW_ENTER_CRITICAL()
00031 {
00032 taskENTER_CRITICAL();
00033 }
00034 void OSW_EXIT_CRITICAL()
00035 {
00036 taskEXIT_CRITICAL();
00037 }
00038 void OSW_ENTER_ISR(OSAL_ARG *pHighPrioTaskSwitch)
00039 {
00040 *pHighPrioTaskSwitch = OSAL_FALSE;
00041 }
00042 void OSW_EXIT_ISR(OSAL_ARG *pHighPrioTaskSwitch)
00043 {
00044
00045
00046 portEND_SWITCHING_ISR(*pHighPrioTaskSwitch);
00047 }
00048 void OSW_DISABLE_INTERRUPTS()
00049 {
00050 taskDISABLE_INTERRUPTS();
00051 }
00052 void OSW_ENABLE_INTERRUPTS()
00053 {
00054 taskENABLE_INTERRUPTS();
00055 }
00056
00057 OSAL_ERROR OSW_Start()
00058 {
00059 vTaskStartScheduler();
00060
00061 return OSAL_ERROR_NONE;
00062 }
00063
00064 OSAL_TICK OSW_GetTickCount()
00065 {
00066 return ((OSAL_TICK)xTaskGetTickCount());
00067 }
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 OSAL_ERROR OSW_TaskCreate(OSAL_NAME *pName,
00078 OSAL_TASK_FUNCTION func,
00079 OSAL_STACK_SIZE stackSize,
00080 OSAL_TASK_ARGS *pArgs,
00081 OSAL_PRIO prio,
00082 OSAL_TASK *pHandle)
00083 {
00084 signed portBASE_TYPE retValue;
00085 xTaskHandle task;
00086
00087
00088 *pHandle = NULL;
00089
00090 retValue = xTaskCreate(func, (const signed char*)pName, (unsigned short)stackSize, pArgs, (unsigned portBASE_TYPE)prio, &task);
00091
00092 switch(retValue)
00093 {
00094 case pdPASS:
00095 *pHandle = task;
00096 return OSAL_ERROR_NONE;
00097 break;
00098
00099 default:
00100 return OSAL_ERROR_INTERNAL_ERROR;
00101 break;
00102 }
00103 }
00104
00105 OSAL_ERROR OSW_TaskDelete(OSAL_TASK handle)
00106 {
00107 vTaskDelete(handle);
00108
00109 return OSAL_ERROR_NONE;
00110 }
00111
00112 OSAL_ERROR OSW_TaskSuspend(OSAL_TASK handle)
00113 {
00114 vTaskSuspend(handle);
00115
00116 return OSAL_ERROR_NONE;
00117 }
00118
00119 OSAL_ERROR OSW_TaskResume(OSAL_TASK handle)
00120 {
00121 vTaskResume(handle);
00122
00123 return OSAL_ERROR_NONE;
00124 }
00125
00126 OSAL_ERROR OSW_TaskPrioSet(OSAL_TASK handle, OSAL_PRIO prio)
00127 {
00128 vTaskPrioritySet(handle, prio);
00129
00130 return OSAL_ERROR_NONE;
00131 }
00132
00133 OSAL_ERROR OSW_TaskPrioGet(OSAL_TASK handle, OSAL_PRIO *pPrio)
00134 {
00135 *pPrio = (OSAL_PRIO)uxTaskPriorityGet(handle);
00136
00137 return OSAL_ERROR_NONE;
00138 }
00139
00140 OSAL_ERROR OSW_TaskDelay(OSAL_TASK handle, OSAL_TICK *pStartTime, OSAL_TICK ticks)
00141 {
00142 OSAL_TICK timeDelay;
00143
00144 timeDelay = ticks/(OSAL_TICK)portTICK_RATE_MS;
00145
00146
00147 if(pStartTime == NULL)
00148 {
00149 vTaskDelay(timeDelay);
00150 }
00151
00152
00153 else
00154 {
00155 vTaskDelayUntil(pStartTime, timeDelay);
00156 }
00157
00158 return OSAL_ERROR_NONE;
00159 }
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170 OSAL_ERROR OSW_QueueCreate(OSAL_NAME *pName, OSAL_COUNT queueSize, OSAL_MESSAGE_SIZE itemSize, OSAL_QUEUE *pHandle )
00171 {
00172 xQueueHandle queue;
00173
00174 *pHandle = NULL;
00175
00176 queue = xQueueCreate(queueSize, itemSize);
00177
00178 if(queue == NULL)
00179 {
00180 return OSAL_ERROR_OUT_OF_MEMORY;
00181 }
00182
00183 *pHandle = queue;
00184
00185 return OSAL_ERROR_NONE;
00186 }
00187
00188 OSAL_ERROR OSW_QueueDelete(OSAL_QUEUE handle)
00189 {
00190 vQueueDelete(handle);
00191
00192 return OSAL_ERROR_NONE;
00193 }
00194
00195 OSAL_ERROR OSW_QueueSend(OSAL_QUEUE handle, OSAL_MESSAGE *pMsg, OSAL_QUEUE_LOCATION location, OSAL_TIMEOUT timeout, OSAL_ARG *pHighPrioTaskSwitch, OSAL_FLAG callFromISR)
00196 {
00197 return OSAL_ERROR_NOT_SUPPORTED;
00198 }
00199
00219 OSAL_ERROR OSW_QueueReceive(OSAL_QUEUE handle,
00220 OSAL_MESSAGE *pMsg,
00221 OSAL_TIMEOUT timeout,
00222 OSAL_ARG *pHighPrioTaskSwitch,
00223 OSAL_FLAG callFromISR)
00224 {
00225 portBASE_TYPE rc;
00226
00227 if(callFromISR)
00228 {
00229 rc = xQueueReceiveFromISR(handle, pMsg, pHighPrioTaskSwitch);
00230 }
00231 else
00232 {
00233 rc = xQueueReceive(handle, pMsg, timeout);
00234 }
00235
00236 if(rc == pdPASS)
00237 {
00238 return OSAL_ERROR_NONE;
00239 }
00240 else
00241 {
00242 return OSAL_ERROR_QUEUE_EMPTY;
00243 }
00244 }
00245
00246 OSAL_ERROR OSW_QueuePeek(OSAL_QUEUE handle, OSAL_MESSAGE *pMsg, OSAL_TIMEOUT timeout)
00247 {
00248 portBASE_TYPE rc;
00249
00250 rc = xQueuePeek(handle, pMsg, timeout);
00251
00252 if(rc == pdPASS)
00253 {
00254 return OSAL_ERROR_NONE;
00255 }
00256 else
00257 {
00258 return OSAL_ERROR_QUEUE_EMPTY;
00259 }
00260 }
00261 OSAL_ERROR OSW_QueueCount(OSAL_QUEUE handle, OSAL_COUNT *pCount)
00262 {
00263 return OSAL_ERROR_NOT_SUPPORTED;
00264 }
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274 OSAL_ERROR OSW_SemaphoreCreate(OSAL_NAME *pName,
00275 OSAL_COUNT maxCount,
00276 OSAL_COUNT initCount,
00277 OSAL_SEMAPHORE *pHandle)
00278 {
00279 xSemaphoreHandle sem;
00280
00281 *pHandle = NULL;
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291 if(maxCount == 0 || initCount > maxCount) return OSAL_ERROR_INVALID_PARAMETER;
00292
00293 if(maxCount == 1)
00294 {
00295
00296
00297
00298
00299
00300
00301
00302 vSemaphoreCreateBinary(sem);
00303
00304 if(sem == NULL)
00305 {
00306 return OSAL_ERROR_OUT_OF_MEMORY;
00307 }
00308 }
00309 else
00310 {
00311
00312
00313
00314
00315
00316
00317
00318 sem = xSemaphoreCreateCounting(maxCount, initCount);
00319
00320 if(sem == NULL)
00321 {
00322 return OSAL_ERROR_OUT_OF_MEMORY;
00323 }
00324 }
00325
00326
00327 *pHandle = sem;
00328
00329 return OSAL_ERROR_NONE;
00330 }
00331
00332 void OSW_SemaphoreDelete(OSAL_SEMAPHORE handle)
00333 {
00334 vQueueDelete(handle);
00335 }
00336
00337 OSAL_ERROR OSW_SemaphoreAcquire(OSAL_SEMAPHORE handle, OSAL_TIMEOUT timeout, OSAL_FLAG callFromISR)
00338 {
00339 if(callFromISR)
00340 {
00341 xSemaphoreTake(handle, 0);
00342
00343 return OSAL_ERROR_NONE;
00344 }
00345 else
00346 {
00347 if(xSemaphoreTake(handle, timeout))
00348 {
00349 return OSAL_ERROR_NONE;
00350 }
00351 }
00352
00353 return OSAL_ERROR_TIMEOUT;
00354 }
00355
00356 OSAL_ERROR OSW_SemaphoreRelease(OSAL_SEMAPHORE handle, OSAL_ARG *pHighPrioTaskSwitch, OSAL_FLAG callFromISR)
00357 {
00358
00359 if(callFromISR)
00360 {
00361 if(xSemaphoreGiveFromISR(handle, pHighPrioTaskSwitch))
00362 {
00363 return OSAL_ERROR_NONE;
00364 }
00365 }
00366 else
00367 {
00368 if(xSemaphoreGive(handle))
00369 {
00370 return OSAL_ERROR_NONE;
00371 }
00372 }
00373
00374 return OSAL_ERROR_INTERNAL_ERROR;
00375 }
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385 OSAL_ERROR OSW_MutexCreate(OSAL_NAME *pName, OSAL_MUTEX *pHandle)
00386 {
00387 xSemaphoreHandle sem;
00388
00389 sem = xSemaphoreCreateMutex();
00390
00391 if(sem == NULL)
00392 {
00393 return OSAL_ERROR_OUT_OF_MEMORY;
00394 }
00395
00396 *pHandle = sem;
00397
00398 return OSAL_ERROR_NONE;
00399 }
00400
00401 void OSW_MutexDelete(OSAL_MUTEX handle)
00402 {
00403 vQueueDelete(handle);
00404 }
00405
00406
00423 void vApplicationIdleHook()
00424 {
00425 OSALIdleHook();
00426 }
00427
00443 void vApplicationStackOverflowHook(xTaskHandle *pxTask, signed portCHAR *pcTaskName)
00444 {
00445 OSALStackOverflowHook((OSAL_TASK*)pxTask, (OSAL_NAME*)pcTaskName);
00446 }
00447
00462 void vApplicationTickHook()
00463 {
00464 OSALSysTickHook();
00465 }
00466