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