00001 /******************** 00002 *Project: 80X86 32BIT MULTI TASKING OPERATING SYSTEM 00003 *Description: Event management of multi-tasking kernel 00004 * 00005 *Filename:os_event.c 00006 *Author: Book Chen 00007 *Date: 2010.01.01 00008 ********************* 00009 */ 00010 #include "includes.h" 00011 00012 OS_EVENT_CONTROL OsEventCtrl; 00013 00014 void OsEventInit(void){ 00015 OsEventCtrl.EventNumber=0; 00016 OsEventCtrl.EventList=(OS_EVENT *)OS_NULL; 00017 } 00018 00019 OS_BOOL OsEventAdd(OS_EVENT *pEvent,U8 *pEventName,U32 EventType){ 00020 OS_EVENT *pOsEvent; 00021 U8 i; 00022 #if(OS_CRITICAL_METHOD==3) 00023 U32 CpuEflags; 00024 #endif 00025 00026 if(pEvent==(OS_EVENT *)OS_NULL) return OS_FALSE; 00027 OsEnterCritical(); 00028 for(i=0;i<OS_NAME_STRING_MAX;i++) pEvent->Name[i]=0; 00029 if(pEventName==(U8 *)OS_NULL) OsLibStringCopy(&pEvent->Name,OsUnkown); 00030 else OsLibStringCopy(&pEvent->Name,pEventName); 00031 pEvent->Type=EventType; 00032 pEvent->ListHead=(U32 *)OS_NULL; 00033 pEvent->ListTail=(U32 *)OS_NULL; 00034 pEvent->EntryNumber=0; 00035 pEvent->Prev=(OS_EVENT *)OS_NULL; 00036 pEvent->Next=(OS_EVENT *)OS_NULL; 00037 if(OsEventCtrl.EventList==(OS_EVENT *)OS_NULL){ 00038 OsEventCtrl.EventList=pEvent; 00039 } 00040 else{ 00041 pOsEvent=OsEventCtrl.EventList; 00042 pOsEvent->Prev=pEvent; 00043 pEvent->Next=pOsEvent; 00044 OsEventCtrl.EventList=pEvent; 00045 } 00046 OsExitCritical(); 00047 return OS_TRUE; 00048 } 00049 00050 OS_BOOL OsEventDelete(OS_EVENT *pEvent){ 00051 OS_EVENT *pOsEvent; 00052 #if(OS_CRITICAL_METHOD==3) 00053 U32 CpuEflags; 00054 #endif 00055 00056 if(pEvent==(OS_EVENT *)OS_NULL) return OS_FALSE; 00057 if(OsEventCtrl.EventList==(OS_EVENT *)OS_NULL) return OS_FALSE; 00058 OsEnterCritical(); 00059 pOsEvent=OsEventCtrl.EventList; 00060 while(pOsEvent!=(OS_EVENT *)OS_NULL){ 00061 if(pOsEvent==pEvent){ //event found 00062 if(pOsEvent==OsEventCtrl.EventList){ 00063 if(OsEventCtrl.EventList->Next!=(OS_EVENT *)OS_NULL){ 00064 OsEventCtrl.EventList->Next->Prev=(OS_EVENT *)OS_NULL; 00065 } 00066 OsEventCtrl.EventList=OsEventCtrl.EventList->Next; 00067 } 00068 else{ 00069 pOsEvent->Prev->Next=pOsEvent->Next; 00070 pOsEvent->Next->Prev=pOsEvent->Prev; 00071 pOsEvent->Prev=(OS_EVENT *)OS_NULL; 00072 pOsEvent->Next=(OS_EVENT *)OS_NULL; 00073 } 00074 return OS_TRUE; 00075 } 00076 else pOsEvent=pOsEvent->Next; 00077 } 00078 OsExitCritical(); 00079 return OS_FALSE; 00080 } 00081 00082 OS_BOOL OsEventTaskPut(OS_EVENT *pEvent,OS_TASKENTRY *pTask){ 00083 OS_TASKENTRY **pListHead; 00084 OS_TASKENTRY **pListTail; 00085 OS_TASKENTRY *pHeadTask; 00086 OS_TASKENTRY *pTailTask; 00087 OS_EVENT *pOsEvent; 00088 00089 if(pEvent==(OS_EVENT *)OS_NULL) return OS_FALSE; 00090 if(pTask==(OS_TASKENTRY *)OS_NULL) return OS_FALSE; 00091 pTask->Next=(OS_TASKENTRY *)OS_NULL; 00092 pTask->Prev=(OS_TASKENTRY *)OS_NULL; 00093 pListHead=(OS_TASKENTRY **)(&pEvent->ListHead); 00094 pListTail=(OS_TASKENTRY **)(&pEvent->ListTail); 00095 pHeadTask=(OS_TASKENTRY *)pEvent->ListHead; 00096 pTailTask=(OS_TASKENTRY *)pEvent->ListTail; 00097 if(pHeadTask==(OS_TASKENTRY *)OS_NULL){ 00098 *pListHead=pTask; 00099 *pListTail=pTask; 00100 } 00101 else{ 00102 pTask->Prev=pTailTask; 00103 pTailTask->Next=pTask; 00104 *pListTail=pTask; 00105 } 00106 return OS_TRUE; 00107 } 00108 00109 OS_TASKENTRY *OsEventTaskGet(OS_EVENT *pEvent){ 00110 OS_TASKENTRY **pListHead; 00111 OS_TASKENTRY **pListTail; 00112 OS_TASKENTRY *pHeadTask; 00113 OS_TASKENTRY *pTailTask; 00114 OS_TASKENTRY *pOsTask; 00115 00116 if(pEvent==(OS_EVENT *)OS_NULL) return (OS_TASKENTRY *)OS_NULL; 00117 if(pEvent->ListHead==(U32 *)OS_NULL) return (OS_TASKENTRY *)OS_NULL; 00118 pListHead=(OS_TASKENTRY **)(&pEvent->ListHead); 00119 pListTail=(OS_TASKENTRY **)(&pEvent->ListTail); 00120 pHeadTask=(OS_TASKENTRY *)pEvent->ListHead; 00121 pTailTask=(OS_TASKENTRY *)pEvent->ListTail; 00122 if(pHeadTask==pTailTask){ 00123 pOsTask=pHeadTask; 00124 *pListHead=(OS_TASKENTRY *)OS_NULL; 00125 *pListTail=(OS_TASKENTRY *)OS_NULL; 00126 } 00127 else{ 00128 pOsTask=pHeadTask; 00129 pHeadTask=pHeadTask->Next; 00130 pHeadTask->Prev=(OS_TASKENTRY *)OS_NULL; 00131 *pListHead=pHeadTask; 00132 } 00133 pOsTask->Next=(OS_TASKENTRY *)OS_NULL; 00134 pOsTask->Prev=(OS_TASKENTRY *)OS_NULL; 00135 return pOsTask; 00136 } 00137 00138 OS_BOOL OsEventWait(OS_EVENT *pEvent,U16 TimeTick){ 00139 OS_TASKENTRY *pOsTask; 00140 #if(OS_CRITICAL_METHOD==3) 00141 U32 CpuEflags; 00142 #endif 00143 00144 if(pEvent==(OS_EVENT *)OS_NULL) return OS_FALSE; 00145 OsEnterCritical(); 00146 pOsTask=(OS_TASKENTRY *)OsTaskCurrent; 00147 pOsTask->Status=OS_TASK_PENDING; 00148 pOsTask->PendingType=OS_PENDING_EVENT; 00149 pOsTask->TimeDelay=TimeTick; 00150 OsEventTaskPut(pEvent,pOsTask); 00151 OsTaskSwitchOut(); 00152 OsExitCritical(); 00153 return OS_TRUE; 00154 } 00155 00156 void OsEventUp(OS_EVENT *pEvent){ 00157 OS_TASKENTRY *pOsTask; 00158 #if(OS_CRITICAL_METHOD==3) 00159 U32 CpuEflags; 00160 #endif 00161 00162 if(pEvent->ListHead==(U32 *)OS_NULL) return; 00163 OsEnterCritical(); 00164 while((pOsTask=OsEventTaskGet(pEvent))!=(OS_TASKENTRY *)OS_NULL){ 00165 OsTaskReadyTaskPut(pOsTask); 00166 } 00167 OsExitCritical(); 00168 } 00169 00170 OS_BOOL OsEventTaskFind(U8 *pTaskName){ 00171 OS_EVENT *pOsEvent; 00172 OS_TASKENTRY *pOsTask; 00173 00174 pOsEvent=OsEventCtrl.EventList; 00175 while(pOsEvent!=(OS_EVENT *)OS_NULL){ 00176 pOsTask=(OS_TASKENTRY *)pOsEvent->ListHead; 00177 while(pOsTask!=(OS_TASKENTRY *)OS_NULL){ 00178 if(OsLibStringCompare((U8 *)pOsTask->Name,pTaskName)==OS_TRUE){ 00179 return OS_TRUE; 00180 } 00181 else pOsTask=pOsTask->Next; 00182 } 00183 pOsEvent=pOsEvent->Next; 00184 } 00185 return OS_FALSE; 00186 } 00187 00188 00189 OS_BOOL OsEventTaskDelete(U8 *pTaskName){ 00190 OS_EVENT *pOsEvent; 00191 OS_TASKENTRY *pOsTask; 00192 00193 pOsEvent=OsEventCtrl.EventList; 00194 while(pOsEvent!=(OS_EVENT *)OS_NULL){ 00195 pOsTask=(OS_TASKENTRY *)pOsEvent->ListHead; 00196 while(pOsTask!=(OS_TASKENTRY *)OS_NULL){ 00197 if(OsLibStringCompare((U8 *)pOsTask->Name,pTaskName)==OS_TRUE){ 00198 if(pOsTask==(OS_TASKENTRY *)pOsEvent->ListHead){ 00199 if(pOsTask==(OS_TASKENTRY *)pOsEvent->ListTail){ 00200 pOsEvent->ListHead=(U32 *)OS_NULL; 00201 pOsEvent->ListTail=(U32 *)OS_NULL; 00202 OsTaskFreeTaskPut(pOsTask); 00203 } 00204 else{ 00205 pOsTask->Next->Prev=(OS_TASKENTRY *)OS_NULL; 00206 pOsEvent->ListHead=(U32 *)pOsTask->Next; 00207 OsTaskFreeTaskPut(pOsTask); 00208 } 00209 } 00210 else if(pOsTask==(OS_TASKENTRY *)pOsEvent->ListTail){ 00211 pOsTask->Prev->Next=(OS_TASKENTRY *)OS_NULL; 00212 pOsEvent->ListTail=(U32 *)pOsTask->Prev; 00213 OsTaskFreeTaskPut(pOsTask); 00214 } 00215 else{ 00216 pOsTask->Prev->Next=pOsTask->Next; 00217 pOsTask->Next->Prev=pOsTask->Prev; 00218 OsTaskFreeTaskPut(pOsTask); 00219 } 00220 return OS_TRUE; 00221 } 00222 else pOsTask=pOsTask->Next; 00223 } 00224 pOsEvent=pOsEvent->Next; 00225 } 00226 return OS_FALSE; 00227 }
1.5.9