00001 /*********************************** 00002 *Project: 80X86 32BIT MULTI TASKING OPERATING SYSTEM 00003 *Description: Time management of multi-tasking kernel 00004 * 00005 *File: os_time.c 00006 *Author: Book Chen 00007 *Date: 2010.01.01 00008 ************************************ 00009 */ 00010 #include "includes.h" 00011 00012 const U8 TimeName[]="OSTIME"; 00013 OS_TIME_CONTROL OsTimeCtrl; 00014 00015 void OsTimeInit(void){ 00016 OsTimeCtrl.Time=0; 00017 OsEventAdd(&OsTimeCtrl.TimeEvent,&TimeName,OS_EVENT_TIME); 00018 } 00019 00020 void OsTimeEventHandler(void){ 00021 OS_TASKENTRY *pOsTask,*pOsTask2; 00022 OS_TASKENTRY *pHeadTask,*pTailTask; 00023 OS_TASKENTRY **pListHead,**pListTail; 00024 OS_EVENT *pEvent; 00025 OS_RESOURCE *pResource; 00026 #if(OS_CRITICAL_METHOD==3) 00027 U32 CpuEflags; 00028 #endif 00029 00030 OsEnterCritical(); 00031 OsTimeCtrl.Time++; 00032 pEvent=OsEventCtrl.EventList; 00033 while(pEvent!=(OS_EVENT *)OS_NULL){ 00034 pListHead=(OS_TASKENTRY **)(&pEvent->ListHead); 00035 pListTail=(OS_TASKENTRY **)(&pEvent->ListTail); 00036 pHeadTask=(OS_TASKENTRY *)pEvent->ListHead; 00037 pTailTask=(OS_TASKENTRY *)pEvent->ListTail; 00038 pOsTask=pHeadTask; 00039 while(pOsTask!=(OS_TASKENTRY *)OS_NULL){ 00040 if(pOsTask->TimeDelay!=0) pOsTask->TimeDelay--; 00041 if(pOsTask->TimeDelay==0){ 00042 pOsTask2=pOsTask; 00043 if(pOsTask==pHeadTask){ 00044 if(pHeadTask->Next==(OS_TASKENTRY *)OS_NULL){ 00045 pEvent->ListHead=(U32 *)OS_NULL; 00046 pEvent->ListTail=(U32 *)OS_NULL; 00047 pOsTask=(OS_TASKENTRY *)OS_NULL; 00048 } 00049 else{ 00050 pEvent->ListHead=(U32 *)pHeadTask->Next; 00051 pHeadTask=pHeadTask->Next; 00052 pHeadTask->Prev=(OS_TASKENTRY *)OS_NULL; 00053 pOsTask=pHeadTask; 00054 } 00055 } 00056 else if(pOsTask==pTailTask){ 00057 pEvent->ListTail=(U32 *)pTailTask->Prev; 00058 pTailTask=pTailTask->Prev; 00059 pTailTask->Next=(OS_TASKENTRY *)OS_NULL; 00060 pOsTask=(OS_TASKENTRY *)OS_NULL; 00061 } 00062 else{ 00063 pOsTask->Prev->Next=pOsTask->Next; 00064 pOsTask->Next->Prev=pOsTask->Prev; 00065 pOsTask=pOsTask->Next; 00066 } 00067 OsTaskReadyTaskPut(pOsTask2); 00068 } 00069 else pOsTask=pOsTask->Next; 00070 } 00071 pEvent=pEvent->Next; 00072 } 00073 pResource=OsResourceCtrl.ResourceList; 00074 while(pResource!=(OS_EVENT *)OS_NULL){ 00075 pListHead=(OS_TASKENTRY **)(&pResource->ListHead); 00076 pListTail=(OS_TASKENTRY **)(&pResource->ListTail); 00077 pHeadTask=(OS_TASKENTRY *)pResource->ListHead; 00078 pTailTask=(OS_TASKENTRY *)pResource->ListTail; 00079 pOsTask=pHeadTask; 00080 while(pOsTask!=(OS_TASKENTRY *)OS_NULL){ 00081 if(pOsTask->TimeDelay!=0) pOsTask->TimeDelay--; 00082 if(pOsTask->TimeDelay==0){ 00083 pOsTask2=pOsTask; 00084 if(pOsTask==pHeadTask){ 00085 if(pHeadTask->Next==(OS_TASKENTRY *)OS_NULL){ 00086 pResource->ListHead=(U32 *)OS_NULL; 00087 pResource->ListTail=(U32 *)OS_NULL; 00088 pOsTask=(OS_TASKENTRY *)OS_NULL; 00089 } 00090 else{ 00091 pResource->ListHead=(U32 *)pHeadTask->Next; 00092 pHeadTask=pHeadTask->Next; 00093 pHeadTask->Prev=(OS_TASKENTRY *)OS_NULL; 00094 pOsTask=pHeadTask; 00095 } 00096 } 00097 else if(pOsTask==pTailTask){ 00098 pResource->ListTail=(U32 *)pTailTask->Prev; 00099 pTailTask=pTailTask->Prev; 00100 pTailTask->Next=(OS_TASKENTRY *)OS_NULL; 00101 pOsTask=(OS_TASKENTRY *)OS_NULL; 00102 } 00103 else{ 00104 pOsTask->Prev->Next=pOsTask->Next; 00105 pOsTask->Next->Prev=pOsTask->Prev; 00106 pOsTask=pOsTask->Next; 00107 } 00108 OsTaskReadyTaskPut(pOsTask2); 00109 } 00110 else pOsTask=pOsTask->Next; 00111 } 00112 pResource=pResource->Next; 00113 } 00114 OsExitCritical(); 00115 } 00116 00117 void OsTimeDelay(U16 Ticks){ 00118 OS_TASKENTRY *pOsTask; 00119 #if(OS_CRITICAL_METHOD==3) 00120 U32 CpuEflags; 00121 #endif 00122 00123 OsEnterCritical(); 00124 if(Ticks==0){ 00125 OsExitCritical(); 00126 return; 00127 } 00128 pOsTask=(OS_TASKENTRY *)OsTaskCurrent; 00129 pOsTask->Status=OS_TASK_PENDING; 00130 pOsTask->PendingType=OS_PENDING_TIME; 00131 pOsTask->TimeDelay=Ticks; 00132 OsEventTaskPut(&OsTimeCtrl.TimeEvent,pOsTask); 00133 OsTaskSwitchOut(); 00134 OsExitCritical(); 00135 } 00136
1.5.9