Dependents: rtest LeonardoMbos OS_test Labo_TRSE_Drone ... more
Diff: mbos.cpp
- Revision:
- 4:e740e08cbea9
- Parent:
- 0:1dafafe7d505
- Child:
- 5:6eef5e47e154
--- a/mbos.cpp Sun Dec 05 13:36:15 2010 +0000 +++ b/mbos.cpp Mon Jan 31 03:39:39 2011 +0000 @@ -15,7 +15,6 @@ */ #include "mbos.h" #include "mbed.h" -//#include <stdlib.h> #define MAX_PRIO 99 // maximum priority #define READY MAX_PRIO + 1 // always > MAX_PRIO @@ -103,7 +102,6 @@ _numresources = nresources; _tasks = _tasklist[0]; } - // Create Tasks Function -------------------------------------------------------------- void mbos::CreateTask(uint id, uint priority, uint stacksz, void (*fun)(void)) { @@ -112,7 +110,7 @@ // check bounds if(id >= _numtasks || id < 1) error("mbos::CreateTask - %i is an invalid task id\n", id); if(priority > MAX_PRIO) error("mbos::CreateTask - %i is an invalid priority for Task %i\n", priority, id); - if(stacksz < MIN_STACKSZ) error("mbos::CreateTask - %i words is too small a stack for Task %i\n", stacksz, id); + if(stacksz < MIN_STACKSZ) stacksz = MIN_STACKSZ; // fill tcb if(_tasks[id].id == 0) _tasks[id].id = id; @@ -125,7 +123,6 @@ _tasks[id].stacklimit = stackbase; _tasks[id].stack = _initstack(stackbase + stacksz, fun); } - // Start OS function ------------------------------------------------------------------- void mbos::Start(uint stacksize) { @@ -137,7 +134,7 @@ _tasks[0].eventlist = 0; _tasks[0].eventmask = 0; if(mbosIdleTask){ - if(stacksize < MIN_STACKSZ) error("mbos::Start - %i words is too small for idle task stack\n", stacksize); + if(stacksize < MIN_STACKSZ) stacksize = MIN_STACKSZ; stackbase = (uint*)malloc(stacksize * 4); if(stackbase == 0) error("mbos::Start - Insufficient memory to create idle task\n"); _tasks[0].stacklimit = stackbase; @@ -156,7 +153,6 @@ while(1); } - // OS Tick Function ------------------------------------------------------------------- void SysTick_Handler(void) { @@ -200,7 +196,6 @@ { return _tasklist[0]->priostate - READY; } - // Wait Event Function ------------------------------------------------------------------ void mbos::WaitEvent(uint event) { @@ -260,7 +255,22 @@ _timers[id].timer = time; _timers[id].reload = reload; __enable_irq(); -} +} +// Redirect Timer Function ----------------------------------------------------------------- +void mbos::RedirectTimer(uint id, uint task, uint event) +{ + // check bounds + if(id >= _numtimers) error("mbos::RedirectTimer - %i is an invalid timer id\n", id); + if(task < 1|| task >= _numtasks) error("mbos::RedirectTimer - %i is an invalid task id for Timer %i\n", task, id); + if(event == 0) error("mbos::RedirectTimer - Can't use null event for Timer %i\n", id); + + __disable_irq(); + if( _timers[id].timer == 0){ + _timers[id].task = task; + _timers[id].event = event; + } + __enable_irq(); +} // Clear Timer Function ------------------------------------------------------------------- void mbos::ClearTimer(uint id) { @@ -288,7 +298,7 @@ { // check bounds if(id >= _numresources) error("mbos::LockResource - %i is an invalid resource id\n", id); - if(_tasklist[0]->id == 0 ||_resources[id].lock != 0) return _resources[id].lock; + if(_tasklist[0]->id == 0 ||_resources[id].lock != 0) return _resources[id].lock; __disable_irq(); _resources[id].lock = _tasklist[0]->id; @@ -309,7 +319,7 @@ { // check bounds if(id >= _numresources) error("mbos::FreeResource - %i is an invalid resource id\n", id); - if(_tasklist[0]->id == 0 || _tasklist[0]->id != _resources[id].lock) return _resources[id].lock; + if(_tasklist[0]->id == 0 || _tasklist[0]->id != _resources[id].lock) return _resources[id].lock; __disable_irq(); _resources[id].lock = 0; @@ -317,8 +327,6 @@ __enable_irq(); return 0; } - - // Initialise stack function ----------------------------------------------------------- uint* mbos::_initstack(uint *stack, void (*fun)()) { @@ -332,10 +340,8 @@ stack -= 8; // R11, R10, R9, R8, R7, R6, R5, R4 return stack; } +// Stack Error function ---------------------------------------------------------------- void _stackerror(uint task) { error("Stack Overflow on Task %i\n", task); } - - -