Webserver+3d print

Dependents:   Nucleo

Committer:
Sergunb
Date:
Sat Feb 04 18:15:49 2017 +0000
Revision:
0:8918a71cdbe9
nothing else

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sergunb 0:8918a71cdbe9 1 /**
Sergunb 0:8918a71cdbe9 2 * @file os_port_cmsis_rtos.c
Sergunb 0:8918a71cdbe9 3 * @brief RTOS abstraction layer (CMSIS-RTOS)
Sergunb 0:8918a71cdbe9 4 *
Sergunb 0:8918a71cdbe9 5 * @section License
Sergunb 0:8918a71cdbe9 6 *
Sergunb 0:8918a71cdbe9 7 * Copyright (C) 2010-2017 Oryx Embedded SARL. All rights reserved.
Sergunb 0:8918a71cdbe9 8 *
Sergunb 0:8918a71cdbe9 9 * This program is free software; you can redistribute it and/or
Sergunb 0:8918a71cdbe9 10 * modify it under the terms of the GNU General Public License
Sergunb 0:8918a71cdbe9 11 * as published by the Free Software Foundation; either version 2
Sergunb 0:8918a71cdbe9 12 * of the License, or (at your option) any later version.
Sergunb 0:8918a71cdbe9 13 *
Sergunb 0:8918a71cdbe9 14 * This program is distributed in the hope that it will be useful,
Sergunb 0:8918a71cdbe9 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Sergunb 0:8918a71cdbe9 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Sergunb 0:8918a71cdbe9 17 * GNU General Public License for more details.
Sergunb 0:8918a71cdbe9 18 *
Sergunb 0:8918a71cdbe9 19 * You should have received a copy of the GNU General Public License
Sergunb 0:8918a71cdbe9 20 * along with this program; if not, write to the Free Software Foundation,
Sergunb 0:8918a71cdbe9 21 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Sergunb 0:8918a71cdbe9 22 *
Sergunb 0:8918a71cdbe9 23 * @author Oryx Embedded SARL (www.oryx-embedded.com)
Sergunb 0:8918a71cdbe9 24 * @version 1.7.6
Sergunb 0:8918a71cdbe9 25 **/
Sergunb 0:8918a71cdbe9 26
Sergunb 0:8918a71cdbe9 27 //Switch to the appropriate trace level
Sergunb 0:8918a71cdbe9 28 #define TRACE_LEVEL TRACE_LEVEL_OFF
Sergunb 0:8918a71cdbe9 29
Sergunb 0:8918a71cdbe9 30 //Dependencies
Sergunb 0:8918a71cdbe9 31 #include <stdio.h>
Sergunb 0:8918a71cdbe9 32 #include <stdlib.h>
Sergunb 0:8918a71cdbe9 33 #include "os_port.h"
Sergunb 0:8918a71cdbe9 34 #include "os_port_cmsis_rtos.h"
Sergunb 0:8918a71cdbe9 35 #include "debug.h"
Sergunb 0:8918a71cdbe9 36
Sergunb 0:8918a71cdbe9 37
Sergunb 0:8918a71cdbe9 38 /**
Sergunb 0:8918a71cdbe9 39 * @brief Kernel initialization
Sergunb 0:8918a71cdbe9 40 **/
Sergunb 0:8918a71cdbe9 41
Sergunb 0:8918a71cdbe9 42 void osInitKernel(void)
Sergunb 0:8918a71cdbe9 43 {
Sergunb 0:8918a71cdbe9 44 //Check CMSIS-RTOS API version
Sergunb 0:8918a71cdbe9 45 #if (osCMSIS >= 0x10001)
Sergunb 0:8918a71cdbe9 46 //Initialize the kernel
Sergunb 0:8918a71cdbe9 47 osKernelInitialize();
Sergunb 0:8918a71cdbe9 48 #endif
Sergunb 0:8918a71cdbe9 49 }
Sergunb 0:8918a71cdbe9 50
Sergunb 0:8918a71cdbe9 51
Sergunb 0:8918a71cdbe9 52 /**
Sergunb 0:8918a71cdbe9 53 * @brief Start kernel
Sergunb 0:8918a71cdbe9 54 **/
Sergunb 0:8918a71cdbe9 55
Sergunb 0:8918a71cdbe9 56 void osStartKernel(void)
Sergunb 0:8918a71cdbe9 57 {
Sergunb 0:8918a71cdbe9 58 //Check CMSIS-RTOS API version
Sergunb 0:8918a71cdbe9 59 #if (osCMSIS >= 0x10001)
Sergunb 0:8918a71cdbe9 60 //Start the kernel
Sergunb 0:8918a71cdbe9 61 osKernelStart();
Sergunb 0:8918a71cdbe9 62 #else
Sergunb 0:8918a71cdbe9 63 //Start the kernel
Sergunb 0:8918a71cdbe9 64 osKernelStart(NULL, NULL);
Sergunb 0:8918a71cdbe9 65 #endif
Sergunb 0:8918a71cdbe9 66 }
Sergunb 0:8918a71cdbe9 67
Sergunb 0:8918a71cdbe9 68
Sergunb 0:8918a71cdbe9 69 /**
Sergunb 0:8918a71cdbe9 70 * @brief Create a new task
Sergunb 0:8918a71cdbe9 71 * @param[in] name A name identifying the task
Sergunb 0:8918a71cdbe9 72 * @param[in] taskCode Pointer to the task entry function
Sergunb 0:8918a71cdbe9 73 * @param[in] params A pointer to a variable to be passed to the task
Sergunb 0:8918a71cdbe9 74 * @param[in] stackSize The initial size of the stack, in words
Sergunb 0:8918a71cdbe9 75 * @param[in] priority The priority at which the task should run
Sergunb 0:8918a71cdbe9 76 * @return If the function succeeds, the return value is a pointer to the
Sergunb 0:8918a71cdbe9 77 * new task. If the function fails, the return value is NULL
Sergunb 0:8918a71cdbe9 78 **/
Sergunb 0:8918a71cdbe9 79
Sergunb 0:8918a71cdbe9 80 OsTask *osCreateTask(const char_t *name, OsTaskCode taskCode,
Sergunb 0:8918a71cdbe9 81 void *params, size_t stackSize, int_t priority)
Sergunb 0:8918a71cdbe9 82 {
Sergunb 0:8918a71cdbe9 83 osThreadId threadId;
Sergunb 0:8918a71cdbe9 84 osThreadDef_t threadDef;
Sergunb 0:8918a71cdbe9 85
Sergunb 0:8918a71cdbe9 86 #if defined(osCMSIS_RTX)
Sergunb 0:8918a71cdbe9 87 threadDef.pthread = (os_pthread) taskCode;
Sergunb 0:8918a71cdbe9 88 threadDef.tpriority = (osPriority) priority;
Sergunb 0:8918a71cdbe9 89 threadDef.instances = 1;
Sergunb 0:8918a71cdbe9 90 threadDef.stacksize = stackSize * sizeof(uint_t);
Sergunb 0:8918a71cdbe9 91 #else
Sergunb 0:8918a71cdbe9 92 threadDef.name = (char_t *) name;
Sergunb 0:8918a71cdbe9 93 threadDef.pthread = (os_pthread) taskCode;
Sergunb 0:8918a71cdbe9 94 threadDef.tpriority = (osPriority) priority;
Sergunb 0:8918a71cdbe9 95 threadDef.instances = 1;
Sergunb 0:8918a71cdbe9 96 threadDef.stacksize = stackSize;
Sergunb 0:8918a71cdbe9 97 #endif
Sergunb 0:8918a71cdbe9 98
Sergunb 0:8918a71cdbe9 99 //Create a new thread
Sergunb 0:8918a71cdbe9 100 threadId = osThreadCreate(&threadDef, params);
Sergunb 0:8918a71cdbe9 101 //Return a handle to the newly created thread
Sergunb 0:8918a71cdbe9 102 return (OsTask *) threadId;
Sergunb 0:8918a71cdbe9 103 }
Sergunb 0:8918a71cdbe9 104
Sergunb 0:8918a71cdbe9 105
Sergunb 0:8918a71cdbe9 106 /**
Sergunb 0:8918a71cdbe9 107 * @brief Delete a task
Sergunb 0:8918a71cdbe9 108 * @param[in] task Pointer to the task to be deleted
Sergunb 0:8918a71cdbe9 109 **/
Sergunb 0:8918a71cdbe9 110
Sergunb 0:8918a71cdbe9 111 void osDeleteTask(OsTask *task)
Sergunb 0:8918a71cdbe9 112 {
Sergunb 0:8918a71cdbe9 113 //Delete the specified thread
Sergunb 0:8918a71cdbe9 114 osThreadTerminate((osThreadId) task);
Sergunb 0:8918a71cdbe9 115 }
Sergunb 0:8918a71cdbe9 116
Sergunb 0:8918a71cdbe9 117
Sergunb 0:8918a71cdbe9 118 /**
Sergunb 0:8918a71cdbe9 119 * @brief Delay routine
Sergunb 0:8918a71cdbe9 120 * @param[in] delay Amount of time for which the calling task should block
Sergunb 0:8918a71cdbe9 121 **/
Sergunb 0:8918a71cdbe9 122
Sergunb 0:8918a71cdbe9 123 void osDelayTask(systime_t delay)
Sergunb 0:8918a71cdbe9 124 {
Sergunb 0:8918a71cdbe9 125 //Delay the thread for the specified duration
Sergunb 0:8918a71cdbe9 126 osDelay(delay);
Sergunb 0:8918a71cdbe9 127 }
Sergunb 0:8918a71cdbe9 128
Sergunb 0:8918a71cdbe9 129
Sergunb 0:8918a71cdbe9 130 /**
Sergunb 0:8918a71cdbe9 131 * @brief Yield control to the next task
Sergunb 0:8918a71cdbe9 132 **/
Sergunb 0:8918a71cdbe9 133
Sergunb 0:8918a71cdbe9 134 void osSwitchTask(void)
Sergunb 0:8918a71cdbe9 135 {
Sergunb 0:8918a71cdbe9 136 //Force a context switch
Sergunb 0:8918a71cdbe9 137 osThreadYield();
Sergunb 0:8918a71cdbe9 138 }
Sergunb 0:8918a71cdbe9 139
Sergunb 0:8918a71cdbe9 140
Sergunb 0:8918a71cdbe9 141 /**
Sergunb 0:8918a71cdbe9 142 * @brief Suspend scheduler activity
Sergunb 0:8918a71cdbe9 143 **/
Sergunb 0:8918a71cdbe9 144
Sergunb 0:8918a71cdbe9 145 void osSuspendAllTasks(void)
Sergunb 0:8918a71cdbe9 146 {
Sergunb 0:8918a71cdbe9 147 #if !defined(osCMSIS_RTX)
Sergunb 0:8918a71cdbe9 148 //Make sure the operating system is running
Sergunb 0:8918a71cdbe9 149 if(osKernelRunning())
Sergunb 0:8918a71cdbe9 150 {
Sergunb 0:8918a71cdbe9 151 //Suspend all threads
Sergunb 0:8918a71cdbe9 152 osThreadSuspendAll();
Sergunb 0:8918a71cdbe9 153 }
Sergunb 0:8918a71cdbe9 154 #endif
Sergunb 0:8918a71cdbe9 155 }
Sergunb 0:8918a71cdbe9 156
Sergunb 0:8918a71cdbe9 157
Sergunb 0:8918a71cdbe9 158 /**
Sergunb 0:8918a71cdbe9 159 * @brief Resume scheduler activity
Sergunb 0:8918a71cdbe9 160 **/
Sergunb 0:8918a71cdbe9 161
Sergunb 0:8918a71cdbe9 162 void osResumeAllTasks(void)
Sergunb 0:8918a71cdbe9 163 {
Sergunb 0:8918a71cdbe9 164 #if !defined(osCMSIS_RTX)
Sergunb 0:8918a71cdbe9 165 //Make sure the operating system is running
Sergunb 0:8918a71cdbe9 166 if(osKernelRunning())
Sergunb 0:8918a71cdbe9 167 {
Sergunb 0:8918a71cdbe9 168 //Resume all threads
Sergunb 0:8918a71cdbe9 169 osThreadResumeAll();
Sergunb 0:8918a71cdbe9 170 }
Sergunb 0:8918a71cdbe9 171 #endif
Sergunb 0:8918a71cdbe9 172 }
Sergunb 0:8918a71cdbe9 173
Sergunb 0:8918a71cdbe9 174
Sergunb 0:8918a71cdbe9 175 /**
Sergunb 0:8918a71cdbe9 176 * @brief Create an event object
Sergunb 0:8918a71cdbe9 177 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 178 * @return The function returns TRUE if the event object was successfully
Sergunb 0:8918a71cdbe9 179 * created. Otherwise, FALSE is returned
Sergunb 0:8918a71cdbe9 180 **/
Sergunb 0:8918a71cdbe9 181
Sergunb 0:8918a71cdbe9 182 bool_t osCreateEvent(OsEvent *event)
Sergunb 0:8918a71cdbe9 183 {
Sergunb 0:8918a71cdbe9 184 osSemaphoreDef_t semaphoreDef;
Sergunb 0:8918a71cdbe9 185
Sergunb 0:8918a71cdbe9 186 #if defined(osCMSIS_RTX)
Sergunb 0:8918a71cdbe9 187 semaphoreDef.semaphore = event->cb;
Sergunb 0:8918a71cdbe9 188 #else
Sergunb 0:8918a71cdbe9 189 semaphoreDef.dummy = 0;
Sergunb 0:8918a71cdbe9 190 #endif
Sergunb 0:8918a71cdbe9 191
Sergunb 0:8918a71cdbe9 192 //Create a binary semaphore object
Sergunb 0:8918a71cdbe9 193 event->id = osSemaphoreCreate(&semaphoreDef, 1);
Sergunb 0:8918a71cdbe9 194
Sergunb 0:8918a71cdbe9 195 //Check whether the returned semaphore ID is valid
Sergunb 0:8918a71cdbe9 196 if(event->id != NULL)
Sergunb 0:8918a71cdbe9 197 {
Sergunb 0:8918a71cdbe9 198 //Force the specified event to the nonsignaled state
Sergunb 0:8918a71cdbe9 199 osSemaphoreWait(event->id, 0);
Sergunb 0:8918a71cdbe9 200 //Event successfully created
Sergunb 0:8918a71cdbe9 201 return TRUE;
Sergunb 0:8918a71cdbe9 202 }
Sergunb 0:8918a71cdbe9 203 else
Sergunb 0:8918a71cdbe9 204 {
Sergunb 0:8918a71cdbe9 205 //Failed to create event object
Sergunb 0:8918a71cdbe9 206 return FALSE;
Sergunb 0:8918a71cdbe9 207 }
Sergunb 0:8918a71cdbe9 208 }
Sergunb 0:8918a71cdbe9 209
Sergunb 0:8918a71cdbe9 210
Sergunb 0:8918a71cdbe9 211 /**
Sergunb 0:8918a71cdbe9 212 * @brief Delete an event object
Sergunb 0:8918a71cdbe9 213 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 214 **/
Sergunb 0:8918a71cdbe9 215
Sergunb 0:8918a71cdbe9 216 void osDeleteEvent(OsEvent *event)
Sergunb 0:8918a71cdbe9 217 {
Sergunb 0:8918a71cdbe9 218 //Make sure the semaphore ID is valid
Sergunb 0:8918a71cdbe9 219 if(event->id != NULL)
Sergunb 0:8918a71cdbe9 220 {
Sergunb 0:8918a71cdbe9 221 //Properly dispose the event object
Sergunb 0:8918a71cdbe9 222 osSemaphoreDelete(event->id);
Sergunb 0:8918a71cdbe9 223 }
Sergunb 0:8918a71cdbe9 224 }
Sergunb 0:8918a71cdbe9 225
Sergunb 0:8918a71cdbe9 226
Sergunb 0:8918a71cdbe9 227 /**
Sergunb 0:8918a71cdbe9 228 * @brief Set the specified event object to the signaled state
Sergunb 0:8918a71cdbe9 229 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 230 **/
Sergunb 0:8918a71cdbe9 231
Sergunb 0:8918a71cdbe9 232 void osSetEvent(OsEvent *event)
Sergunb 0:8918a71cdbe9 233 {
Sergunb 0:8918a71cdbe9 234 //Set the specified event to the signaled state
Sergunb 0:8918a71cdbe9 235 osSemaphoreRelease(event->id);
Sergunb 0:8918a71cdbe9 236 }
Sergunb 0:8918a71cdbe9 237
Sergunb 0:8918a71cdbe9 238
Sergunb 0:8918a71cdbe9 239 /**
Sergunb 0:8918a71cdbe9 240 * @brief Set the specified event object to the nonsignaled state
Sergunb 0:8918a71cdbe9 241 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 242 **/
Sergunb 0:8918a71cdbe9 243
Sergunb 0:8918a71cdbe9 244 void osResetEvent(OsEvent *event)
Sergunb 0:8918a71cdbe9 245 {
Sergunb 0:8918a71cdbe9 246 #if defined(osCMSIS_RTX)
Sergunb 0:8918a71cdbe9 247 //Force the specified event to the nonsignaled state
Sergunb 0:8918a71cdbe9 248 while(osSemaphoreWait(event->id, 0) > 0);
Sergunb 0:8918a71cdbe9 249 #else
Sergunb 0:8918a71cdbe9 250 //Force the specified event to the nonsignaled state
Sergunb 0:8918a71cdbe9 251 osSemaphoreWait(event->id, 0);
Sergunb 0:8918a71cdbe9 252 #endif
Sergunb 0:8918a71cdbe9 253 }
Sergunb 0:8918a71cdbe9 254
Sergunb 0:8918a71cdbe9 255
Sergunb 0:8918a71cdbe9 256 /**
Sergunb 0:8918a71cdbe9 257 * @brief Wait until the specified event is in the signaled state
Sergunb 0:8918a71cdbe9 258 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 259 * @param[in] timeout Timeout interval
Sergunb 0:8918a71cdbe9 260 * @return The function returns TRUE if the state of the specified object is
Sergunb 0:8918a71cdbe9 261 * signaled. FALSE is returned if the timeout interval elapsed
Sergunb 0:8918a71cdbe9 262 **/
Sergunb 0:8918a71cdbe9 263
Sergunb 0:8918a71cdbe9 264 bool_t osWaitForEvent(OsEvent *event, systime_t timeout)
Sergunb 0:8918a71cdbe9 265 {
Sergunb 0:8918a71cdbe9 266 int32_t ret;
Sergunb 0:8918a71cdbe9 267
Sergunb 0:8918a71cdbe9 268 //Wait until the specified event is in the signaled
Sergunb 0:8918a71cdbe9 269 //state or the timeout interval elapses
Sergunb 0:8918a71cdbe9 270 if(timeout == INFINITE_DELAY)
Sergunb 0:8918a71cdbe9 271 {
Sergunb 0:8918a71cdbe9 272 //Infinite timeout period
Sergunb 0:8918a71cdbe9 273 ret = osSemaphoreWait(event->id, osWaitForever);
Sergunb 0:8918a71cdbe9 274 }
Sergunb 0:8918a71cdbe9 275 else
Sergunb 0:8918a71cdbe9 276 {
Sergunb 0:8918a71cdbe9 277 #if defined(osCMSIS_RTX)
Sergunb 0:8918a71cdbe9 278 systime_t n;
Sergunb 0:8918a71cdbe9 279
Sergunb 0:8918a71cdbe9 280 //Loop until the assigned time period has elapsed
Sergunb 0:8918a71cdbe9 281 do
Sergunb 0:8918a71cdbe9 282 {
Sergunb 0:8918a71cdbe9 283 //Limit the timeout value
Sergunb 0:8918a71cdbe9 284 n = MIN(timeout, 10000);
Sergunb 0:8918a71cdbe9 285 //Wait for the specified time interval
Sergunb 0:8918a71cdbe9 286 ret = osSemaphoreWait(event->id, n);
Sergunb 0:8918a71cdbe9 287 //Decrement timeout value
Sergunb 0:8918a71cdbe9 288 timeout -= n;
Sergunb 0:8918a71cdbe9 289
Sergunb 0:8918a71cdbe9 290 //Check timeout value
Sergunb 0:8918a71cdbe9 291 } while(ret == 0 && timeout > 0);
Sergunb 0:8918a71cdbe9 292 #else
Sergunb 0:8918a71cdbe9 293 //Wait for the specified time interval
Sergunb 0:8918a71cdbe9 294 ret = osSemaphoreWait(event->id, timeout);
Sergunb 0:8918a71cdbe9 295 #endif
Sergunb 0:8918a71cdbe9 296 }
Sergunb 0:8918a71cdbe9 297
Sergunb 0:8918a71cdbe9 298 #if defined(osCMSIS_RTX)
Sergunb 0:8918a71cdbe9 299 //Check return value
Sergunb 0:8918a71cdbe9 300 if(ret > 0)
Sergunb 0:8918a71cdbe9 301 {
Sergunb 0:8918a71cdbe9 302 //Force the event back to the nonsignaled state
Sergunb 0:8918a71cdbe9 303 while(osSemaphoreWait(event->id, 0) > 0);
Sergunb 0:8918a71cdbe9 304
Sergunb 0:8918a71cdbe9 305 //The specified event is in the signaled state
Sergunb 0:8918a71cdbe9 306 return TRUE;
Sergunb 0:8918a71cdbe9 307 }
Sergunb 0:8918a71cdbe9 308 else
Sergunb 0:8918a71cdbe9 309 {
Sergunb 0:8918a71cdbe9 310 //The timeout interval elapsed
Sergunb 0:8918a71cdbe9 311 return FALSE;
Sergunb 0:8918a71cdbe9 312 }
Sergunb 0:8918a71cdbe9 313 #else
Sergunb 0:8918a71cdbe9 314 //Check return value
Sergunb 0:8918a71cdbe9 315 if(ret == osOK)
Sergunb 0:8918a71cdbe9 316 return TRUE;
Sergunb 0:8918a71cdbe9 317 else
Sergunb 0:8918a71cdbe9 318 return FALSE;
Sergunb 0:8918a71cdbe9 319 #endif
Sergunb 0:8918a71cdbe9 320 }
Sergunb 0:8918a71cdbe9 321
Sergunb 0:8918a71cdbe9 322
Sergunb 0:8918a71cdbe9 323 /**
Sergunb 0:8918a71cdbe9 324 * @brief Set an event object to the signaled state from an interrupt service routine
Sergunb 0:8918a71cdbe9 325 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 326 * @return TRUE if setting the event to signaled state caused a task to unblock
Sergunb 0:8918a71cdbe9 327 * and the unblocked task has a priority higher than the currently running task
Sergunb 0:8918a71cdbe9 328 **/
Sergunb 0:8918a71cdbe9 329
Sergunb 0:8918a71cdbe9 330 bool_t osSetEventFromIsr(OsEvent *event)
Sergunb 0:8918a71cdbe9 331 {
Sergunb 0:8918a71cdbe9 332 //Set the specified event to the signaled state
Sergunb 0:8918a71cdbe9 333 osSemaphoreRelease(event->id);
Sergunb 0:8918a71cdbe9 334
Sergunb 0:8918a71cdbe9 335 //The return value is not relevant
Sergunb 0:8918a71cdbe9 336 return FALSE;
Sergunb 0:8918a71cdbe9 337 }
Sergunb 0:8918a71cdbe9 338
Sergunb 0:8918a71cdbe9 339
Sergunb 0:8918a71cdbe9 340 /**
Sergunb 0:8918a71cdbe9 341 * @brief Create a semaphore object
Sergunb 0:8918a71cdbe9 342 * @param[in] semaphore Pointer to the semaphore object
Sergunb 0:8918a71cdbe9 343 * @param[in] count The maximum count for the semaphore object. This value
Sergunb 0:8918a71cdbe9 344 * must be greater than zero
Sergunb 0:8918a71cdbe9 345 * @return The function returns TRUE if the semaphore was successfully
Sergunb 0:8918a71cdbe9 346 * created. Otherwise, FALSE is returned
Sergunb 0:8918a71cdbe9 347 **/
Sergunb 0:8918a71cdbe9 348
Sergunb 0:8918a71cdbe9 349 bool_t osCreateSemaphore(OsSemaphore *semaphore, uint_t count)
Sergunb 0:8918a71cdbe9 350 {
Sergunb 0:8918a71cdbe9 351 osSemaphoreDef_t semaphoreDef;
Sergunb 0:8918a71cdbe9 352
Sergunb 0:8918a71cdbe9 353 #if defined(osCMSIS_RTX)
Sergunb 0:8918a71cdbe9 354 semaphoreDef.semaphore = semaphore->cb;
Sergunb 0:8918a71cdbe9 355 #else
Sergunb 0:8918a71cdbe9 356 semaphoreDef.dummy = 0;
Sergunb 0:8918a71cdbe9 357 #endif
Sergunb 0:8918a71cdbe9 358
Sergunb 0:8918a71cdbe9 359 //Create a semaphore object
Sergunb 0:8918a71cdbe9 360 semaphore->id = osSemaphoreCreate(&semaphoreDef, count);
Sergunb 0:8918a71cdbe9 361
Sergunb 0:8918a71cdbe9 362 //Check whether the returned semaphore ID is valid
Sergunb 0:8918a71cdbe9 363 if(semaphore->id != NULL)
Sergunb 0:8918a71cdbe9 364 return TRUE;
Sergunb 0:8918a71cdbe9 365 else
Sergunb 0:8918a71cdbe9 366 return FALSE;
Sergunb 0:8918a71cdbe9 367 }
Sergunb 0:8918a71cdbe9 368
Sergunb 0:8918a71cdbe9 369
Sergunb 0:8918a71cdbe9 370 /**
Sergunb 0:8918a71cdbe9 371 * @brief Delete a semaphore object
Sergunb 0:8918a71cdbe9 372 * @param[in] semaphore Pointer to the semaphore object
Sergunb 0:8918a71cdbe9 373 **/
Sergunb 0:8918a71cdbe9 374
Sergunb 0:8918a71cdbe9 375 void osDeleteSemaphore(OsSemaphore *semaphore)
Sergunb 0:8918a71cdbe9 376 {
Sergunb 0:8918a71cdbe9 377 //Make sure the semaphore ID is valid
Sergunb 0:8918a71cdbe9 378 if(semaphore->id != NULL)
Sergunb 0:8918a71cdbe9 379 {
Sergunb 0:8918a71cdbe9 380 //Properly dispose the specified semaphore
Sergunb 0:8918a71cdbe9 381 osSemaphoreDelete(semaphore->id);
Sergunb 0:8918a71cdbe9 382 }
Sergunb 0:8918a71cdbe9 383 }
Sergunb 0:8918a71cdbe9 384
Sergunb 0:8918a71cdbe9 385
Sergunb 0:8918a71cdbe9 386 /**
Sergunb 0:8918a71cdbe9 387 * @brief Wait for the specified semaphore to be available
Sergunb 0:8918a71cdbe9 388 * @param[in] semaphore Pointer to the semaphore object
Sergunb 0:8918a71cdbe9 389 * @param[in] timeout Timeout interval
Sergunb 0:8918a71cdbe9 390 * @return The function returns TRUE if the semaphore is available. FALSE is
Sergunb 0:8918a71cdbe9 391 * returned if the timeout interval elapsed
Sergunb 0:8918a71cdbe9 392 **/
Sergunb 0:8918a71cdbe9 393
Sergunb 0:8918a71cdbe9 394 bool_t osWaitForSemaphore(OsSemaphore *semaphore, systime_t timeout)
Sergunb 0:8918a71cdbe9 395 {
Sergunb 0:8918a71cdbe9 396 int32_t ret;
Sergunb 0:8918a71cdbe9 397
Sergunb 0:8918a71cdbe9 398 //Wait until the semaphore is available or the timeout interval elapses
Sergunb 0:8918a71cdbe9 399 if(timeout == INFINITE_DELAY)
Sergunb 0:8918a71cdbe9 400 {
Sergunb 0:8918a71cdbe9 401 //Infinite timeout period
Sergunb 0:8918a71cdbe9 402 ret = osSemaphoreWait(semaphore->id, osWaitForever);
Sergunb 0:8918a71cdbe9 403 }
Sergunb 0:8918a71cdbe9 404 else
Sergunb 0:8918a71cdbe9 405 {
Sergunb 0:8918a71cdbe9 406 #if defined(osCMSIS_RTX)
Sergunb 0:8918a71cdbe9 407 systime_t n;
Sergunb 0:8918a71cdbe9 408
Sergunb 0:8918a71cdbe9 409 //Loop until the assigned time period has elapsed
Sergunb 0:8918a71cdbe9 410 do
Sergunb 0:8918a71cdbe9 411 {
Sergunb 0:8918a71cdbe9 412 //Limit the timeout value
Sergunb 0:8918a71cdbe9 413 n = MIN(timeout, 10000);
Sergunb 0:8918a71cdbe9 414 //Wait for the specified time interval
Sergunb 0:8918a71cdbe9 415 ret = osSemaphoreWait(semaphore->id, n);
Sergunb 0:8918a71cdbe9 416 //Decrement timeout value
Sergunb 0:8918a71cdbe9 417 timeout -= n;
Sergunb 0:8918a71cdbe9 418
Sergunb 0:8918a71cdbe9 419 //Check timeout value
Sergunb 0:8918a71cdbe9 420 } while(ret == 0 && timeout > 0);
Sergunb 0:8918a71cdbe9 421 #else
Sergunb 0:8918a71cdbe9 422 //Wait for the specified time interval
Sergunb 0:8918a71cdbe9 423 ret = osSemaphoreWait(semaphore->id, timeout);
Sergunb 0:8918a71cdbe9 424 #endif
Sergunb 0:8918a71cdbe9 425 }
Sergunb 0:8918a71cdbe9 426
Sergunb 0:8918a71cdbe9 427 #if defined(osCMSIS_RTX)
Sergunb 0:8918a71cdbe9 428 //Check return value
Sergunb 0:8918a71cdbe9 429 if(ret > 0)
Sergunb 0:8918a71cdbe9 430 return TRUE;
Sergunb 0:8918a71cdbe9 431 else
Sergunb 0:8918a71cdbe9 432 return FALSE;
Sergunb 0:8918a71cdbe9 433 #else
Sergunb 0:8918a71cdbe9 434 //Check return value
Sergunb 0:8918a71cdbe9 435 if(ret == osOK)
Sergunb 0:8918a71cdbe9 436 return TRUE;
Sergunb 0:8918a71cdbe9 437 else
Sergunb 0:8918a71cdbe9 438 return FALSE;
Sergunb 0:8918a71cdbe9 439 #endif
Sergunb 0:8918a71cdbe9 440 }
Sergunb 0:8918a71cdbe9 441
Sergunb 0:8918a71cdbe9 442
Sergunb 0:8918a71cdbe9 443 /**
Sergunb 0:8918a71cdbe9 444 * @brief Release the specified semaphore object
Sergunb 0:8918a71cdbe9 445 * @param[in] semaphore Pointer to the semaphore object
Sergunb 0:8918a71cdbe9 446 **/
Sergunb 0:8918a71cdbe9 447
Sergunb 0:8918a71cdbe9 448 void osReleaseSemaphore(OsSemaphore *semaphore)
Sergunb 0:8918a71cdbe9 449 {
Sergunb 0:8918a71cdbe9 450 //Release the semaphore
Sergunb 0:8918a71cdbe9 451 osSemaphoreRelease(semaphore->id);
Sergunb 0:8918a71cdbe9 452 }
Sergunb 0:8918a71cdbe9 453
Sergunb 0:8918a71cdbe9 454
Sergunb 0:8918a71cdbe9 455 /**
Sergunb 0:8918a71cdbe9 456 * @brief Create a mutex object
Sergunb 0:8918a71cdbe9 457 * @param[in] mutex Pointer to the mutex object
Sergunb 0:8918a71cdbe9 458 * @return The function returns TRUE if the mutex was successfully
Sergunb 0:8918a71cdbe9 459 * created. Otherwise, FALSE is returned
Sergunb 0:8918a71cdbe9 460 **/
Sergunb 0:8918a71cdbe9 461
Sergunb 0:8918a71cdbe9 462 bool_t osCreateMutex(OsMutex *mutex)
Sergunb 0:8918a71cdbe9 463 {
Sergunb 0:8918a71cdbe9 464 osMutexDef_t mutexDef;
Sergunb 0:8918a71cdbe9 465
Sergunb 0:8918a71cdbe9 466 #if defined(osCMSIS_RTX)
Sergunb 0:8918a71cdbe9 467 mutexDef.mutex = mutex->cb;
Sergunb 0:8918a71cdbe9 468 #else
Sergunb 0:8918a71cdbe9 469 mutexDef.dummy = 0;
Sergunb 0:8918a71cdbe9 470 #endif
Sergunb 0:8918a71cdbe9 471
Sergunb 0:8918a71cdbe9 472 //Create a mutex object
Sergunb 0:8918a71cdbe9 473 mutex->id = osMutexCreate(&mutexDef);
Sergunb 0:8918a71cdbe9 474
Sergunb 0:8918a71cdbe9 475 //Check whether the returned mutex ID is valid
Sergunb 0:8918a71cdbe9 476 if(mutex->id != NULL)
Sergunb 0:8918a71cdbe9 477 return TRUE;
Sergunb 0:8918a71cdbe9 478 else
Sergunb 0:8918a71cdbe9 479 return FALSE;
Sergunb 0:8918a71cdbe9 480 }
Sergunb 0:8918a71cdbe9 481
Sergunb 0:8918a71cdbe9 482
Sergunb 0:8918a71cdbe9 483 /**
Sergunb 0:8918a71cdbe9 484 * @brief Delete a mutex object
Sergunb 0:8918a71cdbe9 485 * @param[in] mutex Pointer to the mutex object
Sergunb 0:8918a71cdbe9 486 **/
Sergunb 0:8918a71cdbe9 487
Sergunb 0:8918a71cdbe9 488 void osDeleteMutex(OsMutex *mutex)
Sergunb 0:8918a71cdbe9 489 {
Sergunb 0:8918a71cdbe9 490 //Make sure the mutex ID is valid
Sergunb 0:8918a71cdbe9 491 if(mutex->id != NULL)
Sergunb 0:8918a71cdbe9 492 {
Sergunb 0:8918a71cdbe9 493 //Properly dispose the specified mutex
Sergunb 0:8918a71cdbe9 494 osMutexDelete(mutex->id);
Sergunb 0:8918a71cdbe9 495 }
Sergunb 0:8918a71cdbe9 496 }
Sergunb 0:8918a71cdbe9 497
Sergunb 0:8918a71cdbe9 498
Sergunb 0:8918a71cdbe9 499 /**
Sergunb 0:8918a71cdbe9 500 * @brief Acquire ownership of the specified mutex object
Sergunb 0:8918a71cdbe9 501 * @param[in] mutex Pointer to the mutex object
Sergunb 0:8918a71cdbe9 502 **/
Sergunb 0:8918a71cdbe9 503
Sergunb 0:8918a71cdbe9 504 void osAcquireMutex(OsMutex *mutex)
Sergunb 0:8918a71cdbe9 505 {
Sergunb 0:8918a71cdbe9 506 //Obtain ownership of the mutex object
Sergunb 0:8918a71cdbe9 507 osMutexWait(mutex->id, osWaitForever);
Sergunb 0:8918a71cdbe9 508 }
Sergunb 0:8918a71cdbe9 509
Sergunb 0:8918a71cdbe9 510
Sergunb 0:8918a71cdbe9 511 /**
Sergunb 0:8918a71cdbe9 512 * @brief Release ownership of the specified mutex object
Sergunb 0:8918a71cdbe9 513 * @param[in] mutex Pointer to the mutex object
Sergunb 0:8918a71cdbe9 514 **/
Sergunb 0:8918a71cdbe9 515
Sergunb 0:8918a71cdbe9 516 void osReleaseMutex(OsMutex *mutex)
Sergunb 0:8918a71cdbe9 517 {
Sergunb 0:8918a71cdbe9 518 //Release ownership of the mutex object
Sergunb 0:8918a71cdbe9 519 osMutexRelease(mutex->id);
Sergunb 0:8918a71cdbe9 520 }
Sergunb 0:8918a71cdbe9 521
Sergunb 0:8918a71cdbe9 522
Sergunb 0:8918a71cdbe9 523 /**
Sergunb 0:8918a71cdbe9 524 * @brief Retrieve system time
Sergunb 0:8918a71cdbe9 525 * @return Number of milliseconds elapsed since the system was last started
Sergunb 0:8918a71cdbe9 526 **/
Sergunb 0:8918a71cdbe9 527
Sergunb 0:8918a71cdbe9 528 systime_t osGetSystemTime(void)
Sergunb 0:8918a71cdbe9 529 {
Sergunb 0:8918a71cdbe9 530 systime_t time;
Sergunb 0:8918a71cdbe9 531
Sergunb 0:8918a71cdbe9 532 #if defined(osCMSIS_RTX)
Sergunb 0:8918a71cdbe9 533 //Forward function declaration
Sergunb 0:8918a71cdbe9 534 extern uint32_t rt_time_get(void);
Sergunb 0:8918a71cdbe9 535
Sergunb 0:8918a71cdbe9 536 //Get current tick count
Sergunb 0:8918a71cdbe9 537 time = rt_time_get();
Sergunb 0:8918a71cdbe9 538 #else
Sergunb 0:8918a71cdbe9 539 //Get current tick count
Sergunb 0:8918a71cdbe9 540 time = osKernelSysTick();
Sergunb 0:8918a71cdbe9 541 #endif
Sergunb 0:8918a71cdbe9 542
Sergunb 0:8918a71cdbe9 543 //Convert system ticks to milliseconds
Sergunb 0:8918a71cdbe9 544 return OS_SYSTICKS_TO_MS(time);
Sergunb 0:8918a71cdbe9 545 }
Sergunb 0:8918a71cdbe9 546
Sergunb 0:8918a71cdbe9 547
Sergunb 0:8918a71cdbe9 548 /**
Sergunb 0:8918a71cdbe9 549 * @brief Allocate a memory block
Sergunb 0:8918a71cdbe9 550 * @param[in] size Bytes to allocate
Sergunb 0:8918a71cdbe9 551 * @return A pointer to the allocated memory block or NULL if
Sergunb 0:8918a71cdbe9 552 * there is insufficient memory available
Sergunb 0:8918a71cdbe9 553 **/
Sergunb 0:8918a71cdbe9 554
Sergunb 0:8918a71cdbe9 555 void *osAllocMem(size_t size)
Sergunb 0:8918a71cdbe9 556 {
Sergunb 0:8918a71cdbe9 557 void *p;
Sergunb 0:8918a71cdbe9 558
Sergunb 0:8918a71cdbe9 559 //Enter critical section
Sergunb 0:8918a71cdbe9 560 osSuspendAllTasks();
Sergunb 0:8918a71cdbe9 561 //Allocate a memory block
Sergunb 0:8918a71cdbe9 562 p = malloc(size);
Sergunb 0:8918a71cdbe9 563 //Leave critical section
Sergunb 0:8918a71cdbe9 564 osResumeAllTasks();
Sergunb 0:8918a71cdbe9 565
Sergunb 0:8918a71cdbe9 566 //Debug message
Sergunb 0:8918a71cdbe9 567 TRACE_DEBUG("Allocating %u bytes at 0x%08X\r\n", size, (uint_t) p);
Sergunb 0:8918a71cdbe9 568
Sergunb 0:8918a71cdbe9 569 //Return a pointer to the newly allocated memory block
Sergunb 0:8918a71cdbe9 570 return p;
Sergunb 0:8918a71cdbe9 571 }
Sergunb 0:8918a71cdbe9 572
Sergunb 0:8918a71cdbe9 573
Sergunb 0:8918a71cdbe9 574 /**
Sergunb 0:8918a71cdbe9 575 * @brief Release a previously allocated memory block
Sergunb 0:8918a71cdbe9 576 * @param[in] p Previously allocated memory block to be freed
Sergunb 0:8918a71cdbe9 577 **/
Sergunb 0:8918a71cdbe9 578
Sergunb 0:8918a71cdbe9 579 void osFreeMem(void *p)
Sergunb 0:8918a71cdbe9 580 {
Sergunb 0:8918a71cdbe9 581 //Make sure the pointer is valid
Sergunb 0:8918a71cdbe9 582 if(p != NULL)
Sergunb 0:8918a71cdbe9 583 {
Sergunb 0:8918a71cdbe9 584 //Debug message
Sergunb 0:8918a71cdbe9 585 TRACE_DEBUG("Freeing memory at 0x%08X\r\n", (uint_t) p);
Sergunb 0:8918a71cdbe9 586
Sergunb 0:8918a71cdbe9 587 //Enter critical section
Sergunb 0:8918a71cdbe9 588 osSuspendAllTasks();
Sergunb 0:8918a71cdbe9 589 //Free memory block
Sergunb 0:8918a71cdbe9 590 free(p);
Sergunb 0:8918a71cdbe9 591 //Leave critical section
Sergunb 0:8918a71cdbe9 592 osResumeAllTasks();
Sergunb 0:8918a71cdbe9 593 }
Sergunb 0:8918a71cdbe9 594 }
Sergunb 0:8918a71cdbe9 595