00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "includes.h"
00013
00014 OS_EVENT *OsTimeEventList;
00015 OS_TCB *OsTimeDelayList;
00016 OS_TIME_CONTROL OsTimeCtrl;
00017
00018 void OsTimeInit(void);
00019 void OsTimeTickHandler(void);
00020 void OsTimeDelayTaskPut(OS_TCB *pOsTcb);
00021 void OsTimeDelay(INT16U Ticks);
00022 void OsTimeEventListPut(OS_EVENT *pOsEvent);
00023 INT8U OsTimeEventListDelete(OS_EVENT *pOsEvent);
00024
00025 void OsTimeInit(void){
00026 OsTimeDelayList=(OS_TCB *)0;
00027 OsTimeEventList=(OS_EVENT *)0;
00028 OsTimeCtrl.EntryNumber=0;
00029 OsTimeCtrl.EventListNumber=0;
00030 OsTimeCtrl.Time=0;
00031 }
00032 void OsTimeTickHandler(void){
00033 OS_TCB *pTcb,*pTcb2,*pTaskListHead;
00034 OS_EVENT *pEvent;
00035
00036 OsTimeCtrl.Time++;
00037 if(OsTimeDelayList==(OS_TCB *)0) return;
00038 pTcb=OsTimeDelayList;
00039 while(pTcb!=(OS_TCB *)0){
00040 if(pTcb->TimeDelay!=0) pTcb->TimeDelay--;
00041 if(pTcb->TimeDelay==0){
00042 pTcb2=pTcb;
00043 if(pTcb2==OsTimeDelayList){
00044 if(OsTimeDelayList->Next==(OS_TCB *)0){
00045 OsTimeDelayList=(OS_TCB *)0;
00046 pTcb=(OS_TCB *)0;
00047 }
00048 else{
00049 OsTimeDelayList=OsTimeDelayList->Next;
00050 OsTimeDelayList->Prev=(OS_TCB *)0;
00051 pTcb=OsTimeDelayList;
00052 }
00053 }
00054 else if(pTcb2->Next==(OS_TCB *)0){
00055 pTcb2->Prev->Next=(OS_TCB *)0;
00056 pTcb=(OS_TCB *)0;
00057 }
00058 else{
00059 pTcb2->Prev->Next=pTcb2->Next;
00060 pTcb2->Next->Prev=pTcb2->Prev;
00061 pTcb=pTcb2->Next;
00062 }
00063 OsTimeCtrl.EntryNumber--;
00064 OsTaskReadyTaskPut(pTcb2);
00065 }
00066 else pTcb=pTcb->Next;
00067 }
00068 return;
00069
00070 pEvent=OsTimeEventList;
00071 while(pEvent!=(OS_EVENT *)0){
00072 pTaskListHead=(OS_TCB *)pEvent->ListHead;
00073 pTcb=pTaskListHead;
00074 while(pTcb!=(OS_TCB *)0){
00075 if(pTcb->TimeDelay!=0) pTcb->TimeDelay--;
00076 if(pTcb->TimeDelay==0){
00077 pTcb2=pTcb;
00078 if(pTcb2==pTaskListHead){
00079 if(pTaskListHead->Next==(OS_TCB *)0){
00080 pEvent->ListHead=(INT32U *)0;
00081 pTcb=(OS_TCB *)0;
00082 }
00083 else{
00084 pEvent->ListHead=(INT32U *)pTaskListHead->Next;
00085 pTaskListHead=pTaskListHead->Next;
00086 pTaskListHead->Prev=(OS_TCB *)0;
00087 pTcb=pTaskListHead;
00088 }
00089 }
00090 else if(pTcb2->Next==(OS_TCB *)0){
00091 pTcb2->Prev->Next=(OS_TCB *)0;
00092 pTcb=(OS_TCB *)0;
00093 }
00094 else{
00095 pTcb2->Prev->Next=pTcb2->Next;
00096 pTcb2->Next->Prev=pTcb2->Prev;
00097 pTcb=pTcb2->Next;
00098 }
00099 pEvent->EntryNumber--;
00100 OsTaskReadyTaskPut(pTcb2);
00101 }
00102 else pTcb=pTcb->Next;
00103 }
00104 pEvent=pEvent->Next;
00105 }
00106 }
00107 void OsTimeDelayTaskPut(OS_TCB *pOsTcb){
00108 pOsTcb->Next=(OS_TCB *)0;
00109 pOsTcb->Prev=(OS_TCB *)0;
00110 if(OsTimeCtrl.EntryNumber==0){
00111 OsTimeDelayList=pOsTcb;
00112 OsTimeCtrl.EntryNumber=1;
00113 }
00114 else{
00115 pOsTcb->Next=OsTimeDelayList;
00116 OsTimeDelayList->Prev=pOsTcb;
00117 OsTimeDelayList=pOsTcb;
00118 OsTimeCtrl.EntryNumber++;
00119 }
00120 }
00121 void OsTimeDelay(INT16U Ticks){
00122 OS_TCB *pOsTcb;
00123
00124 #if(OS_TIME_EVENT_ENABLE==0)
00125 return;
00126 #endif
00127 OS_ENTER_CRITICAL();
00128 if(Ticks==0){
00129 OS_EXIT_CRITICAL();
00130 return;
00131 }
00132 pOsTcb=(OS_TCB *)OSTCBCur;
00133 pOsTcb->Status=OS_TASK_PENDING;
00134 pOsTcb->PendingType=OS_PENDING_TIME;
00135 pOsTcb->TimeDelay=Ticks;
00136 OsTimeDelayTaskPut(pOsTcb);
00137 OsSchedulerRunNext();
00138 OS_EXIT_CRITICAL();
00139 }
00140 void OsTimeEventListPut(OS_EVENT *pOsEvent){
00141 pOsEvent->Next=(OS_EVENT *)0;
00142 pOsEvent->Prev=(OS_EVENT *)0;
00143 if(OsTimeEventList==(OS_EVENT *)0){
00144 OsTimeEventList=pOsEvent;
00145 OsTimeCtrl.EventListNumber=1;
00146 }
00147 else{
00148 pOsEvent->Next=OsTimeEventList;
00149 OsTimeEventList->Prev=pOsEvent;
00150 OsTimeEventList=pOsEvent;
00151 OsTimeCtrl.EventListNumber++;
00152 }
00153 }
00154 INT8U OsTimeEventListDelete(OS_EVENT *pOsEvent){
00155 OS_EVENT *pEvent;
00156
00157 if(OsTimeEventList==(OS_EVENT *)0) return FALSE;
00158 pEvent=OsTimeEventList;
00159 while(pEvent!=(OS_EVENT *)0){
00160 if(pOsEvent==pEvent){
00161 if(pEvent==OsTimeEventList){
00162 if(OsTimeEventList->Next==(OS_EVENT *)0){
00163 OsTimeEventList=(OS_EVENT *)0;
00164 }
00165 else{
00166 OsTimeEventList=OsTimeEventList->Next;
00167 OsTimeEventList->Prev=(OS_EVENT *)0;
00168 }
00169 }
00170 else if(pEvent->Next==(OS_EVENT *)0){
00171 pEvent->Prev->Next=(OS_EVENT *)0;
00172 }
00173 else{
00174 pEvent->Prev->Next=pEvent->Next;
00175 pEvent->Next->Prev=pEvent->Prev;
00176 }
00177 OsTimeCtrl.EventListNumber--;
00178
00179 return TRUE;
00180 }
00181 else pEvent=pEvent->Next;
00182 }
00183 return FALSE;
00184 }
00185
00186