?? os_mutex.c
字號(hào):
/*
*******************************************************************************
*
* MicroROS
*
* Copyright (C) 2007 <amwox@163.com>
*
* Description : 互斥型信號(hào)量
*
* File : os_mutex.c
* Author : amwox
* Edition : V0.10
* History : 2007-11-18 created
* 2008-01-28 增加事件列表指針,并對(duì)處理方式作了相應(yīng)的變化
*******************************************************************************
*/
#include "..\include\MicroROS.h"
#include "..\include\os_cpu.h"
#if MUTEX_EN > 0
/*
* Description :
* Arguments :
* Returns :
*/
void OS_MutexCreate(pMUTEX pMutex, BYTE priority)
{
pMutex->pLockMutex = NULL;
#if EVENT_BLOCK_COUNT > 0
pMutex->BlockCnt = 0;
#endif
pMutex->Priority = priority;
pMutex->LockPriority = priority;
}
/*
* Description : 申請(qǐng)一個(gè)互斥體
* Arguments :
* Returns :
*/
BYTE OS_MutexLock(pMUTEX pMutex,WORD timeout)
{
CPU_SREG cpu_sreg;
BYTE err = NO_ERROR;
OS_ENTER_CRITICAL();
pPID pTmp = os_kernel.pRunning;
if (pMutex->pLockMutex == NULL) { /*互斥體處于解鎖狀態(tài)*/
pMutex->pLockMutex = pTmp; /*鎖定當(dāng)前進(jìn)程*/
pMutex->LockPriority = pTmp->Priority;
}
else {
pPID plock = pMutex->pLockMutex;
//檢查:是否發(fā)生優(yōu)先級(jí)反轉(zhuǎn)
if (plock->Priority > pTmp->Priority) { /*互斥體已被一個(gè)低優(yōu)先級(jí)的進(jìn)程鎖定*/ /*提升優(yōu)先級(jí)*/
plock->Priority = pMutex->Priority; /*按優(yōu)先級(jí)天花板協(xié)議提升*/
}
_AppendEvent(&pMutex->pLockMutex,pTmp);
pTmp->TimerCnt = timeout;
pTmp->State |= BV(PID_MUTEX); /*等待信號(hào)量狀態(tài)*/
#if EVENT_BLOCK_COUNT > 0
pMutex->BlockCnt ++;
#endif
err = TIME_OUT;
while (pTmp->TimerCnt) {
OS_TaskSuspend(pTmp);
if (pTmp->TimerCnt != LIMITLESS) {
_QueueTimer(pTmp);
}
OS_EXIT_CRITICAL();
_Schedule();
OS_ENTER_CRITICAL();
if (pMutex->pLockMutex == pTmp) { /*已解鎖*/
pMutex->LockPriority = pTmp->Priority;
break;
}
}
#if EVENT_BLOCK_COUNT > 0
pMutex->BlockCnt --;
#endif
_RemoveEvent(&pMutex->pLockMutex,pTmp);
pTmp->State &= ~BV(PID_MUTEX);
}
OS_EXIT_CRITICAL();
return err;
}
/*
* Description : 釋放一個(gè)互斥體
* Arguments :
* Returns :
*/
void OS_MutexUnLock(pMUTEX pMutex)
{
if (pMutex->pLockMutex == NULL) {
return;
}
if (pMutex->pLockMutex != os_kernel.pRunning) { /*鎖定的不是當(dāng)前進(jìn)程,原因TIMEOUT*/
return;
}
os_kernel.pRunning->Priority = pMutex->LockPriority; /*恢復(fù)優(yōu)先級(jí)*/
pMutex->pLockMutex = pMutex->pLockMutex->pEventNext;
os_kernel.pRunning->pEventNext = NULL;
if (pMutex->pLockMutex != NULL) {
CPU_SREG cpu_sreg;
OS_ENTER_CRITICAL();
if (pMutex->pLockMutex->TimerCnt != LIMITLESS)
_RemoveTimer(pMutex->pLockMutex);
OS_TaskResume(pMutex->pLockMutex);
OS_EXIT_CRITICAL();
_Schedule();
}
}
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -