os_core/os_mbox.c File Reference

Go to the source code of this file.

Functions

void OsMboxInit (void)
OS_EVENT * OsMboxCreat (void)
INT8U OsMboxDelete (OS_EVENT *pMbox)
INT16U OsMboxGet (OS_EVENT *pMbox)
void OsMboxPending (OS_EVENT *pMbox, INT16U TimeOut, INT8U *Error)
INT8U OsMboxPost (OS_EVENT *pMbox)


Function Documentation

OS_EVENT * OsMboxCreat ( void   ) 

Definition at line 20 of file os_mbox.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_MBOX;
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 OsMboxDelete ( OS_EVENT *  pMbox  ) 

Definition at line 37 of file os_mbox.c.

00037 {return TRUE;}

INT16U OsMboxGet ( OS_EVENT *  pMbox  ) 

Definition at line 38 of file os_mbox.c.

00038                                  {
00039     INT16U i;
00040     
00041     if(pMbox==(OS_EVENT *)0) return 0; 
00042     if(pMbox->EventType!=EVENT_TYPE_MBOX) return 0;
00043     OS_ENTER_CRITICAL();
00044     i=pMbox->EventCounter; 
00045     if(pMbox->EventCounter>0) pMbox->EventCounter--;
00046     OS_EXIT_CRITICAL();
00047     return i;
00048 }

void OsMboxInit ( void   ) 

Definition at line 19 of file os_mbox.c.

00019 {}

void OsMboxPending ( OS_EVENT *  pMbox,
INT16U  TimeOut,
INT8U *  Error 
)

Definition at line 49 of file os_mbox.c.

00049                                                                 {
00050     OS_TCB *pOsTcb;
00051     
00052     if(pMbox==(OS_EVENT *)0){                  // check flag event 
00053         *pError=OS_ERROR;
00054         return;
00055     }     
00056     if(pMbox->EventType!=EVENT_TYPE_MBOX){     // check event type 
00057         *pError=OS_ERROR;
00058         return;
00059     }     
00060     OS_ENTER_CRITICAL();
00061     if(pMbox->EventCounter>0){
00062         pMbox->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_MBOX;       // set pending type
00070     pOsTcb->pEvent=pMbox;                      // set pending event
00071     pOsTcb->TimeDelay=TimeOut;                 // set pending time out  
00072     OsEventPendingTaskPut(pMbox,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 OsMboxPost ( OS_EVENT *  pMbox  ) 

Definition at line 79 of file os_mbox.c.

00079                                  {
00080     OS_TCB *pTcb;
00081     
00082     if(pMbox==(OS_EVENT *)0) return OS_ERROR_NULL_POINTER;
00083     if(pMbox->EventType!=EVENT_TYPE_MBOX) return OS_ERROR_EVENT_TYPE;
00084     OS_ENTER_CRITICAL();
00085     if(pMbox->ListHead==(INT32U *)0) pMbox->EventCounter=1; // semaphore free...no task pending for it now
00086     else{
00087         pTcb=(OS_TCB *)pMbox->ListHead;
00088         if(pTcb->Next==(OS_TCB *)0){
00089             pMbox->ListHead=(INT32U *)0;
00090             pMbox->EntryNumber=0;
00091         }
00092         else{
00093             pTcb->Next->Prev=(OS_TCB *)0;
00094             pMbox->ListHead=(INT32U *)pTcb->Next;            
00095             pMbox->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