00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "includes.h"
00012
00013 OS_TCB OsTask[OS_TASK_MAX];
00014 OS_TASK_CONTROL OsTaskCtrl;
00015
00016 void OsTaskInit(void);
00017 INT8U OsTaskCreat(void (*Task)(void),OS_STK *Ptos,INT8U Id,INT8U Priority);
00018 INT8U OsTaskFreeTaskListCheck(void);
00019 OS_TCB *OsTaskFreeTaskGet(void);
00020 void OsTaskFreeTaskPut(OS_TCB *pOsTcb);
00021 INT8U OsTaskSuspendTaskListCheck(INT8U Id);
00022 OS_TCB *OsTaskSuspendTaskGet(INT8U Id);
00023 void OsTaskSuspendTaskPut(OS_TCB *pOsTcb);
00024 INT8U OsTaskReadyListCheck(INT8U Priority);
00025 void OsTaskReadyTaskPut(OS_TCB *pOsTcb);
00026 OS_TCB *OsTaskReadyTaskGet(INT8U Priority);
00027
00028 void OsTaskInit(void){
00029 INT8U i;
00030
00031 OsTaskCtrl.Status=0;
00032 OsTaskCtrl.FreeTaskNumber=0;
00033 OsTaskCtrl.SuspendTaskNumber=0;
00034 OsTaskCtrl.FreeList=(OS_TCB *)0;
00035 OsTaskCtrl.SuspendList=(OS_TCB *)0;
00036 for(i=0;i<TASK_PRIORITY_MAX;i++){
00037 OsTaskCtrl.ReadyListHead[i]=(OS_TCB *)0;
00038 OsTaskCtrl.ReadyListTail[i]=(OS_TCB *)0;
00039 OsTaskCtrl.ReadyTaskNumber[i]=0;
00040 }
00041 for(i=0;i<OS_TASK_MAX;i++){
00042 OsTask[i].Status=OS_TASK_FREE;
00043 OsTask[i].Id=0;
00044 OsTask[i].Priority=0;
00045 OsTask[i].Prev=(OS_TCB *)0;
00046 OsTask[i].Next=(OS_TCB *)0;
00047 OsTaskFreeTaskPut(&OsTask[i]);
00048 }
00049 }
00050 INT8U OsTaskCreat(void (*Task)(void),OS_STK *Ptos,INT8U Id,INT8U Priority){
00051 OS_TCB *pOsTcb;
00052
00053 if(OSRunning==1) OS_ENTER_CRITICAL();
00054 if(OsTaskFreeTaskListCheck()==FALSE) return FALSE;
00055 pOsTcb=OsTaskFreeTaskGet();
00056 pOsTcb->Id=Id;
00057 if(Priority<TASK_PRIORITY_MAX) pOsTcb->Priority=Priority;
00058 else pOsTcb->Priority=0;
00059 pOsTcb->Function=Task;
00060 pOsTcb->TimeDelay=0;
00061 pOsTcb->pEvent=(OS_EVENT *)0;
00062 pOsTcb->pStack=OSTaskStkInit(Task,(void *)0,Ptos,0);
00063 OsTaskReadyTaskPut(pOsTcb);
00064 if(OSRunning==1) OS_EXIT_CRITICAL();
00065 return TRUE;
00066 }
00067 INT8U OsTaskFreeTaskListCheck(void){
00068 if(OsTaskCtrl.FreeList==(OS_TCB *)0) return FALSE;
00069 else return TRUE;
00070 }
00071 OS_TCB *OsTaskFreeTaskGet(void){
00072 OS_TCB *pOsTcb;
00073
00074 if(OsTaskCtrl.FreeTaskNumber==0) return (OS_TCB *)0;
00075 pOsTcb=OsTaskCtrl.FreeList;
00076 OsTaskCtrl.FreeList=OsTaskCtrl.FreeList->Next;
00077 OsTaskCtrl.FreeList->Prev=(OS_TCB *)0;
00078 OsTaskCtrl.FreeTaskNumber--;
00079 return pOsTcb;
00080 }
00081 void OsTaskFreeTaskPut(OS_TCB *pOsTcb){
00082 if(OsTaskCtrl.FreeList==(OS_TCB *)0){
00083 pOsTcb->Status=OS_TASK_FREE;
00084 OsTaskCtrl.FreeList=pOsTcb;
00085 OsTaskCtrl.FreeList->Prev=(OS_TCB *)0;
00086 OsTaskCtrl.FreeList->Next=(OS_TCB *)0;
00087 }
00088 else{
00089 pOsTcb->Status=OS_TASK_FREE;
00090 OsTaskCtrl.FreeList->Prev=pOsTcb;
00091 pOsTcb->Next=OsTaskCtrl.FreeList;
00092 pOsTcb->Prev=(OS_TCB *)0;
00093 OsTaskCtrl.FreeList=pOsTcb;
00094 if(OsTaskCtrl.FreeTaskNumber<OS_TASK_MAX) OsTaskCtrl.FreeTaskNumber++;
00095 }
00096 }
00097 INT8U OsTaskSuspendTaskListCheck(INT8U Id){
00098 OS_TCB *pOsTcb;
00099
00100 if(OsTaskCtrl.SuspendList==(OS_TCB *)0) return FALSE;
00101 pOsTcb=OsTaskCtrl.SuspendList;
00102 while(pOsTcb!=(OS_TCB *)0){
00103 if(pOsTcb->Id==Id) break;
00104 else pOsTcb=pOsTcb->Next;
00105 }
00106 if(pOsTcb==(OS_TCB *)0) return FALSE;
00107 else return 1;
00108 }
00109 OS_TCB *OsTaskSuspendTaskGet(INT8U Id){
00110 OS_TCB *pOsTcb;
00111
00112 pOsTcb=OsTaskCtrl.SuspendList;
00113 if(OsTaskCtrl.SuspendList==(OS_TCB *)0) return (OS_TCB *)0;
00114 while(pOsTcb!=(OS_TCB *)0){
00115 if(pOsTcb->Id==Id){
00116 if(pOsTcb==OsTaskCtrl.SuspendList){
00117 OsTaskCtrl.SuspendList=(OS_TCB *)0;
00118 }
00119 else{
00120 pOsTcb->Prev->Next=pOsTcb->Next;
00121 pOsTcb->Next->Prev=pOsTcb->Prev;
00122 }
00123 break;
00124 }
00125 else pOsTcb=pOsTcb->Next;
00126 }
00127 if(pOsTcb==(OS_TCB *)0) return (OS_TCB *)0;
00128 OsTaskCtrl.SuspendTaskNumber--;
00129 return pOsTcb;
00130 }
00131 void OsTaskSuspendTaskPut(OS_TCB *pOsTcb){
00132 if(OsTaskCtrl.SuspendList==(OS_TCB *)0){
00133 pOsTcb->Status=OS_TASK_SUSPEND;
00134 OsTaskCtrl.SuspendList=pOsTcb;
00135 OsTaskCtrl.SuspendList->Prev=(OS_TCB *)0;
00136 OsTaskCtrl.SuspendList->Next=(OS_TCB *)0;
00137 OsTaskCtrl.SuspendTaskNumber=1;
00138 }
00139 else{
00140 pOsTcb->Status=OS_TASK_SUSPEND;
00141 OsTaskCtrl.SuspendList->Prev=pOsTcb;
00142 pOsTcb->Next=OsTaskCtrl.SuspendList;
00143 pOsTcb->Prev=(OS_TCB *)0;
00144 OsTaskCtrl.SuspendList=pOsTcb;
00145 OsTaskCtrl.SuspendTaskNumber++;
00146 }
00147 }
00148 INT8U OsTaskReadyListCheck(INT8U Priority){
00149 if(OsTaskCtrl.ReadyListHead[Priority]==(OS_TCB *)0) return FALSE;
00150 else return TRUE;
00151 }
00152 void OsTaskReadyTaskPut(OS_TCB *pOsTcb){
00153 INT8U Priority;
00154 OS_TCB **pListHead;
00155 OS_TCB **pListTail;
00156 OS_TCB *pHead;
00157 OS_TCB *pTail;
00158 INT8U *pListNumber;
00159
00160 if(pOsTcb->Priority>=TASK_PRIORITY_MAX) return;
00161 pOsTcb->Next=(OS_TCB *)0;
00162 pOsTcb->Prev=(OS_TCB *)0;
00163 pOsTcb->Status=OS_TASK_READY;
00164 pOsTcb->PendingType=OS_PENDING_NONE;
00165 pOsTcb->TimeDelay=0;
00166 pOsTcb->pEvent=(OS_EVENT *)0;
00167 Priority=pOsTcb->Priority;
00168 pListHead=&OsTaskCtrl.ReadyListHead[Priority];
00169 pListTail=&OsTaskCtrl.ReadyListTail[Priority];
00170 pHead=OsTaskCtrl.ReadyListHead[Priority];
00171 pTail=OsTaskCtrl.ReadyListTail[Priority];
00172 pListNumber=(INT8U *)&OsTaskCtrl.ReadyTaskNumber[Priority];
00173 if(pHead==(OS_TCB *)0){
00174 *pListHead=pOsTcb;
00175 *pListTail=pOsTcb;
00176 *pListNumber=1;
00177 }
00178 else{
00179 pHead->Prev=pOsTcb;
00180 pOsTcb->Next=pHead;
00181 *pListHead=pOsTcb;
00182 *pListNumber+=1;
00183 }
00184 }
00185 OS_TCB *OsTaskReadyTaskGet(INT8U Priority){
00186 OS_TCB **pListHead;
00187 OS_TCB **pListTail;
00188 OS_TCB *pHead;
00189 OS_TCB *pTail;
00190 OS_TCB *pOsTcb;
00191 INT8U *pListNumber;
00192
00193 pHead=OsTaskCtrl.ReadyListHead[Priority];
00194 if(pHead==(OS_TCB *)0) return (OS_TCB *)0;
00195 pListHead=&OsTaskCtrl.ReadyListHead[Priority];
00196 pListTail=&OsTaskCtrl.ReadyListTail[Priority];
00197 pTail=OsTaskCtrl.ReadyListTail[Priority];
00198 pListNumber=(INT8U *)&OsTaskCtrl.ReadyTaskNumber[Priority];
00199 if(pHead==pTail){
00200 pOsTcb=pTail;
00201 *pListHead=(OS_TCB *)0;
00202 *pListTail=(OS_TCB *)0;
00203 *pListNumber=0;
00204 pOsTcb->Next=(OS_TCB *)0;
00205 pOsTcb->Prev=(OS_TCB *)0;
00206 return pOsTcb;
00207 }
00208 else{
00209 pOsTcb=pTail;
00210 pTail=pTail->Prev;
00211 pTail->Next=(OS_TCB *)0;
00212 *pListTail=pTail;
00213 *pListNumber-=1;
00214 pOsTcb->Next=(OS_TCB *)0;
00215 pOsTcb->Prev=(OS_TCB *)0;
00216 return pOsTcb;
00217 }
00218 }
00219
00220
00221
00222