00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "includes.h"
00011
00012 void OsFlagInit(void);
00013 OS_EVENT *OsFlagCreat(void);
00014 INT8U OsFlagDelete(OS_EVENT *pFlag);
00015 INT16U OsFlagGet(OS_EVENT *pFlag);
00016 void OsFlagPending(OS_EVENT *pFlag,INT16U TimeOut,INT8U *Error);
00017 INT8U OsFlagPost(OS_EVENT *pFlag);
00018
00019 void OsFlagInit(void){}
00020 OS_EVENT *OsFlagCreat(void){
00021 OS_EVENT *pEvent;
00022
00023 OS_ENTER_CRITICAL();
00024 pEvent=OsEventFreeEventGet();
00025 OS_EXIT_CRITICAL();
00026 if(pEvent!=(OS_EVENT *)0){
00027 pEvent->EventType=EVENT_TYPE_FLAG;
00028 pEvent->EventCounter=1;
00029 pEvent->ListHead=(INT32U *)0;
00030 pEvent->EntryNumber=0;
00031 pEvent->Prev=(struct os_event *)0;
00032 pEvent->Next=(struct os_event *)0;
00033 OsTimeEventListPut(pEvent);
00034 }
00035 return pEvent;
00036 }
00037 INT8U OsFlagDelete(OS_EVENT *pFlag){return TRUE;}
00038 INT16U OsFlagGet(OS_EVENT *pFlag){
00039 INT16U i;
00040
00041 if(pFlag==(OS_EVENT *)0) return 0;
00042 if(pFlag->EventType!=EVENT_TYPE_FLAG) return 0;
00043 OS_ENTER_CRITICAL();
00044 i=pFlag->EventCounter;
00045 if(pFlag->EventCounter>0) pFlag->EventCounter--;
00046 OS_EXIT_CRITICAL();
00047 return i;
00048 }
00049 void OsFlagPending(OS_EVENT *pFlag,INT16U TimeOut,INT8U *pError){
00050 OS_TCB *pOsTcb;
00051
00052 if(pFlag==(OS_EVENT *)0){
00053 *pError=OS_ERROR;
00054 return;
00055 }
00056 if(pFlag->EventType!=EVENT_TYPE_FLAG){
00057 *pError=OS_ERROR;
00058 return;
00059 }
00060 OS_ENTER_CRITICAL();
00061 if(pFlag->EventCounter>0){
00062 pFlag->EventCounter--;
00063 OS_EXIT_CRITICAL();
00064 *pError=OS_NO_ERROR;
00065 return;
00066 }
00067 pOsTcb=(OS_TCB *)OSTCBCur;
00068 pOsTcb->Status=OS_TASK_PENDING;
00069 pOsTcb->PendingType=OS_PENDING_FLAG;
00070 pOsTcb->pEvent=pFlag;
00071 pOsTcb->TimeDelay=TimeOut;
00072 OsEventPendingTaskPut(pFlag,pOsTcb);
00073 OsSchedulerRunNext();
00074 OS_EXIT_CRITICAL();
00075 if(pOsTcb->TimeDelay==0) *pError=OS_ERROR_TIMEOUT;
00076 else *pError=OS_NO_ERROR;
00077 return;
00078 }
00079 INT8U OsFlagPost(OS_EVENT *pFlag){
00080 OS_TCB *pTcb;
00081
00082 if(pFlag==(OS_EVENT *)0) return OS_ERROR_NULL_POINTER;
00083 if(pFlag->EventType!=EVENT_TYPE_FLAG) return OS_ERROR_EVENT_TYPE;
00084 OS_ENTER_CRITICAL();
00085 if(pFlag->ListHead==(INT32U *)0) pFlag->EventCounter=1;
00086 else{
00087 pTcb=(OS_TCB *)pFlag->ListHead;
00088 if(pTcb->Next==(OS_TCB *)0){
00089 pFlag->ListHead=(INT32U *)0;
00090 pFlag->EntryNumber=0;
00091 }
00092 else{
00093 pTcb->Next->Prev=(OS_TCB *)0;
00094 pFlag->ListHead=(INT32U *)pTcb->Next;
00095 pFlag->EntryNumber--;
00096 OsTaskReadyTaskPut(pTcb);
00097 }
00098 }
00099 OS_EXIT_CRITICAL();
00100 return OS_NO_ERROR;
00101 }