📄 mutex.c
字号:
/*********************************************************************
* Copyright (c) 2011-2012,李士伟
* All rights reserved.
*文 件 名:mutex.c
*描 述:互斥信号量
*当前版本:V1.00
*作 者:李士伟
*创建日期:2012.01.12
**********************************************************************/
#include <kernel\mutex.h>
#include <kernel\flag.h>
#include <kernel\sched.h>
#include <kernel\kd.h>
#include <kernel\asm.h>
/*********************************************************************
*函 数 名:API_InitMutex
*描 述:初始化互斥信号量
*输入参数:pMutex: 信号结构体指针
* sig: 信号
* sig = OS_MUTEX_NO_SIG 初始化无信号
* sig = OS_MUTEX_SIG 初始化有信号
*输出参数:无
*返 回 值:无
*注 意:
**********************************************************************/
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();
}
/*********************************************************************
*函 数 名:API_MutexPend
*描 述:请求信号
*输入参数:pMutex: 互斥信号量指针
* timeout:等待时限(节拍)
*输出参数: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;
}
}
}
/*********************************************************************
*函 数 名:API_MutexPost
*描 述:发送互斥信号量
*输入参数:pMutex: 互斥信号量结构指针
*输出参数:无
*返 回 值:无
*注 意:只唤醒等待队列中的一个高优先级任务,
**********************************************************************/
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) /* 从等待队列查询一个高优先级任务 */
{
if (prio < ptcb->Prio)
{
prio = ptcb->Prio;
wptcb= ptcb;
}
ptcb = ptcb->QNext;
}
OS_EnterRunQ(wptcb); /* 加入运行队列 */
OS_EXIT_CRITICAL();
OS_Sched();
}
/*********************************************************************
*函 数 名:API_MutexAccept
*描 述:无等待获取互斥信号
*输入参数:pMutex: 互斥信号量结构体指针
*输出参数:无
*返 回 值: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 + -