Go to the source code of this file.
Functions | |
void | OsMutexInit (void) |
OS_EVENT * | OsMutexCreat (void) |
INT8U | OsMutexDelete (OS_EVENT *pMutex) |
INT16U | OsMutexGet (OS_EVENT *pMutex) |
void | OsMutexPending (OS_EVENT *pMutex, INT16U TimeOut, INT8U *Error) |
INT8U | OsMutexPost (OS_EVENT *pMutex) |
OS_EVENT * OsMutexCreat | ( | void | ) |
Definition at line 20 of file os_mutex.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_MUTEX; 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 OsMutexDelete | ( | OS_EVENT * | pMutex | ) |
INT16U OsMutexGet | ( | OS_EVENT * | pMutex | ) |
Definition at line 38 of file os_mutex.c.
00038 { 00039 INT16U i; 00040 00041 if(pMutex==(OS_EVENT *)0) return 0; 00042 if(pMutex->EventType!=EVENT_TYPE_MUTEX) return 0; 00043 OS_ENTER_CRITICAL(); 00044 i=pMutex->EventCounter; 00045 if(pMutex->EventCounter>0) pMutex->EventCounter--; 00046 OS_EXIT_CRITICAL(); 00047 return i; 00048 }
void OsMutexInit | ( | void | ) |
void OsMutexPending | ( | OS_EVENT * | pMutex, | |
INT16U | TimeOut, | |||
INT8U * | Error | |||
) |
Definition at line 49 of file os_mutex.c.
00049 { 00050 OS_TCB *pOsTcb; 00051 00052 if(pMutex==(OS_EVENT *)0){ // check flag event 00053 *pError=OS_ERROR; 00054 return; 00055 } 00056 if(pMutex->EventType!=EVENT_TYPE_MUTEX){ // check event type 00057 *pError=OS_ERROR; 00058 return; 00059 } 00060 OS_ENTER_CRITICAL(); 00061 if(pMutex->EventCounter>0){ 00062 pMutex->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_MUTEX; // set pending type 00070 pOsTcb->pEvent=pMutex; // set pending event 00071 pOsTcb->TimeDelay=TimeOut; // set pending time out 00072 OsEventPendingTaskPut(pMutex,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 OsMutexPost | ( | OS_EVENT * | pMutex | ) |
Definition at line 79 of file os_mutex.c.
00079 { 00080 OS_TCB *pTcb; 00081 00082 if(pMutex==(OS_EVENT *)0) return OS_ERROR_NULL_POINTER; 00083 if(pMutex->EventType!=EVENT_TYPE_MUTEX) return OS_ERROR_EVENT_TYPE; 00084 OS_ENTER_CRITICAL(); 00085 if(pMutex->ListHead==(INT32U *)0) pMutex->EventCounter=1; // semaphore free...no task pending for it now 00086 else{ 00087 pTcb=(OS_TCB *)pMutex->ListHead; 00088 if(pTcb->Next==(OS_TCB *)0){ 00089 pMutex->ListHead=(INT32U *)0; 00090 pMutex->EntryNumber=0; 00091 } 00092 else{ 00093 pTcb->Next->Prev=(OS_TCB *)0; 00094 pMutex->ListHead=(INT32U *)pTcb->Next; 00095 pMutex->EntryNumber--; 00096 OsTaskReadyTaskPut(pTcb); // put 1st pending task back to scheduler 00097 } 00098 } 00099 OS_EXIT_CRITICAL(); 00100 return OS_NO_ERROR; 00101 }