⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mutex.c

📁 Rabbit 32Bit RTOS源代码
💻 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 + -