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_chibios.c
Sergunb 0:8918a71cdbe9 3 * @brief RTOS abstraction layer (ChibiOS/RT)
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 <string.h>
Sergunb 0:8918a71cdbe9 34 #include "os_port.h"
Sergunb 0:8918a71cdbe9 35 #include "os_port_chibios.h"
Sergunb 0:8918a71cdbe9 36 #include "debug.h"
Sergunb 0:8918a71cdbe9 37
Sergunb 0:8918a71cdbe9 38 //Variables
Sergunb 0:8918a71cdbe9 39 static OsTask taskTable[OS_PORT_MAX_TASKS];
Sergunb 0:8918a71cdbe9 40 static uint_t *waTable[OS_PORT_MAX_TASKS];
Sergunb 0:8918a71cdbe9 41
Sergunb 0:8918a71cdbe9 42
Sergunb 0:8918a71cdbe9 43 /**
Sergunb 0:8918a71cdbe9 44 * @brief Kernel initialization
Sergunb 0:8918a71cdbe9 45 **/
Sergunb 0:8918a71cdbe9 46
Sergunb 0:8918a71cdbe9 47 void osInitKernel(void)
Sergunb 0:8918a71cdbe9 48 {
Sergunb 0:8918a71cdbe9 49 //Initialize tables
Sergunb 0:8918a71cdbe9 50 memset(taskTable, 0, sizeof(taskTable));
Sergunb 0:8918a71cdbe9 51 memset(waTable, 0, sizeof(waTable));
Sergunb 0:8918a71cdbe9 52
Sergunb 0:8918a71cdbe9 53 //Kernel initialization
Sergunb 0:8918a71cdbe9 54 chSysInit();
Sergunb 0:8918a71cdbe9 55 }
Sergunb 0:8918a71cdbe9 56
Sergunb 0:8918a71cdbe9 57
Sergunb 0:8918a71cdbe9 58 /**
Sergunb 0:8918a71cdbe9 59 * @brief Start kernel
Sergunb 0:8918a71cdbe9 60 **/
Sergunb 0:8918a71cdbe9 61
Sergunb 0:8918a71cdbe9 62 void osStartKernel(void)
Sergunb 0:8918a71cdbe9 63 {
Sergunb 0:8918a71cdbe9 64 //Terminate the main thread
Sergunb 0:8918a71cdbe9 65 chThdExit(MSG_OK);
Sergunb 0:8918a71cdbe9 66 }
Sergunb 0:8918a71cdbe9 67
Sergunb 0:8918a71cdbe9 68
Sergunb 0:8918a71cdbe9 69 /**
Sergunb 0:8918a71cdbe9 70 * @brief Create a static task
Sergunb 0:8918a71cdbe9 71 * @param[out] task Pointer to the task structure
Sergunb 0:8918a71cdbe9 72 * @param[in] name A name identifying the task
Sergunb 0:8918a71cdbe9 73 * @param[in] taskCode Pointer to the task entry function
Sergunb 0:8918a71cdbe9 74 * @param[in] params A pointer to a variable to be passed to the task
Sergunb 0:8918a71cdbe9 75 * @param[in] stack Pointer to the stack
Sergunb 0:8918a71cdbe9 76 * @param[in] stackSize The initial size of the stack, in words
Sergunb 0:8918a71cdbe9 77 * @param[in] priority The priority at which the task should run
Sergunb 0:8918a71cdbe9 78 * @return The function returns TRUE if the task was successfully
Sergunb 0:8918a71cdbe9 79 * created. Otherwise, FALSE is returned
Sergunb 0:8918a71cdbe9 80 **/
Sergunb 0:8918a71cdbe9 81
Sergunb 0:8918a71cdbe9 82 bool_t osCreateStaticTask(OsTask *task, const char_t *name, OsTaskCode taskCode,
Sergunb 0:8918a71cdbe9 83 void *params, void *stack, size_t stackSize, int_t priority)
Sergunb 0:8918a71cdbe9 84 {
Sergunb 0:8918a71cdbe9 85 //Compute the size of the working area in bytes
Sergunb 0:8918a71cdbe9 86 stackSize *= sizeof(uint_t);
Sergunb 0:8918a71cdbe9 87
Sergunb 0:8918a71cdbe9 88 //Create a new task
Sergunb 0:8918a71cdbe9 89 task->tp = chThdCreateStatic(stack, stackSize,
Sergunb 0:8918a71cdbe9 90 priority, (tfunc_t) taskCode, params);
Sergunb 0:8918a71cdbe9 91
Sergunb 0:8918a71cdbe9 92 //Check whether the task was successfully created
Sergunb 0:8918a71cdbe9 93 if(task->tp != NULL)
Sergunb 0:8918a71cdbe9 94 return TRUE;
Sergunb 0:8918a71cdbe9 95 else
Sergunb 0:8918a71cdbe9 96 return FALSE;
Sergunb 0:8918a71cdbe9 97 }
Sergunb 0:8918a71cdbe9 98
Sergunb 0:8918a71cdbe9 99
Sergunb 0:8918a71cdbe9 100 /**
Sergunb 0:8918a71cdbe9 101 * @brief Create a new task
Sergunb 0:8918a71cdbe9 102 * @param[in] name A name identifying the task
Sergunb 0:8918a71cdbe9 103 * @param[in] taskCode Pointer to the task entry function
Sergunb 0:8918a71cdbe9 104 * @param[in] params A pointer to a variable to be passed to the task
Sergunb 0:8918a71cdbe9 105 * @param[in] stackSize The initial size of the stack, in words
Sergunb 0:8918a71cdbe9 106 * @param[in] priority The priority at which the task should run
Sergunb 0:8918a71cdbe9 107 * @return If the function succeeds, the return value is a pointer to the
Sergunb 0:8918a71cdbe9 108 * new task. If the function fails, the return value is NULL
Sergunb 0:8918a71cdbe9 109 **/
Sergunb 0:8918a71cdbe9 110
Sergunb 0:8918a71cdbe9 111 OsTask *osCreateTask(const char_t *name, OsTaskCode taskCode,
Sergunb 0:8918a71cdbe9 112 void *params, size_t stackSize, int_t priority)
Sergunb 0:8918a71cdbe9 113 {
Sergunb 0:8918a71cdbe9 114 uint_t i;
Sergunb 0:8918a71cdbe9 115 void *wa;
Sergunb 0:8918a71cdbe9 116 OsTask *task = NULL;
Sergunb 0:8918a71cdbe9 117
Sergunb 0:8918a71cdbe9 118 //Compute the size of the stack in bytes
Sergunb 0:8918a71cdbe9 119 stackSize *= sizeof(uint_t);
Sergunb 0:8918a71cdbe9 120
Sergunb 0:8918a71cdbe9 121 //Allocate a memory block to hold the working area
Sergunb 0:8918a71cdbe9 122 wa = osAllocMem(THD_WORKING_AREA_SIZE(stackSize));
Sergunb 0:8918a71cdbe9 123
Sergunb 0:8918a71cdbe9 124 //Successful memory allocation?
Sergunb 0:8918a71cdbe9 125 if(wa != NULL)
Sergunb 0:8918a71cdbe9 126 {
Sergunb 0:8918a71cdbe9 127 //Enter critical section
Sergunb 0:8918a71cdbe9 128 chSysLock();
Sergunb 0:8918a71cdbe9 129
Sergunb 0:8918a71cdbe9 130 //Loop through task table
Sergunb 0:8918a71cdbe9 131 for(i = 0; i < OS_PORT_MAX_TASKS; i++)
Sergunb 0:8918a71cdbe9 132 {
Sergunb 0:8918a71cdbe9 133 //Check whether the current entry is free
Sergunb 0:8918a71cdbe9 134 if(taskTable[i].tp == NULL)
Sergunb 0:8918a71cdbe9 135 break;
Sergunb 0:8918a71cdbe9 136 }
Sergunb 0:8918a71cdbe9 137
Sergunb 0:8918a71cdbe9 138 //Any entry available in the table?
Sergunb 0:8918a71cdbe9 139 if(i < OS_PORT_MAX_TASKS)
Sergunb 0:8918a71cdbe9 140 {
Sergunb 0:8918a71cdbe9 141 //Create a new task
Sergunb 0:8918a71cdbe9 142 taskTable[i].tp = chThdCreateI(wa, THD_WORKING_AREA_SIZE(stackSize),
Sergunb 0:8918a71cdbe9 143 priority, (tfunc_t) taskCode, params);
Sergunb 0:8918a71cdbe9 144
Sergunb 0:8918a71cdbe9 145 //Check whether the task was successfully created
Sergunb 0:8918a71cdbe9 146 if(taskTable[i].tp != NULL)
Sergunb 0:8918a71cdbe9 147 {
Sergunb 0:8918a71cdbe9 148 //Insert the newly created task in the ready list
Sergunb 0:8918a71cdbe9 149 chSchWakeupS(taskTable[i].tp, MSG_OK);
Sergunb 0:8918a71cdbe9 150
Sergunb 0:8918a71cdbe9 151 //Save task pointer
Sergunb 0:8918a71cdbe9 152 task = &taskTable[i];
Sergunb 0:8918a71cdbe9 153 //Save working area base address
Sergunb 0:8918a71cdbe9 154 waTable[i] = wa;
Sergunb 0:8918a71cdbe9 155
Sergunb 0:8918a71cdbe9 156 //Leave critical section
Sergunb 0:8918a71cdbe9 157 chSysUnlock();
Sergunb 0:8918a71cdbe9 158 }
Sergunb 0:8918a71cdbe9 159 else
Sergunb 0:8918a71cdbe9 160 {
Sergunb 0:8918a71cdbe9 161 //Leave critical section
Sergunb 0:8918a71cdbe9 162 chSysUnlock();
Sergunb 0:8918a71cdbe9 163 //Clean up side effects
Sergunb 0:8918a71cdbe9 164 osFreeMem(wa);
Sergunb 0:8918a71cdbe9 165 }
Sergunb 0:8918a71cdbe9 166 }
Sergunb 0:8918a71cdbe9 167 else
Sergunb 0:8918a71cdbe9 168 {
Sergunb 0:8918a71cdbe9 169 //Leave critical section
Sergunb 0:8918a71cdbe9 170 chSysUnlock();
Sergunb 0:8918a71cdbe9 171 //No entry available in the table
Sergunb 0:8918a71cdbe9 172 osFreeMem(wa);
Sergunb 0:8918a71cdbe9 173 }
Sergunb 0:8918a71cdbe9 174 }
Sergunb 0:8918a71cdbe9 175
Sergunb 0:8918a71cdbe9 176 //Return a pointer to the newly created task
Sergunb 0:8918a71cdbe9 177 return task;
Sergunb 0:8918a71cdbe9 178 }
Sergunb 0:8918a71cdbe9 179
Sergunb 0:8918a71cdbe9 180
Sergunb 0:8918a71cdbe9 181 /**
Sergunb 0:8918a71cdbe9 182 * @brief Delete a task
Sergunb 0:8918a71cdbe9 183 * @param[in] task Pointer to the task to be deleted
Sergunb 0:8918a71cdbe9 184 **/
Sergunb 0:8918a71cdbe9 185
Sergunb 0:8918a71cdbe9 186 void osDeleteTask(OsTask *task)
Sergunb 0:8918a71cdbe9 187 {
Sergunb 0:8918a71cdbe9 188 //Delete the specified task
Sergunb 0:8918a71cdbe9 189 if(task == NULL)
Sergunb 0:8918a71cdbe9 190 chThdExit(MSG_OK);
Sergunb 0:8918a71cdbe9 191 else
Sergunb 0:8918a71cdbe9 192 chThdTerminate(task->tp);
Sergunb 0:8918a71cdbe9 193 }
Sergunb 0:8918a71cdbe9 194
Sergunb 0:8918a71cdbe9 195
Sergunb 0:8918a71cdbe9 196 /**
Sergunb 0:8918a71cdbe9 197 * @brief Delay routine
Sergunb 0:8918a71cdbe9 198 * @param[in] delay Amount of time for which the calling task should block
Sergunb 0:8918a71cdbe9 199 **/
Sergunb 0:8918a71cdbe9 200
Sergunb 0:8918a71cdbe9 201 void osDelayTask(systime_t delay)
Sergunb 0:8918a71cdbe9 202 {
Sergunb 0:8918a71cdbe9 203 //Delay the task for the specified duration
Sergunb 0:8918a71cdbe9 204 chThdSleep(OS_MS_TO_SYSTICKS(delay));
Sergunb 0:8918a71cdbe9 205 }
Sergunb 0:8918a71cdbe9 206
Sergunb 0:8918a71cdbe9 207
Sergunb 0:8918a71cdbe9 208 /**
Sergunb 0:8918a71cdbe9 209 * @brief Yield control to the next task
Sergunb 0:8918a71cdbe9 210 **/
Sergunb 0:8918a71cdbe9 211
Sergunb 0:8918a71cdbe9 212 void osSwitchTask(void)
Sergunb 0:8918a71cdbe9 213 {
Sergunb 0:8918a71cdbe9 214 //Force a context switch
Sergunb 0:8918a71cdbe9 215 chThdYield();
Sergunb 0:8918a71cdbe9 216 }
Sergunb 0:8918a71cdbe9 217
Sergunb 0:8918a71cdbe9 218
Sergunb 0:8918a71cdbe9 219 /**
Sergunb 0:8918a71cdbe9 220 * @brief Suspend scheduler activity
Sergunb 0:8918a71cdbe9 221 **/
Sergunb 0:8918a71cdbe9 222
Sergunb 0:8918a71cdbe9 223 void osSuspendAllTasks(void)
Sergunb 0:8918a71cdbe9 224 {
Sergunb 0:8918a71cdbe9 225 //Suspend scheduler activity
Sergunb 0:8918a71cdbe9 226 chSysLock();
Sergunb 0:8918a71cdbe9 227 }
Sergunb 0:8918a71cdbe9 228
Sergunb 0:8918a71cdbe9 229
Sergunb 0:8918a71cdbe9 230 /**
Sergunb 0:8918a71cdbe9 231 * @brief Resume scheduler activity
Sergunb 0:8918a71cdbe9 232 **/
Sergunb 0:8918a71cdbe9 233
Sergunb 0:8918a71cdbe9 234 void osResumeAllTasks(void)
Sergunb 0:8918a71cdbe9 235 {
Sergunb 0:8918a71cdbe9 236 //Resume scheduler activity
Sergunb 0:8918a71cdbe9 237 chSysUnlock();
Sergunb 0:8918a71cdbe9 238 }
Sergunb 0:8918a71cdbe9 239
Sergunb 0:8918a71cdbe9 240
Sergunb 0:8918a71cdbe9 241 /**
Sergunb 0:8918a71cdbe9 242 * @brief Create an event object
Sergunb 0:8918a71cdbe9 243 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 244 * @return The function returns TRUE if the event object was successfully
Sergunb 0:8918a71cdbe9 245 * created. Otherwise, FALSE is returned
Sergunb 0:8918a71cdbe9 246 **/
Sergunb 0:8918a71cdbe9 247
Sergunb 0:8918a71cdbe9 248 bool_t osCreateEvent(OsEvent *event)
Sergunb 0:8918a71cdbe9 249 {
Sergunb 0:8918a71cdbe9 250 //Initialize the binary semaphore object
Sergunb 0:8918a71cdbe9 251 chBSemObjectInit(event, TRUE);
Sergunb 0:8918a71cdbe9 252
Sergunb 0:8918a71cdbe9 253 //Event successfully created
Sergunb 0:8918a71cdbe9 254 return TRUE;
Sergunb 0:8918a71cdbe9 255 }
Sergunb 0:8918a71cdbe9 256
Sergunb 0:8918a71cdbe9 257
Sergunb 0:8918a71cdbe9 258 /**
Sergunb 0:8918a71cdbe9 259 * @brief Delete an event object
Sergunb 0:8918a71cdbe9 260 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 261 **/
Sergunb 0:8918a71cdbe9 262
Sergunb 0:8918a71cdbe9 263 void osDeleteEvent(OsEvent *event)
Sergunb 0:8918a71cdbe9 264 {
Sergunb 0:8918a71cdbe9 265 //No resource to release
Sergunb 0:8918a71cdbe9 266 }
Sergunb 0:8918a71cdbe9 267
Sergunb 0:8918a71cdbe9 268
Sergunb 0:8918a71cdbe9 269 /**
Sergunb 0:8918a71cdbe9 270 * @brief Set the specified event object to the signaled state
Sergunb 0:8918a71cdbe9 271 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 272 **/
Sergunb 0:8918a71cdbe9 273
Sergunb 0:8918a71cdbe9 274 void osSetEvent(OsEvent *event)
Sergunb 0:8918a71cdbe9 275 {
Sergunb 0:8918a71cdbe9 276 //Set the specified event to the signaled state
Sergunb 0:8918a71cdbe9 277 chBSemSignal(event);
Sergunb 0:8918a71cdbe9 278 }
Sergunb 0:8918a71cdbe9 279
Sergunb 0:8918a71cdbe9 280
Sergunb 0:8918a71cdbe9 281 /**
Sergunb 0:8918a71cdbe9 282 * @brief Set the specified event object to the nonsignaled state
Sergunb 0:8918a71cdbe9 283 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 284 **/
Sergunb 0:8918a71cdbe9 285
Sergunb 0:8918a71cdbe9 286 void osResetEvent(OsEvent *event)
Sergunb 0:8918a71cdbe9 287 {
Sergunb 0:8918a71cdbe9 288 //Force the specified event to the nonsignaled state
Sergunb 0:8918a71cdbe9 289 chBSemReset(event, TRUE);
Sergunb 0:8918a71cdbe9 290 }
Sergunb 0:8918a71cdbe9 291
Sergunb 0:8918a71cdbe9 292
Sergunb 0:8918a71cdbe9 293 /**
Sergunb 0:8918a71cdbe9 294 * @brief Wait until the specified event is in the signaled state
Sergunb 0:8918a71cdbe9 295 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 296 * @param[in] timeout Timeout interval
Sergunb 0:8918a71cdbe9 297 * @return The function returns TRUE if the state of the specified object is
Sergunb 0:8918a71cdbe9 298 * signaled. FALSE is returned if the timeout interval elapsed
Sergunb 0:8918a71cdbe9 299 **/
Sergunb 0:8918a71cdbe9 300
Sergunb 0:8918a71cdbe9 301 bool_t osWaitForEvent(OsEvent *event, systime_t timeout)
Sergunb 0:8918a71cdbe9 302 {
Sergunb 0:8918a71cdbe9 303 msg_t msg;
Sergunb 0:8918a71cdbe9 304
Sergunb 0:8918a71cdbe9 305 //Wait until the specified event is in the signaled
Sergunb 0:8918a71cdbe9 306 //state or the timeout interval elapses
Sergunb 0:8918a71cdbe9 307 if(timeout == 0)
Sergunb 0:8918a71cdbe9 308 {
Sergunb 0:8918a71cdbe9 309 //Non-blocking call
Sergunb 0:8918a71cdbe9 310 msg = chBSemWaitTimeout(event, TIME_IMMEDIATE);
Sergunb 0:8918a71cdbe9 311 }
Sergunb 0:8918a71cdbe9 312 else if(timeout == INFINITE_DELAY)
Sergunb 0:8918a71cdbe9 313 {
Sergunb 0:8918a71cdbe9 314 //Infinite timeout period
Sergunb 0:8918a71cdbe9 315 msg = chBSemWaitTimeout(event, TIME_INFINITE);
Sergunb 0:8918a71cdbe9 316 }
Sergunb 0:8918a71cdbe9 317 else
Sergunb 0:8918a71cdbe9 318 {
Sergunb 0:8918a71cdbe9 319 //Wait until the specified event becomes set
Sergunb 0:8918a71cdbe9 320 msg = chBSemWaitTimeout(event, OS_MS_TO_SYSTICKS(timeout));
Sergunb 0:8918a71cdbe9 321 }
Sergunb 0:8918a71cdbe9 322
Sergunb 0:8918a71cdbe9 323 //Check whether the specified event is set
Sergunb 0:8918a71cdbe9 324 if(msg == MSG_OK)
Sergunb 0:8918a71cdbe9 325 return TRUE;
Sergunb 0:8918a71cdbe9 326 else
Sergunb 0:8918a71cdbe9 327 return FALSE;
Sergunb 0:8918a71cdbe9 328 }
Sergunb 0:8918a71cdbe9 329
Sergunb 0:8918a71cdbe9 330
Sergunb 0:8918a71cdbe9 331 /**
Sergunb 0:8918a71cdbe9 332 * @brief Set an event object to the signaled state from an interrupt service routine
Sergunb 0:8918a71cdbe9 333 * @param[in] event Pointer to the event object
Sergunb 0:8918a71cdbe9 334 * @return TRUE if setting the event to signaled state caused a task to unblock
Sergunb 0:8918a71cdbe9 335 * and the unblocked task has a priority higher than the currently running task
Sergunb 0:8918a71cdbe9 336 **/
Sergunb 0:8918a71cdbe9 337
Sergunb 0:8918a71cdbe9 338 bool_t osSetEventFromIsr(OsEvent *event)
Sergunb 0:8918a71cdbe9 339 {
Sergunb 0:8918a71cdbe9 340 //Set the specified event to the signaled state
Sergunb 0:8918a71cdbe9 341 chBSemSignalI(event);
Sergunb 0:8918a71cdbe9 342
Sergunb 0:8918a71cdbe9 343 //The return value is not relevant
Sergunb 0:8918a71cdbe9 344 return FALSE;
Sergunb 0:8918a71cdbe9 345 }
Sergunb 0:8918a71cdbe9 346
Sergunb 0:8918a71cdbe9 347
Sergunb 0:8918a71cdbe9 348 /**
Sergunb 0:8918a71cdbe9 349 * @brief Create a semaphore object
Sergunb 0:8918a71cdbe9 350 * @param[in] semaphore Pointer to the semaphore object
Sergunb 0:8918a71cdbe9 351 * @param[in] count The maximum count for the semaphore object. This value
Sergunb 0:8918a71cdbe9 352 * must be greater than zero
Sergunb 0:8918a71cdbe9 353 * @return The function returns TRUE if the semaphore was successfully
Sergunb 0:8918a71cdbe9 354 * created. Otherwise, FALSE is returned
Sergunb 0:8918a71cdbe9 355 **/
Sergunb 0:8918a71cdbe9 356
Sergunb 0:8918a71cdbe9 357 bool_t osCreateSemaphore(OsSemaphore *semaphore, uint_t count)
Sergunb 0:8918a71cdbe9 358 {
Sergunb 0:8918a71cdbe9 359 //Initialize the semaphore object
Sergunb 0:8918a71cdbe9 360 chSemObjectInit(semaphore, count);
Sergunb 0:8918a71cdbe9 361
Sergunb 0:8918a71cdbe9 362 //Semaphore successfully created
Sergunb 0:8918a71cdbe9 363 return TRUE;
Sergunb 0:8918a71cdbe9 364 }
Sergunb 0:8918a71cdbe9 365
Sergunb 0:8918a71cdbe9 366
Sergunb 0:8918a71cdbe9 367 /**
Sergunb 0:8918a71cdbe9 368 * @brief Delete a semaphore object
Sergunb 0:8918a71cdbe9 369 * @param[in] semaphore Pointer to the semaphore object
Sergunb 0:8918a71cdbe9 370 **/
Sergunb 0:8918a71cdbe9 371
Sergunb 0:8918a71cdbe9 372 void osDeleteSemaphore(OsSemaphore *semaphore)
Sergunb 0:8918a71cdbe9 373 {
Sergunb 0:8918a71cdbe9 374 //No resource to release
Sergunb 0:8918a71cdbe9 375 }
Sergunb 0:8918a71cdbe9 376
Sergunb 0:8918a71cdbe9 377
Sergunb 0:8918a71cdbe9 378 /**
Sergunb 0:8918a71cdbe9 379 * @brief Wait for the specified semaphore to be available
Sergunb 0:8918a71cdbe9 380 * @param[in] semaphore Pointer to the semaphore object
Sergunb 0:8918a71cdbe9 381 * @param[in] timeout Timeout interval
Sergunb 0:8918a71cdbe9 382 * @return The function returns TRUE if the semaphore is available. FALSE is
Sergunb 0:8918a71cdbe9 383 * returned if the timeout interval elapsed
Sergunb 0:8918a71cdbe9 384 **/
Sergunb 0:8918a71cdbe9 385
Sergunb 0:8918a71cdbe9 386 bool_t osWaitForSemaphore(OsSemaphore *semaphore, systime_t timeout)
Sergunb 0:8918a71cdbe9 387 {
Sergunb 0:8918a71cdbe9 388 msg_t msg;
Sergunb 0:8918a71cdbe9 389
Sergunb 0:8918a71cdbe9 390 //Wait until the semaphore is available or the timeout interval elapses
Sergunb 0:8918a71cdbe9 391 if(timeout == 0)
Sergunb 0:8918a71cdbe9 392 {
Sergunb 0:8918a71cdbe9 393 //Non-blocking call
Sergunb 0:8918a71cdbe9 394 msg = chSemWaitTimeout(semaphore, TIME_IMMEDIATE);
Sergunb 0:8918a71cdbe9 395 }
Sergunb 0:8918a71cdbe9 396 else if(timeout == INFINITE_DELAY)
Sergunb 0:8918a71cdbe9 397 {
Sergunb 0:8918a71cdbe9 398 //Infinite timeout period
Sergunb 0:8918a71cdbe9 399 msg = chSemWaitTimeout(semaphore, TIME_INFINITE);
Sergunb 0:8918a71cdbe9 400 }
Sergunb 0:8918a71cdbe9 401 else
Sergunb 0:8918a71cdbe9 402 {
Sergunb 0:8918a71cdbe9 403 //Wait until the specified semaphore becomes available
Sergunb 0:8918a71cdbe9 404 msg = chSemWaitTimeout(semaphore, OS_MS_TO_SYSTICKS(timeout));
Sergunb 0:8918a71cdbe9 405 }
Sergunb 0:8918a71cdbe9 406
Sergunb 0:8918a71cdbe9 407 //Check whether the specified semaphore is available
Sergunb 0:8918a71cdbe9 408 if(msg == MSG_OK)
Sergunb 0:8918a71cdbe9 409 return TRUE;
Sergunb 0:8918a71cdbe9 410 else
Sergunb 0:8918a71cdbe9 411 return FALSE;
Sergunb 0:8918a71cdbe9 412 }
Sergunb 0:8918a71cdbe9 413
Sergunb 0:8918a71cdbe9 414
Sergunb 0:8918a71cdbe9 415 /**
Sergunb 0:8918a71cdbe9 416 * @brief Release the specified semaphore object
Sergunb 0:8918a71cdbe9 417 * @param[in] semaphore Pointer to the semaphore object
Sergunb 0:8918a71cdbe9 418 **/
Sergunb 0:8918a71cdbe9 419
Sergunb 0:8918a71cdbe9 420 void osReleaseSemaphore(OsSemaphore *semaphore)
Sergunb 0:8918a71cdbe9 421 {
Sergunb 0:8918a71cdbe9 422 //Release the semaphore
Sergunb 0:8918a71cdbe9 423 chSemSignal(semaphore);
Sergunb 0:8918a71cdbe9 424 }
Sergunb 0:8918a71cdbe9 425
Sergunb 0:8918a71cdbe9 426
Sergunb 0:8918a71cdbe9 427 /**
Sergunb 0:8918a71cdbe9 428 * @brief Create a mutex object
Sergunb 0:8918a71cdbe9 429 * @param[in] mutex Pointer to the mutex object
Sergunb 0:8918a71cdbe9 430 * @return The function returns TRUE if the mutex was successfully
Sergunb 0:8918a71cdbe9 431 * created. Otherwise, FALSE is returned
Sergunb 0:8918a71cdbe9 432 **/
Sergunb 0:8918a71cdbe9 433
Sergunb 0:8918a71cdbe9 434 bool_t osCreateMutex(OsMutex *mutex)
Sergunb 0:8918a71cdbe9 435 {
Sergunb 0:8918a71cdbe9 436 //Initialize the mutex object
Sergunb 0:8918a71cdbe9 437 chMtxObjectInit(mutex);
Sergunb 0:8918a71cdbe9 438
Sergunb 0:8918a71cdbe9 439 //Mutex successfully created
Sergunb 0:8918a71cdbe9 440 return TRUE;
Sergunb 0:8918a71cdbe9 441 }
Sergunb 0:8918a71cdbe9 442
Sergunb 0:8918a71cdbe9 443
Sergunb 0:8918a71cdbe9 444 /**
Sergunb 0:8918a71cdbe9 445 * @brief Delete a mutex object
Sergunb 0:8918a71cdbe9 446 * @param[in] mutex Pointer to the mutex object
Sergunb 0:8918a71cdbe9 447 **/
Sergunb 0:8918a71cdbe9 448
Sergunb 0:8918a71cdbe9 449 void osDeleteMutex(OsMutex *mutex)
Sergunb 0:8918a71cdbe9 450 {
Sergunb 0:8918a71cdbe9 451 //No resource to release
Sergunb 0:8918a71cdbe9 452 }
Sergunb 0:8918a71cdbe9 453
Sergunb 0:8918a71cdbe9 454
Sergunb 0:8918a71cdbe9 455 /**
Sergunb 0:8918a71cdbe9 456 * @brief Acquire ownership of the specified mutex object
Sergunb 0:8918a71cdbe9 457 * @param[in] mutex Pointer to the mutex object
Sergunb 0:8918a71cdbe9 458 **/
Sergunb 0:8918a71cdbe9 459
Sergunb 0:8918a71cdbe9 460 void osAcquireMutex(OsMutex *mutex)
Sergunb 0:8918a71cdbe9 461 {
Sergunb 0:8918a71cdbe9 462 //Obtain ownership of the mutex object
Sergunb 0:8918a71cdbe9 463 chMtxLock(mutex);
Sergunb 0:8918a71cdbe9 464 }
Sergunb 0:8918a71cdbe9 465
Sergunb 0:8918a71cdbe9 466
Sergunb 0:8918a71cdbe9 467 /**
Sergunb 0:8918a71cdbe9 468 * @brief Release ownership of the specified mutex object
Sergunb 0:8918a71cdbe9 469 * @param[in] mutex Pointer to the mutex object
Sergunb 0:8918a71cdbe9 470 **/
Sergunb 0:8918a71cdbe9 471
Sergunb 0:8918a71cdbe9 472 void osReleaseMutex(OsMutex *mutex)
Sergunb 0:8918a71cdbe9 473 {
Sergunb 0:8918a71cdbe9 474 //Release ownership of the mutex object
Sergunb 0:8918a71cdbe9 475 #if (CH_KERNEL_MAJOR < 3)
Sergunb 0:8918a71cdbe9 476 chMtxUnlock();
Sergunb 0:8918a71cdbe9 477 #else
Sergunb 0:8918a71cdbe9 478 chMtxUnlock(mutex);
Sergunb 0:8918a71cdbe9 479 #endif
Sergunb 0:8918a71cdbe9 480 }
Sergunb 0:8918a71cdbe9 481
Sergunb 0:8918a71cdbe9 482
Sergunb 0:8918a71cdbe9 483 /**
Sergunb 0:8918a71cdbe9 484 * @brief Retrieve system time
Sergunb 0:8918a71cdbe9 485 * @return Number of milliseconds elapsed since the system was last started
Sergunb 0:8918a71cdbe9 486 **/
Sergunb 0:8918a71cdbe9 487
Sergunb 0:8918a71cdbe9 488 systime_t osGetSystemTime(void)
Sergunb 0:8918a71cdbe9 489 {
Sergunb 0:8918a71cdbe9 490 systime_t time;
Sergunb 0:8918a71cdbe9 491
Sergunb 0:8918a71cdbe9 492 //Get current tick count
Sergunb 0:8918a71cdbe9 493 time = chVTGetSystemTime();
Sergunb 0:8918a71cdbe9 494
Sergunb 0:8918a71cdbe9 495 //Convert system ticks to milliseconds
Sergunb 0:8918a71cdbe9 496 return OS_SYSTICKS_TO_MS(time);
Sergunb 0:8918a71cdbe9 497 }
Sergunb 0:8918a71cdbe9 498
Sergunb 0:8918a71cdbe9 499
Sergunb 0:8918a71cdbe9 500 /**
Sergunb 0:8918a71cdbe9 501 * @brief Allocate a memory block
Sergunb 0:8918a71cdbe9 502 * @param[in] size Bytes to allocate
Sergunb 0:8918a71cdbe9 503 * @return A pointer to the allocated memory block or NULL if
Sergunb 0:8918a71cdbe9 504 * there is insufficient memory available
Sergunb 0:8918a71cdbe9 505 **/
Sergunb 0:8918a71cdbe9 506
Sergunb 0:8918a71cdbe9 507 void *osAllocMem(size_t size)
Sergunb 0:8918a71cdbe9 508 {
Sergunb 0:8918a71cdbe9 509 void *p;
Sergunb 0:8918a71cdbe9 510
Sergunb 0:8918a71cdbe9 511 //Allocate a memory block
Sergunb 0:8918a71cdbe9 512 p = chHeapAlloc(NULL, size);
Sergunb 0:8918a71cdbe9 513
Sergunb 0:8918a71cdbe9 514 //Debug message
Sergunb 0:8918a71cdbe9 515 TRACE_DEBUG("Allocating %" PRIuSIZE " bytes at 0x%08" PRIXPTR "\r\n", size, (uintptr_t) p);
Sergunb 0:8918a71cdbe9 516
Sergunb 0:8918a71cdbe9 517 //Return a pointer to the newly allocated memory block
Sergunb 0:8918a71cdbe9 518 return p;
Sergunb 0:8918a71cdbe9 519 }
Sergunb 0:8918a71cdbe9 520
Sergunb 0:8918a71cdbe9 521
Sergunb 0:8918a71cdbe9 522 /**
Sergunb 0:8918a71cdbe9 523 * @brief Release a previously allocated memory block
Sergunb 0:8918a71cdbe9 524 * @param[in] p Previously allocated memory block to be freed
Sergunb 0:8918a71cdbe9 525 **/
Sergunb 0:8918a71cdbe9 526
Sergunb 0:8918a71cdbe9 527 void osFreeMem(void *p)
Sergunb 0:8918a71cdbe9 528 {
Sergunb 0:8918a71cdbe9 529 //Make sure the pointer is valid
Sergunb 0:8918a71cdbe9 530 if(p != NULL)
Sergunb 0:8918a71cdbe9 531 {
Sergunb 0:8918a71cdbe9 532 //Debug message
Sergunb 0:8918a71cdbe9 533 TRACE_DEBUG("Freeing memory at 0x%08" PRIXPTR "\r\n", (uintptr_t) p);
Sergunb 0:8918a71cdbe9 534
Sergunb 0:8918a71cdbe9 535 //Free memory block
Sergunb 0:8918a71cdbe9 536 chHeapFree(p);
Sergunb 0:8918a71cdbe9 537 }
Sergunb 0:8918a71cdbe9 538 }
Sergunb 0:8918a71cdbe9 539
Sergunb 0:8918a71cdbe9 540
Sergunb 0:8918a71cdbe9 541 /**
Sergunb 0:8918a71cdbe9 542 * @brief Idle loop hook
Sergunb 0:8918a71cdbe9 543 **/
Sergunb 0:8918a71cdbe9 544
Sergunb 0:8918a71cdbe9 545 void osIdleLoopHook(void)
Sergunb 0:8918a71cdbe9 546 {
Sergunb 0:8918a71cdbe9 547 uint_t i;
Sergunb 0:8918a71cdbe9 548
Sergunb 0:8918a71cdbe9 549 //Loop through task table
Sergunb 0:8918a71cdbe9 550 for(i = 0; i < OS_PORT_MAX_TASKS; i++)
Sergunb 0:8918a71cdbe9 551 {
Sergunb 0:8918a71cdbe9 552 //Check whether current entry is used
Sergunb 0:8918a71cdbe9 553 if(taskTable[i].tp != NULL)
Sergunb 0:8918a71cdbe9 554 {
Sergunb 0:8918a71cdbe9 555 //Wait for task termination
Sergunb 0:8918a71cdbe9 556 if(chThdTerminatedX(taskTable[i].tp))
Sergunb 0:8918a71cdbe9 557 {
Sergunb 0:8918a71cdbe9 558 //Free working area
Sergunb 0:8918a71cdbe9 559 osFreeMem(waTable[i]);
Sergunb 0:8918a71cdbe9 560
Sergunb 0:8918a71cdbe9 561 //Mark the entry as free
Sergunb 0:8918a71cdbe9 562 waTable[i] = NULL;
Sergunb 0:8918a71cdbe9 563 taskTable[i].tp = NULL;
Sergunb 0:8918a71cdbe9 564 }
Sergunb 0:8918a71cdbe9 565 }
Sergunb 0:8918a71cdbe9 566 }
Sergunb 0:8918a71cdbe9 567 }
Sergunb 0:8918a71cdbe9 568