os_core/os_task.c File Reference

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


Function Documentation

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 }


Variable Documentation

OS_TCB OsTask[OS_TASK_MAX]

Definition at line 13 of file os_task.c.

OS_TASK_CONTROL OsTaskCtrl

Definition at line 14 of file os_task.c.


Generated on Tue Sep 2 08:45:42 2008 for A Simple operation System using S3C2410 by  doxygen 1.5.6