00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "task.h"
00016 #include "pq.h"
00017 #include "HeapManager.h"
00018
00025
00026 TCB *CurrentTask;
00027 TCB *NextTask;
00028 int OsRunning;
00029 HEAP_BLOCK *pStackHeap;
00030 PQ ActiveTasks;
00032
00033
00034
00035
00036 static void *AllocStack(size_t len)
00037 {
00038
00039 return HeapAlloc(pStackHeap,len);
00040 }
00041
00048 unsigned StackHeapAvailiable(void)
00049 {
00050 return HeapFreeSpace(pStackHeap);
00051 }
00052
00053
00054
00055
00056
00057
00058
00059
00079 void CreateTask(TCB *t, void (*task)(void *), int stacksize,int priority,char *name,void *arg)
00080 {
00081 char *stk;
00082 char sr;
00083 char *stack;
00084 int i;
00085
00086 stack = AllocStack(stacksize);
00087 for(i=0;i<stacksize;++i) stack[i] = 0xcd;
00088 sr = Disable();
00089 if(t)
00090 {
00091 t->TcbSwaps = 0;
00092 t->stacksize = stacksize;
00093 t->priority = priority;
00094 t->TimeStamp = 0;
00095 t->name = name;
00096 t->stacktop = stack;
00097 t->next = (TCB *)0;
00098 t->list = (TCB *)0;
00099 stk = stack + stacksize-1;
00100 *stk-- = (char)LO( (unsigned)task);
00101 *stk-- = (char)HI( (unsigned)task);
00102 *stk-- = 0;
00103 *stk-- = 31;
00104 *stk-- = 0x80;
00105 *stk-- = 30;
00106 *stk-- = 29;
00107 *stk-- = 28;
00108 *stk-- = 27;
00109 *stk-- = 26;
00110 *stk-- = (char)HI( (unsigned)arg);
00111 *stk-- = (char)LO( (unsigned)arg);
00112 *stk-- = 23;
00113 *stk-- = 22;
00114 *stk-- = 21;
00115 *stk-- = 20;
00116 *stk-- = 19;
00117 *stk-- = 18;
00118 *stk-- = 17;
00119 *stk-- = 16;
00120 *stk-- = 15;
00121 *stk-- = 14;
00122 *stk-- = 13;
00123 *stk-- = 12;
00124 *stk-- = 11;
00125 *stk-- = 10;
00126 *stk-- = 9;
00127 *stk-- = 8;
00128 *stk-- = 7;
00129 *stk-- = 6;
00130 *stk-- = 5;
00131 *stk-- = 4;
00132 *stk-- = 3;
00133 *stk-- = 2;
00134 *stk-- = 0;
00135 *stk-- = 0;
00136 t->stack = stk;
00137 }
00138 Enable(sr);
00139 }
00140
00141
00142