📄 ggt_mut.c
字号:
/****************************************************************************************************
** Gogoto OS
** The Real-Time Kernel
** (c) Copyright 2007-2008, luyigui(卢益贵)
** All Rights Reserved
** V1.00.0
**
** 狗狗兔嵌入式多任务系统(基于消息机制)
** 绿城代码、GGT-OS、Gogoto OS、狗狗兔嵌入式、狗狗兔系统
** QQ:48092788
**
**------------------文件信息------------------------------------------------------------------------
** 文件名: GGT_Mut.c
** 创建人: 卢益贵
** 日 期: 2007年12月8日
** 版 本: V1.00.0
** 描 述: Gogoto OS 任务排斥功能单元
**
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
****************************************************************************************************/
#include "GGT_OS.h"
#include "GGT_CPU.h"
#include "GGT_Func.h"
#include "GGT_SysType.h"
#include "GGT_Kernel.h"
/****************************************************************************************************
** 函数名: OSMutInit
** 描 述: 互斥变量初始化
** 输 入: pMut:互斥变量指针
** 输 出: 无
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人: 卢益贵
** 日 期: 2008年1月7日
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void OSMutInit(_pMut pMut)
{
OSIRQLock();
pMut->IsBusy = FALSE;
pMut->pTask = NULL;
pMut->Count = 0;
pMut->Owner = 0;
OSIRQUnlock();
}
/****************************************************************************************************
** 函数名: OSMutRelease
** 描 述: 互斥量释放
** 输 入: pMut:互斥变量指针
** 输 出: 无
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人: 卢益贵
** 日 期: 2008年1月7日
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void OSMutRelease(_pMut pMut)
{
_pOSTask pTask;
OSIRQLock();
pMut->Count--;
if(0 >= pMut->Count)
{
if(pMut->pTask)
{
pMut->IsBusy = TRUE;
pMut->Owner = pTask->ID;
pMut->Count = 0;
pTask = pMut->pTask;
((_pOSTask)(pMut->pTask)) = ((_pOSTask)(pMut->pTask))->pNext;
OSTaskPushReady(pTask);
OSTaskSW();
}else
pMut->IsBusy = FALSE;
}
OSIRQUnlock();
}
/****************************************************************************************************
** 函数名: OSMutWait
** 描 述: 互斥量等待。
** 输 入: pMut:互斥变量指针
** 输 出: 无
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人: 卢益贵
** 日 期: 2008年1月7日
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void OSMutWait(_pMut pMut)
{
OSIRQLock();
if(pMut->IsBusy)
{
if(pMut->Owner != pOSTskNow->ID)
{
pOSTskNow->State = OS_STATE_TSK_WAIT_MUT;
//按权限排序,权限高的在前面。
ListInsert(&(pMut->pTask), pOSTskNow, OSTaskOrderByPrio);
OSTaskIsNULLLoadDef();
OSTaskSW();
}else
pMut->Count++;
}else
{
pMut->Count = 0;
pMut->Owner = pOSTskNow->ID;
pMut->IsBusy = TRUE;
}
OSIRQUnlock();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -