Go to the source code of this file.
Functions | |
void | OsTaskInit (void) |
INT8U | OsTaskCreat (void(*Task)(void), OS_STK *Ptos, INT8U Id, INT8U Priority) |
INT8U | OsTaskFreeTaskListCheck (void) |
OS_TCB * | OsTaskFreeTaskGet (void) |
void | OsTaskFreeTaskPut (OS_TCB *pOsTcb) |
INT8U | OsTaskSuspendTaskListCheck (INT8U Id) |
OS_TCB * | OsTaskSuspendTaskGet (INT8U Id) |
void | OsTaskSuspendTaskPut (OS_TCB *pOsTcb) |
INT8U | OsTaskReadyListCheck (INT8U Priority) |
void | OsTaskReadyTaskPut (OS_TCB *pOsTcb) |
OS_TCB * | OsTaskReadyTaskGet (INT8U Priority) |
Variables | |
OS_TCB | OsTask [OS_TASK_MAX] |
OS_TASK_CONTROL | OsTaskCtrl |
INT8U OsTaskCreat | ( | void(*)(void) | Task, | |
OS_STK * | Ptos, | |||
INT8U | Id, | |||
INT8U | Priority | |||
) |
Definition at line 50 of file os_task.c.
00050 { 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 }
OS_TCB * OsTaskFreeTaskGet | ( | void | ) |
Definition at line 71 of file os_task.c.
00071 { 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 }
INT8U OsTaskFreeTaskListCheck | ( | void | ) |
Definition at line 67 of file os_task.c.
00067 { 00068 if(OsTaskCtrl.FreeList==(OS_TCB *)0) return FALSE; 00069 else return TRUE; 00070 }
void OsTaskFreeTaskPut | ( | OS_TCB * | pOsTcb | ) |
Definition at line 81 of file os_task.c.
00081 { 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 }
void OsTaskInit | ( | void | ) |
Definition at line 28 of file os_task.c.
00028 { 00029 INT8U i; 00030 00031 OsTaskCtrl.Status=0; 00032 OsTaskCtrl.FreeTaskNumber=0; 00033 OsTaskCtrl.SuspendTaskNumber=0; 00034 OsTaskCtrl.FreeList=(OS_TCB *)0; // Initial free task list 00035 OsTaskCtrl.SuspendList=(OS_TCB *)0; // Initial pending task list 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++){ // pust all task in free task list 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 }
INT8U OsTaskReadyListCheck | ( | INT8U | Priority | ) |
Definition at line 148 of file os_task.c.
00148 { // check if ready task list empty 00149 if(OsTaskCtrl.ReadyListHead[Priority]==(OS_TCB *)0) return FALSE; //empty 00150 else return TRUE; // not empty 00151 }
OS_TCB * OsTaskReadyTaskGet | ( | INT8U | Priority | ) |
Definition at line 185 of file os_task.c.
00185 { // get a task os_tcb from task list 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 }
void OsTaskReadyTaskPut | ( | OS_TCB * | pOsTcb | ) |
Definition at line 152 of file os_task.c.
00152 { 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; // no support priority level 00161 pOsTcb->Next=(OS_TCB *)0; // clean linking relationship 00162 pOsTcb->Prev=(OS_TCB *)0; // clean linking relationship 00163 pOsTcb->Status=OS_TASK_READY; // task status ready for run 00164 pOsTcb->PendingType=OS_PENDING_NONE; // reset pending type 00165 pOsTcb->TimeDelay=0; // reset delay timer 00166 pOsTcb->pEvent=(OS_EVENT *)0; // reset event 00167 Priority=pOsTcb->Priority; // get task priority 00168 pListHead=&OsTaskCtrl.ReadyListHead[Priority]; // get task list head related to priority 00169 pListTail=&OsTaskCtrl.ReadyListTail[Priority]; // get task list head related to priority 00170 pHead=OsTaskCtrl.ReadyListHead[Priority]; // get head os_tcb 00171 pTail=OsTaskCtrl.ReadyListTail[Priority]; // get tail os_tcb 00172 pListNumber=(INT8U *)&OsTaskCtrl.ReadyTaskNumber[Priority]; // get list task number 00173 if(pHead==(OS_TCB *)0){ // if list is empty, add task os_tcb to list head 00174 *pListHead=pOsTcb; 00175 *pListTail=pOsTcb; 00176 *pListNumber=1; 00177 } 00178 else{ // if list is not empty, add task os_tcb to list head 00179 pHead->Prev=pOsTcb; 00180 pOsTcb->Next=pHead; 00181 *pListHead=pOsTcb; 00182 *pListNumber+=1; 00183 } 00184 }
OS_TCB * OsTaskSuspendTaskGet | ( | INT8U | Id | ) |
Definition at line 109 of file os_task.c.
00109 { 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 }
INT8U OsTaskSuspendTaskListCheck | ( | INT8U | Id | ) |
Definition at line 97 of file os_task.c.
00097 { 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 }
void OsTaskSuspendTaskPut | ( | OS_TCB * | pOsTcb | ) |
Definition at line 131 of file os_task.c.
00131 { 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 }
OS_TASK_CONTROL OsTaskCtrl |