os_core/os_flag.c File Reference

Go to the source code of this file.

Functions

void OsFlagInit (void)
OS_EVENT * OsFlagCreat (void)
INT8U OsFlagDelete (OS_EVENT *pFlag)
INT16U OsFlagGet (OS_EVENT *pFlag)
void OsFlagPending (OS_EVENT *pFlag, INT16U TimeOut, INT8U *Error)
INT8U OsFlagPost (OS_EVENT *pFlag)


Function Documentation

OS_EVENT * OsFlagCreat ( void   ) 

Definition at line 20 of file os_flag.c.

00020                            {
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); // hook event to timer event list
00034     }
00035     return pEvent;
00036 }

INT8U OsFlagDelete ( OS_EVENT *  pFlag  ) 

Definition at line 37 of file os_flag.c.

00037 {return TRUE;}

INT16U OsFlagGet ( OS_EVENT *  pFlag  ) 

Definition at line 38 of file os_flag.c.

00038                                  {
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 }

void OsFlagInit ( void   ) 

Definition at line 19 of file os_flag.c.

00019 {}

void OsFlagPending ( OS_EVENT *  pFlag,
INT16U  TimeOut,
INT8U *  Error 
)

Definition at line 49 of file os_flag.c.

00049                                                                 {
00050     OS_TCB *pOsTcb;
00051     
00052     if(pFlag==(OS_EVENT *)0){                  // check flag event 
00053         *pError=OS_ERROR;
00054         return;
00055     }     
00056     if(pFlag->EventType!=EVENT_TYPE_FLAG){     // check event type 
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;            // set task pending s.t. scheduler doesn't run it. 
00069     pOsTcb->PendingType=OS_PENDING_FLAG;       // set pending type
00070     pOsTcb->pEvent=pFlag;                      // set pending event
00071     pOsTcb->TimeDelay=TimeOut;                 // set pending time out  
00072     OsEventPendingTaskPut(pFlag,pOsTcb);     // put this task in event list
00073     OsSchedulerRunNext();                           // find out next task to run 
00074     OS_EXIT_CRITICAL();                        // this line execute when return from semaphore waiting list
00075     if(pOsTcb->TimeDelay==0) *pError=OS_ERROR_TIMEOUT;
00076     else *pError=OS_NO_ERROR;                  // no error...pending to weakup success!!
00077     return;                                    // leave pending status
00078 }

INT8U OsFlagPost ( OS_EVENT *  pFlag  ) 

Definition at line 79 of file os_flag.c.

00079                                  {
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; // semaphore free...no task pending for it now
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); // put 1st pending task back to scheduler       
00097         }    
00098     }
00099     OS_EXIT_CRITICAL(); 
00100     return OS_NO_ERROR;
00101 }


Generated on Tue Sep 2 08:45:42 2008 for A Simple operation System using S3C2410 by  doxygen 1.5.6