?? mutex.c
字號:
/*********************************************************************
* Copyright (c) 2011-2012,李士偉
* All rights reserved.
*文 件 名:mutex.c
*描 述:互斥信號量
*當前版本:V1.00
*作 者:李士偉
*創(chuàng)建日期:2012.01.12
**********************************************************************/
#include <kernel\mutex.h>
#include <kernel\flag.h>
#include <kernel\sched.h>
#include <kernel\kd.h>
#include <kernel\asm.h>
/*********************************************************************
*函 數(shù) 名:API_InitMutex
*描 述:初始化互斥信號量
*輸入?yún)?shù):pMutex: 信號結(jié)構(gòu)體指針
* sig: 信號
* sig = OS_MUTEX_NO_SIG 初始化無信號
* sig = OS_MUTEX_SIG 初始化有信號
*輸出參數(shù):無
*返 回 值:無
*注 意:
**********************************************************************/
void API_InitMutex(OS_MUTEX *pMutex, INT32U sig)
{
OS_ENTER_CRITICAL();
if (sig >1 )
{
sig = OS_MUTEX_SIG;
}
pMutex->Signal = sig;
pMutex->WaitQ = NULL;
OS_EXIT_CRITICAL();
}
/*********************************************************************
*函 數(shù) 名:API_MutexPend
*描 述:請求信號
*輸入?yún)?shù):pMutex: 互斥信號量指針
* timeout:等待時限(節(jié)拍)
*輸出參數(shù):err: 錯誤標志
*返 回 值:OS_MUTEX_SIG 獲得信號
* OS_MUTEX_NO_SIG 未獲得信號
*注 意:
**********************************************************************/
INT32U API_MutexPend(OS_MUTEX *pMutex, INT32U timeout, INT32U *err)
{
if (pMutex == NULL || OSIntNesting > 0 )
{
*err = OS_ERR;
return OS_MUTEX_NO_SIG;
}
OS_ENTER_CRITICAL();
if (pMutex->Signal)
{
pMutex->Signal = OS_MUTEX_NO_SIG;
OS_EXIT_CRITICAL();
*err = OS_NO_ERR;
return OS_MUTEX_SIG;
}
OSTCBCur->Delay = timeout;
for ( ; ; )
{
OS_EnterWaitQHead(&(pMutex->WaitQ), OSTCBCur);
OS_Sched();
if (pMutex->Signal)
{
pMutex->Signal = OS_MUTEX_NO_SIG;
OSTCBCur->Delay = 0;
OS_EXIT_CRITICAL();
*err = OS_NO_ERR;
return OS_MUTEX_SIG;
}
if ((timeout > 0) && (OSTCBCur->Delay == 0))
{
OS_EXIT_CRITICAL();
*err = OS_OVERTIME;
return OS_MUTEX_NO_SIG;
}
}
}
/*********************************************************************
*函 數(shù) 名:API_MutexPost
*描 述:發(fā)送互斥信號量
*輸入?yún)?shù):pMutex: 互斥信號量結(jié)構(gòu)指針
*輸出參數(shù):無
*返 回 值:無
*注 意:只喚醒等待隊列中的一個高優(yōu)先級任務,
**********************************************************************/
void API_MutexPost(OS_MUTEX *pMutex)
{
OS_TCB *ptcb, *wptcb;
INT32U prio;
OS_ENTER_CRITICAL();
pMutex->Signal = OS_MUTEX_SIG;
ptcb = pMutex->WaitQ;
wptcb = ptcb;
if (ptcb != NULL) /* 有任務等待互斥信號量 */
{
prio = ptcb->Prio;
}
else /* 沒有任務等待互斥信號量,返回 */
{
OS_EXIT_CRITICAL();
return ;
}
while (ptcb != NULL) /* 從等待隊列查詢一個高優(yōu)先級任務 */
{
if (prio < ptcb->Prio)
{
prio = ptcb->Prio;
wptcb= ptcb;
}
ptcb = ptcb->QNext;
}
OS_EnterRunQ(wptcb); /* 加入運行隊列 */
OS_EXIT_CRITICAL();
OS_Sched();
}
/*********************************************************************
*函 數(shù) 名:API_MutexAccept
*描 述:無等待獲取互斥信號
*輸入?yún)?shù):pMutex: 互斥信號量結(jié)構(gòu)體指針
*輸出參數(shù):無
*返 回 值:OS_MUTEX_SIG 有信號;OS_MUTEX_NO_SIG 無信號
*注 意:
**********************************************************************/
INT32U API_MutexAccept(OS_MUTEX *pMutex)
{
INT32U sig;
OS_ENTER_CRITICAL();
sig = pMutex->Signal;
pMutex->Signal = OS_MUTEX_NO_SIG;
OS_EXIT_CRITICAL();
return sig;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -