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_freertos.c
Sergunb 0:8918a71cdbe9 3 * @brief RTOS abstraction layer (FreeRTOS)
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_freertos.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 }
Sergunb 0:8918a71cdbe9 45
Sergunb 0:8918a71cdbe9 46
Sergunb 0:8918a71cdbe9 47 /**
Sergunb 0:8918a71cdbe9 48 * @brief Start kernel
Sergunb 0:8918a71cdbe9 49 **/
Sergunb 0:8918a71cdbe9 50
Sergunb 0:8918a71cdbe9 51 void osStartKernel(void)
Sergunb 0:8918a71cdbe9 52 {
Sergunb 0:8918a71cdbe9 53 //Start the scheduler
Sergunb 0:8918a71cdbe9 54 vTaskStartScheduler();
Sergunb 0:8918a71cdbe9 55 }
Sergunb 0:8918a71cdbe9 56
Sergunb 0:8918a71cdbe9 57
Sergunb 0:8918a71cdbe9 58 /**
Sergunb 0:8918a71cdbe9 59 * @brief Create a new task
Sergunb 0:8918a71cdbe9 60 * @param[in] name A name identifying the task
Sergunb 0:8918a71cdbe9 61 * @param[in] taskCode Pointer to the task entry function
Sergunb 0:8918a71cdbe9 62 * @param[in] params A pointer to a variable to be passed to the task
Sergunb 0:8918a71cdbe9 63 * @param[in] stackSize The initial size of the stack, in words
Sergunb 0:8918a71cdbe9 64 * @param[in] priority The priority at which the task should run
Sergunb 0:8918a71cdbe9 65 * @return If the function succeeds, the return value is a pointer to the
Sergunb 0:8918a71cdbe9 66 * new task. If the function fails, the return value is NULL
Sergunb 0:8918a71cdbe9 67 **/
Sergunb 0:8918a71cdbe9 68
Sergunb 0:8918a71cdbe9 69 OsTask *osCreateTask(const char_t *name, OsTaskCode taskCode,
Sergunb 0:8918a71cdbe9 70 void *params, size_t stackSize, int_t priority)
Sergunb 0:8918a71cdbe9 71 {
Sergunb 0:8918a71cdbe9 72 portBASE_TYPE status;
Sergunb 0:8918a71cdbe9 73 xTaskHandle task = NULL;
Sergunb 0:8918a71cdbe9 74
Sergunb 0:8918a71cdbe9 75 //Create a new task
Sergunb 0:8918a71cdbe9 76 status = xTaskCreate((pdTASK_CODE) taskCode,
Sergunb 0:8918a71cdbe9 77 name, stackSize, params, priority, &task);
Sergunb 0:8918a71cdbe9 78
Sergunb 0:8918a71cdbe9 79 //Check whether the task was successfully created
Sergunb 0:8918a71cdbe9 80 if(status == pdPASS)
Sergunb 0:8918a71cdbe9 81 return task;
Sergunb 0:8918a71cdbe9 82 else
Sergunb 0:8918a71cdbe9 83 return NULL;
Sergunb 0:8918a71cdbe9 84 }
Sergunb 0:8918a71cdbe9 85
Sergunb 0:8918a71cdbe9 86
Sergunb 0:8918a71cdbe9 87 /**
Sergunb 0:8918a71cdbe9 88 * @brief Delete a task
Sergunb 0:8918a71cdbe9 89 * @param[in] task Pointer to the task to be deleted
Sergunb 0:8918a71cdbe9 90 **/
Sergunb 0:8918a71cdbe9 91
Sergunb 0:8918a71cdbe9 92 void osDeleteTask(OsTask *task)
Sergunb 0:8918a71cdbe9 93 {
Sergunb 0:8918a71cdbe9 94 //Delete the specified task
Sergunb 0:8918a71cdbe9 95 vTaskDelete((xTaskHandle) task);
Sergunb 0:8918a71cdbe9 96 }
Sergunb 0:8918a71cdbe9 97
Sergunb 0:8918a71cdbe9 98
Sergunb 0:8918a71cdbe9 99 /**
Sergunb 0:8918a71cdbe9 100 * @brief Delay routine
Sergunb 0:8918a71cdbe9 101 * @param[in] delay Amount of time for which the calling task should block
Sergunb 0:8918a71cdbe9 102 **/
Sergunb 0:8918a71cdbe9 103
Sergunb 0:8918a71cdbe9 104 void osDelayTask(systime_t delay)
Sergunb 0:8918a71cdbe9 105 {
Sergunb 0:8918a71cdbe9 106 //Delay the task for the specified duration
Sergunb 0:8918a71cdbe9 107 vTaskDelay(OS_MS_TO_SYSTICKS(delay));
Sergunb 0:8918a71cdbe9 108 }
Sergunb 0:8918a71cdbe9 109
Sergunb 0:8918a71cdbe9 110
Sergunb 0:8918a71cdbe9 111 /**
Sergunb 0:8918a71cdbe9 112 * @brief Yield control to the next task
Sergunb 0:8918a71cdbe9 113 **/
Sergunb 0:8918a71cdbe9 114
Sergunb 0:8918a71cdbe9 115 void osSwitchTask(void)
Sergunb 0:8918a71cdbe9 116 {
Sergunb 0:8918a71cdbe9 117 //Force a context switch
Sergunb 0:8918a71cdbe9 118 taskYIELD();
Sergunb 0:8918a71cdbe9 119 }
Sergunb 0:8918a71cdbe9 120
Sergunb 0:8918a71cdbe9 121
Sergunb 0:8918a71cdbe9 122 /**
Sergunb 0:8918a71cdbe9 123 * @brief Suspend scheduler activity
Sergunb 0:8918a71cdbe9 124 **/
Sergunb 0:8918a71cdbe9 125
Sergunb 0:8918a71cdbe9 126 void osSuspendAllTasks(void)
Sergunb 0:8918a71cdbe9 127 {
Sergunb 0:8918a71cdbe9 128 //Make sure the operating system is running
Sergunb 0:8918a71cdbe9 129 if(xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
Sergunb 0:8918a71cdbe9 130 {
Sergunb 0:8918a71cdbe9 131 //Suspend all tasks
Sergunb 0:8918a71cdbe9 132 vTaskSuspendAll();
Sergunb 0:8918a71cdbe9 133 }
Sergunb 0:8918a71cdbe9 134 }
Sergunb 0:8918a71cdbe9 135
Sergunb 0:8918a71cdbe9 136
Sergunb 0:8918a71cdbe9 137 /**
Sergunb 0:8918a71cdbe9 138 * @brief Resume scheduler activity
Sergunb 0:8918a71cdbe9 139 **/
Sergunb 0:8918a71cdbe9 140
Sergunb 0:8918a71cdbe9 141 void osResumeAllTasks(void)
Sergunb 0:8918a71cdbe9 142 {
Sergunb 0:8918a71cdbe9 143 //Make sure the operating system is running
Sergunb 0:8918a71cdbe9 144 if(xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
Sergunb 0:8918a71cdbe9 145 {
Sergunb 0:8918a71cdbe9 146 //Resume all tasks
Sergunb 0:8918a71cdbe9 147 xTaskResumeAll();
Sergunb 0:8918a71cdbe9 148 }
Sergunb 0:8918a71cdbe9 149 }
Sergunb 0:8918a71cdbe9 150
Sergunb 0:8918a71cdbe9 151
Sergunb 0:8918a71cdbe9 152 /**
Sergunb 0:8918a71cdbe9 153 * @brief Create an event object
Sergunb 0:8918a71cdbe9 154 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 155 * @return The function returns TRUE if the event object was successfully
Sergunb 0:8918a71cdbe9 156 * created. Otherwise, FALSE is returned
Sergunb 0:8918a71cdbe9 157 **/
Sergunb 0:8918a71cdbe9 158
Sergunb 0:8918a71cdbe9 159 bool_t osCreateEvent(OsEvent *event)
Sergunb 0:8918a71cdbe9 160 {
Sergunb 0:8918a71cdbe9 161 //Create a binary semaphore
Sergunb 0:8918a71cdbe9 162 vSemaphoreCreateBinary(event->handle);
Sergunb 0:8918a71cdbe9 163
Sergunb 0:8918a71cdbe9 164 //Check whether the returned handle is valid
Sergunb 0:8918a71cdbe9 165 if(event->handle != NULL)
Sergunb 0:8918a71cdbe9 166 {
Sergunb 0:8918a71cdbe9 167 //Force the event to the nonsignaled state
Sergunb 0:8918a71cdbe9 168 xSemaphoreTake(event->handle, 0);
Sergunb 0:8918a71cdbe9 169 //Event successfully created
Sergunb 0:8918a71cdbe9 170 return TRUE;
Sergunb 0:8918a71cdbe9 171 }
Sergunb 0:8918a71cdbe9 172 else
Sergunb 0:8918a71cdbe9 173 {
Sergunb 0:8918a71cdbe9 174 //Failed to create event object
Sergunb 0:8918a71cdbe9 175 return FALSE;
Sergunb 0:8918a71cdbe9 176 }
Sergunb 0:8918a71cdbe9 177 }
Sergunb 0:8918a71cdbe9 178
Sergunb 0:8918a71cdbe9 179
Sergunb 0:8918a71cdbe9 180 /**
Sergunb 0:8918a71cdbe9 181 * @brief Delete an event object
Sergunb 0:8918a71cdbe9 182 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 183 **/
Sergunb 0:8918a71cdbe9 184
Sergunb 0:8918a71cdbe9 185 void osDeleteEvent(OsEvent *event)
Sergunb 0:8918a71cdbe9 186 {
Sergunb 0:8918a71cdbe9 187 //Make sure the handle is valid
Sergunb 0:8918a71cdbe9 188 if(event->handle != NULL)
Sergunb 0:8918a71cdbe9 189 {
Sergunb 0:8918a71cdbe9 190 //Properly dispose the event object
Sergunb 0:8918a71cdbe9 191 vSemaphoreDelete(event->handle);
Sergunb 0:8918a71cdbe9 192 }
Sergunb 0:8918a71cdbe9 193 }
Sergunb 0:8918a71cdbe9 194
Sergunb 0:8918a71cdbe9 195
Sergunb 0:8918a71cdbe9 196 /**
Sergunb 0:8918a71cdbe9 197 * @brief Set the specified event object to the signaled state
Sergunb 0:8918a71cdbe9 198 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 199 **/
Sergunb 0:8918a71cdbe9 200
Sergunb 0:8918a71cdbe9 201 void osSetEvent(OsEvent *event)
Sergunb 0:8918a71cdbe9 202 {
Sergunb 0:8918a71cdbe9 203 //Set the specified event to the signaled state
Sergunb 0:8918a71cdbe9 204 xSemaphoreGive(event->handle);
Sergunb 0:8918a71cdbe9 205 }
Sergunb 0:8918a71cdbe9 206
Sergunb 0:8918a71cdbe9 207
Sergunb 0:8918a71cdbe9 208 /**
Sergunb 0:8918a71cdbe9 209 * @brief Set the specified event object to the nonsignaled state
Sergunb 0:8918a71cdbe9 210 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 211 **/
Sergunb 0:8918a71cdbe9 212
Sergunb 0:8918a71cdbe9 213 void osResetEvent(OsEvent *event)
Sergunb 0:8918a71cdbe9 214 {
Sergunb 0:8918a71cdbe9 215 //Force the specified event to the nonsignaled state
Sergunb 0:8918a71cdbe9 216 xSemaphoreTake(event->handle, 0);
Sergunb 0:8918a71cdbe9 217 }
Sergunb 0:8918a71cdbe9 218
Sergunb 0:8918a71cdbe9 219
Sergunb 0:8918a71cdbe9 220 /**
Sergunb 0:8918a71cdbe9 221 * @brief Wait until the specified event is in the signaled state
Sergunb 0:8918a71cdbe9 222 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 223 * @param[in] timeout Timeout interval
Sergunb 0:8918a71cdbe9 224 * @return The function returns TRUE if the state of the specified object is
Sergunb 0:8918a71cdbe9 225 * signaled. FALSE is returned if the timeout interval elapsed
Sergunb 0:8918a71cdbe9 226 **/
Sergunb 0:8918a71cdbe9 227
Sergunb 0:8918a71cdbe9 228 bool_t osWaitForEvent(OsEvent *event, systime_t timeout)
Sergunb 0:8918a71cdbe9 229 {
Sergunb 0:8918a71cdbe9 230 portBASE_TYPE ret;
Sergunb 0:8918a71cdbe9 231
Sergunb 0:8918a71cdbe9 232 //Wait until the specified event is in the signaled state
Sergunb 0:8918a71cdbe9 233 if(timeout == INFINITE_DELAY)
Sergunb 0:8918a71cdbe9 234 {
Sergunb 0:8918a71cdbe9 235 //Infinite timeout period
Sergunb 0:8918a71cdbe9 236 ret = xSemaphoreTake(event->handle, portMAX_DELAY);
Sergunb 0:8918a71cdbe9 237 }
Sergunb 0:8918a71cdbe9 238 else
Sergunb 0:8918a71cdbe9 239 {
Sergunb 0:8918a71cdbe9 240 //Wait for the specified time interval
Sergunb 0:8918a71cdbe9 241 ret = xSemaphoreTake(event->handle, OS_MS_TO_SYSTICKS(timeout));
Sergunb 0:8918a71cdbe9 242 }
Sergunb 0:8918a71cdbe9 243
Sergunb 0:8918a71cdbe9 244 //The return value tells whether the event is set
Sergunb 0:8918a71cdbe9 245 return ret;
Sergunb 0:8918a71cdbe9 246 }
Sergunb 0:8918a71cdbe9 247
Sergunb 0:8918a71cdbe9 248
Sergunb 0:8918a71cdbe9 249 /**
Sergunb 0:8918a71cdbe9 250 * @brief Set an event object to the signaled state from an interrupt service routine
Sergunb 0:8918a71cdbe9 251 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 252 * @return TRUE if setting the event to signaled state caused a task to unblock
Sergunb 0:8918a71cdbe9 253 * and the unblocked task has a priority higher than the currently running task
Sergunb 0:8918a71cdbe9 254 **/
Sergunb 0:8918a71cdbe9 255
Sergunb 0:8918a71cdbe9 256 bool_t osSetEventFromIsr(OsEvent *event)
Sergunb 0:8918a71cdbe9 257 {
Sergunb 0:8918a71cdbe9 258 portBASE_TYPE flag = FALSE;
Sergunb 0:8918a71cdbe9 259
Sergunb 0:8918a71cdbe9 260 //Set the specified event to the signaled state
Sergunb 0:8918a71cdbe9 261 xSemaphoreGiveFromISR(event->handle, &flag);
Sergunb 0:8918a71cdbe9 262
Sergunb 0:8918a71cdbe9 263 //A higher priority task has been woken?
Sergunb 0:8918a71cdbe9 264 return flag;
Sergunb 0:8918a71cdbe9 265 }
Sergunb 0:8918a71cdbe9 266
Sergunb 0:8918a71cdbe9 267
Sergunb 0:8918a71cdbe9 268 /**
Sergunb 0:8918a71cdbe9 269 * @brief Create a semaphore object
Sergunb 0:8918a71cdbe9 270 * @param[in] semaphore Pointer to the semaphore object
Sergunb 0:8918a71cdbe9 271 * @param[in] count The maximum count for the semaphore object. This value
Sergunb 0:8918a71cdbe9 272 * must be greater than zero
Sergunb 0:8918a71cdbe9 273 * @return The function returns TRUE if the semaphore was successfully
Sergunb 0:8918a71cdbe9 274 * created. Otherwise, FALSE is returned
Sergunb 0:8918a71cdbe9 275 **/
Sergunb 0:8918a71cdbe9 276
Sergunb 0:8918a71cdbe9 277 bool_t osCreateSemaphore(OsSemaphore *semaphore, uint_t count)
Sergunb 0:8918a71cdbe9 278 {
Sergunb 0:8918a71cdbe9 279 //Create a semaphore
Sergunb 0:8918a71cdbe9 280 semaphore->handle = xSemaphoreCreateCounting(count, count);
Sergunb 0:8918a71cdbe9 281
Sergunb 0:8918a71cdbe9 282 //Check whether the returned handle is valid
Sergunb 0:8918a71cdbe9 283 if(semaphore->handle != NULL)
Sergunb 0:8918a71cdbe9 284 return TRUE;
Sergunb 0:8918a71cdbe9 285 else
Sergunb 0:8918a71cdbe9 286 return FALSE;
Sergunb 0:8918a71cdbe9 287 }
Sergunb 0:8918a71cdbe9 288
Sergunb 0:8918a71cdbe9 289
Sergunb 0:8918a71cdbe9 290 /**
Sergunb 0:8918a71cdbe9 291 * @brief Delete a semaphore object
Sergunb 0:8918a71cdbe9 292 * @param[in] semaphore Pointer to the semaphore object
Sergunb 0:8918a71cdbe9 293 **/
Sergunb 0:8918a71cdbe9 294
Sergunb 0:8918a71cdbe9 295 void osDeleteSemaphore(OsSemaphore *semaphore)
Sergunb 0:8918a71cdbe9 296 {
Sergunb 0:8918a71cdbe9 297 //Make sure the handle is valid
Sergunb 0:8918a71cdbe9 298 if(semaphore->handle != NULL)
Sergunb 0:8918a71cdbe9 299 {
Sergunb 0:8918a71cdbe9 300 //Properly dispose the specified semaphore
Sergunb 0:8918a71cdbe9 301 vSemaphoreDelete(semaphore->handle);
Sergunb 0:8918a71cdbe9 302 }
Sergunb 0:8918a71cdbe9 303 }
Sergunb 0:8918a71cdbe9 304
Sergunb 0:8918a71cdbe9 305
Sergunb 0:8918a71cdbe9 306 /**
Sergunb 0:8918a71cdbe9 307 * @brief Wait for the specified semaphore to be available
Sergunb 0:8918a71cdbe9 308 * @param[in] semaphore Pointer to the semaphore object
Sergunb 0:8918a71cdbe9 309 * @param[in] timeout Timeout interval
Sergunb 0:8918a71cdbe9 310 * @return The function returns TRUE if the semaphore is available. FALSE is
Sergunb 0:8918a71cdbe9 311 * returned if the timeout interval elapsed
Sergunb 0:8918a71cdbe9 312 **/
Sergunb 0:8918a71cdbe9 313
Sergunb 0:8918a71cdbe9 314 bool_t osWaitForSemaphore(OsSemaphore *semaphore, systime_t timeout)
Sergunb 0:8918a71cdbe9 315 {
Sergunb 0:8918a71cdbe9 316 portBASE_TYPE ret;
Sergunb 0:8918a71cdbe9 317
Sergunb 0:8918a71cdbe9 318 //Wait until the specified semaphore becomes available
Sergunb 0:8918a71cdbe9 319 if(timeout == INFINITE_DELAY)
Sergunb 0:8918a71cdbe9 320 {
Sergunb 0:8918a71cdbe9 321 //Infinite timeout period
Sergunb 0:8918a71cdbe9 322 ret = xSemaphoreTake(semaphore->handle, portMAX_DELAY);
Sergunb 0:8918a71cdbe9 323 }
Sergunb 0:8918a71cdbe9 324 else
Sergunb 0:8918a71cdbe9 325 {
Sergunb 0:8918a71cdbe9 326 //Wait for the specified time interval
Sergunb 0:8918a71cdbe9 327 ret = xSemaphoreTake(semaphore->handle, OS_MS_TO_SYSTICKS(timeout));
Sergunb 0:8918a71cdbe9 328 }
Sergunb 0:8918a71cdbe9 329
Sergunb 0:8918a71cdbe9 330 //The return value tells whether the semaphore is available
Sergunb 0:8918a71cdbe9 331 return ret;
Sergunb 0:8918a71cdbe9 332 }
Sergunb 0:8918a71cdbe9 333
Sergunb 0:8918a71cdbe9 334
Sergunb 0:8918a71cdbe9 335 /**
Sergunb 0:8918a71cdbe9 336 * @brief Release the specified semaphore object
Sergunb 0:8918a71cdbe9 337 * @param[in] semaphore Pointer to the semaphore object
Sergunb 0:8918a71cdbe9 338 **/
Sergunb 0:8918a71cdbe9 339
Sergunb 0:8918a71cdbe9 340 void osReleaseSemaphore(OsSemaphore *semaphore)
Sergunb 0:8918a71cdbe9 341 {
Sergunb 0:8918a71cdbe9 342 //Release the semaphore
Sergunb 0:8918a71cdbe9 343 xSemaphoreGive(semaphore->handle);
Sergunb 0:8918a71cdbe9 344 }
Sergunb 0:8918a71cdbe9 345
Sergunb 0:8918a71cdbe9 346
Sergunb 0:8918a71cdbe9 347 /**
Sergunb 0:8918a71cdbe9 348 * @brief Create a mutex object
Sergunb 0:8918a71cdbe9 349 * @param[in] mutex Pointer to the mutex object
Sergunb 0:8918a71cdbe9 350 * @return The function returns TRUE if the mutex was successfully
Sergunb 0:8918a71cdbe9 351 * created. Otherwise, FALSE is returned
Sergunb 0:8918a71cdbe9 352 **/
Sergunb 0:8918a71cdbe9 353
Sergunb 0:8918a71cdbe9 354 bool_t osCreateMutex(OsMutex *mutex)
Sergunb 0:8918a71cdbe9 355 {
Sergunb 0:8918a71cdbe9 356 //Create a mutex object
Sergunb 0:8918a71cdbe9 357 mutex->handle = xSemaphoreCreateMutex();
Sergunb 0:8918a71cdbe9 358
Sergunb 0:8918a71cdbe9 359 //Check whether the returned handle is valid
Sergunb 0:8918a71cdbe9 360 if(mutex->handle != NULL)
Sergunb 0:8918a71cdbe9 361 return TRUE;
Sergunb 0:8918a71cdbe9 362 else
Sergunb 0:8918a71cdbe9 363 return FALSE;
Sergunb 0:8918a71cdbe9 364 }
Sergunb 0:8918a71cdbe9 365
Sergunb 0:8918a71cdbe9 366
Sergunb 0:8918a71cdbe9 367 /**
Sergunb 0:8918a71cdbe9 368 * @brief Delete a mutex object
Sergunb 0:8918a71cdbe9 369 * @param[in] mutex Pointer to the mutex object
Sergunb 0:8918a71cdbe9 370 **/
Sergunb 0:8918a71cdbe9 371
Sergunb 0:8918a71cdbe9 372 void osDeleteMutex(OsMutex *mutex)
Sergunb 0:8918a71cdbe9 373 {
Sergunb 0:8918a71cdbe9 374 //Make sure the handle is valid
Sergunb 0:8918a71cdbe9 375 if(mutex->handle != NULL)
Sergunb 0:8918a71cdbe9 376 {
Sergunb 0:8918a71cdbe9 377 //Properly dispose the specified mutex
Sergunb 0:8918a71cdbe9 378 vSemaphoreDelete(mutex->handle);
Sergunb 0:8918a71cdbe9 379 }
Sergunb 0:8918a71cdbe9 380 }
Sergunb 0:8918a71cdbe9 381
Sergunb 0:8918a71cdbe9 382
Sergunb 0:8918a71cdbe9 383 /**
Sergunb 0:8918a71cdbe9 384 * @brief Acquire ownership of the specified mutex object
Sergunb 0:8918a71cdbe9 385 * @param[in] mutex Pointer to the mutex object
Sergunb 0:8918a71cdbe9 386 **/
Sergunb 0:8918a71cdbe9 387
Sergunb 0:8918a71cdbe9 388 void osAcquireMutex(OsMutex *mutex)
Sergunb 0:8918a71cdbe9 389 {
Sergunb 0:8918a71cdbe9 390 //Obtain ownership of the mutex object
Sergunb 0:8918a71cdbe9 391 xSemaphoreTake(mutex->handle, portMAX_DELAY);
Sergunb 0:8918a71cdbe9 392 }
Sergunb 0:8918a71cdbe9 393
Sergunb 0:8918a71cdbe9 394
Sergunb 0:8918a71cdbe9 395 /**
Sergunb 0:8918a71cdbe9 396 * @brief Release ownership of the specified mutex object
Sergunb 0:8918a71cdbe9 397 * @param[in] mutex Pointer to the mutex object
Sergunb 0:8918a71cdbe9 398 **/
Sergunb 0:8918a71cdbe9 399
Sergunb 0:8918a71cdbe9 400 void osReleaseMutex(OsMutex *mutex)
Sergunb 0:8918a71cdbe9 401 {
Sergunb 0:8918a71cdbe9 402 //Release ownership of the mutex object
Sergunb 0:8918a71cdbe9 403 xSemaphoreGive(mutex->handle);
Sergunb 0:8918a71cdbe9 404 }
Sergunb 0:8918a71cdbe9 405
Sergunb 0:8918a71cdbe9 406
Sergunb 0:8918a71cdbe9 407 /**
Sergunb 0:8918a71cdbe9 408 * @brief Retrieve system time
Sergunb 0:8918a71cdbe9 409 * @return Number of milliseconds elapsed since the system was last started
Sergunb 0:8918a71cdbe9 410 **/
Sergunb 0:8918a71cdbe9 411
Sergunb 0:8918a71cdbe9 412 systime_t osGetSystemTime(void)
Sergunb 0:8918a71cdbe9 413 {
Sergunb 0:8918a71cdbe9 414 systime_t time;
Sergunb 0:8918a71cdbe9 415
Sergunb 0:8918a71cdbe9 416 //Get current tick count
Sergunb 0:8918a71cdbe9 417 time = xTaskGetTickCount();
Sergunb 0:8918a71cdbe9 418
Sergunb 0:8918a71cdbe9 419 //Convert system ticks to milliseconds
Sergunb 0:8918a71cdbe9 420 return OS_SYSTICKS_TO_MS(time);
Sergunb 0:8918a71cdbe9 421 }
Sergunb 0:8918a71cdbe9 422
Sergunb 0:8918a71cdbe9 423
Sergunb 0:8918a71cdbe9 424 /**
Sergunb 0:8918a71cdbe9 425 * @brief Allocate a memory block
Sergunb 0:8918a71cdbe9 426 * @param[in] size Bytes to allocate
Sergunb 0:8918a71cdbe9 427 * @return A pointer to the allocated memory block or NULL if
Sergunb 0:8918a71cdbe9 428 * there is insufficient memory available
Sergunb 0:8918a71cdbe9 429 **/
Sergunb 0:8918a71cdbe9 430
Sergunb 0:8918a71cdbe9 431 void *osAllocMem(size_t size)
Sergunb 0:8918a71cdbe9 432 {
Sergunb 0:8918a71cdbe9 433 void *p;
Sergunb 0:8918a71cdbe9 434
Sergunb 0:8918a71cdbe9 435 //Allocate a memory block
Sergunb 0:8918a71cdbe9 436 p = pvPortMalloc(size);
Sergunb 0:8918a71cdbe9 437
Sergunb 0:8918a71cdbe9 438 //Debug message
Sergunb 0:8918a71cdbe9 439 TRACE_DEBUG("Allocating %" PRIuSIZE " bytes at 0x%08" PRIXPTR "\r\n", size, (uintptr_t) p);
Sergunb 0:8918a71cdbe9 440
Sergunb 0:8918a71cdbe9 441 //Return a pointer to the newly allocated memory block
Sergunb 0:8918a71cdbe9 442 return p;
Sergunb 0:8918a71cdbe9 443 }
Sergunb 0:8918a71cdbe9 444
Sergunb 0:8918a71cdbe9 445
Sergunb 0:8918a71cdbe9 446 /**
Sergunb 0:8918a71cdbe9 447 * @brief Release a previously allocated memory block
Sergunb 0:8918a71cdbe9 448 * @param[in] p Previously allocated memory block to be freed
Sergunb 0:8918a71cdbe9 449 **/
Sergunb 0:8918a71cdbe9 450
Sergunb 0:8918a71cdbe9 451 void osFreeMem(void *p)
Sergunb 0:8918a71cdbe9 452 {
Sergunb 0:8918a71cdbe9 453 //Make sure the pointer is valid
Sergunb 0:8918a71cdbe9 454 if(p != NULL)
Sergunb 0:8918a71cdbe9 455 {
Sergunb 0:8918a71cdbe9 456 //Debug message
Sergunb 0:8918a71cdbe9 457 TRACE_DEBUG("Freeing memory at 0x%08" PRIXPTR "\r\n", (uintptr_t) p);
Sergunb 0:8918a71cdbe9 458
Sergunb 0:8918a71cdbe9 459 //Free memory block
Sergunb 0:8918a71cdbe9 460 vPortFree(p);
Sergunb 0:8918a71cdbe9 461 }
Sergunb 0:8918a71cdbe9 462 }
Sergunb 0:8918a71cdbe9 463
Sergunb 0:8918a71cdbe9 464
Sergunb 0:8918a71cdbe9 465 /**
Sergunb 0:8918a71cdbe9 466 * @brief FreeRTOS stack overflow hook
Sergunb 0:8918a71cdbe9 467 **/
Sergunb 0:8918a71cdbe9 468
Sergunb 0:8918a71cdbe9 469 void vApplicationStackOverflowHook(xTaskHandle pxTask, char *pcTaskName)
Sergunb 0:8918a71cdbe9 470 {
Sergunb 0:8918a71cdbe9 471 (void) pcTaskName;
Sergunb 0:8918a71cdbe9 472 (void) pxTask;
Sergunb 0:8918a71cdbe9 473
Sergunb 0:8918a71cdbe9 474 taskDISABLE_INTERRUPTS();
Sergunb 0:8918a71cdbe9 475 while(1);
Sergunb 0:8918a71cdbe9 476 }
Sergunb 0:8918a71cdbe9 477
Sergunb 0:8918a71cdbe9 478
Sergunb 0:8918a71cdbe9 479 /**
Sergunb 0:8918a71cdbe9 480 * @brief Trap FreeRTOS errors
Sergunb 0:8918a71cdbe9 481 **/
Sergunb 0:8918a71cdbe9 482
Sergunb 0:8918a71cdbe9 483 void vAssertCalled(const char *pcFile, unsigned long ulLine)
Sergunb 0:8918a71cdbe9 484 {
Sergunb 0:8918a71cdbe9 485 volatile unsigned long ul = 0;
Sergunb 0:8918a71cdbe9 486
Sergunb 0:8918a71cdbe9 487 (void) pcFile;
Sergunb 0:8918a71cdbe9 488 (void) ulLine;
Sergunb 0:8918a71cdbe9 489
Sergunb 0:8918a71cdbe9 490 taskENTER_CRITICAL();
Sergunb 0:8918a71cdbe9 491
Sergunb 0:8918a71cdbe9 492 //Set ul to a non-zero value using the debugger to step out of this function
Sergunb 0:8918a71cdbe9 493 while(ul == 0)
Sergunb 0:8918a71cdbe9 494 {
Sergunb 0:8918a71cdbe9 495 portNOP();
Sergunb 0:8918a71cdbe9 496 }
Sergunb 0:8918a71cdbe9 497
Sergunb 0:8918a71cdbe9 498 taskEXIT_CRITICAL();
Sergunb 0:8918a71cdbe9 499 }
Sergunb 0:8918a71cdbe9 500