00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "includes.h"
00011
00012 OS_EVENT OsEvent[OS_EVENT_MAX];
00013 OS_EVENT *EventFreeList;
00014 OS_EVENT_CONTROL OsEventCtrl;
00015
00016 void OsEventInit(void);
00017 INT8U OsEventFreeListCheck(void);
00018 void OsEventFreeEventPut(OS_EVENT *pOsEvent);
00019 OS_EVENT *OsEventFreeEventGet(void);
00020
00021 void OsEventInit(void){
00022 INT8U i;
00023
00024 OsEventCtrl.EntryNumber=0;
00025 EventFreeList=(OS_EVENT *)0;
00026 for(i=0;i<OS_EVENT_MAX;i++) OsEventFreeEventPut(&OsEvent[i]);
00027 }
00028 INT8U OsEventFreeListCheck(void){
00029 if(EventFreeList==(OS_EVENT *)0) return FALSE;
00030 else return TRUE;
00031 }
00032 void OsEventFreeEventPut(OS_EVENT *pOsEvent){
00033 pOsEvent->Next=(OS_EVENT *)0;
00034 pOsEvent->Prev=(OS_EVENT *)0;
00035 if(OsEventCtrl.EntryNumber==0){
00036 EventFreeList=pOsEvent;
00037 OsEventCtrl.EntryNumber=1;
00038 }
00039 else{
00040 pOsEvent->Next=EventFreeList;
00041 EventFreeList->Prev=pOsEvent;
00042 EventFreeList=pOsEvent;
00043 OsEventCtrl.EntryNumber++;
00044 }
00045 }
00046 OS_EVENT *OsEventFreeEventGet(void){
00047 OS_EVENT *pOsEvent;
00048
00049 if(EventFreeList==(OS_EVENT *)0) return (OS_EVENT *)0;
00050 if(EventFreeList->Next==(OS_EVENT *)0){
00051 pOsEvent=EventFreeList;
00052 EventFreeList=(OS_EVENT *)0;
00053 OsEventCtrl.EntryNumber=0;
00054 }
00055 else{
00056 pOsEvent=EventFreeList;
00057 EventFreeList=EventFreeList->Next;
00058 EventFreeList->Prev=(OS_EVENT *)0;
00059 OsEventCtrl.EntryNumber--;
00060 }
00061 pOsEvent->Prev=(OS_EVENT *)0;
00062 pOsEvent->Next=(OS_EVENT *)0;
00063 return pOsEvent;
00064 }
00065 void OsEventPendingTaskPut(OS_EVENT *pOsEvent,OS_TCB *pOsTcb){
00066 OS_TCB *pTcb;
00067
00068 pOsTcb->Next=(OS_TCB *)0;
00069 pOsTcb->Prev=(OS_TCB *)0;
00070 if(pOsEvent->ListHead==(INT32U *)0){
00071 pOsEvent->ListHead=(INT32U *)pOsTcb;
00072 pOsEvent->EntryNumber=1;
00073 }
00074 else{
00075 pTcb=(OS_TCB *)pOsEvent->ListHead;
00076 while(pTcb->Next!=(OS_TCB *)0) pTcb=pTcb->Next;
00077 pTcb->Next=pOsTcb;
00078 pOsTcb->Prev=pTcb;
00079 pOsEvent->EntryNumber++;
00080 }
00081 }
00082 OS_TCB *OsEventPendingTaskGet(OS_EVENT *pOsEvent){
00083 OS_TCB *pTcb;
00084
00085 if(pOsEvent->ListHead==(INT32U *)0) return (OS_TCB *)0;
00086 pTcb=(OS_TCB *)pOsEvent->ListHead;
00087 if(pTcb->Next==(OS_TCB *)0){
00088 pOsEvent->ListHead=(INT32U *)0;
00089 pOsEvent->EntryNumber=0;
00090 return pTcb;
00091 }
00092 else{
00093 pOsEvent->ListHead=(INT32U *)pTcb->Next;
00094 pTcb->Next->Prev=(OS_TCB *)0;
00095 pOsEvent->EntryNumber--;
00096 return pTcb;
00097 }
00098 }
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113