Dependents:   rtest LeonardoMbos OS_test Labo_TRSE_Drone ... more

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);
 }
-
-
-