📄 ggt_msg.c
字号:
/****************************************************************************************************
** Gogoto OS
** (c) Copyright 2007-2008, luyigui(卢益贵)
** All Rights Reserved
** V1.00.0
**
** 狗狗兔嵌入式多任务系统(基于消息机制)
** 绿城代码、GGT-OS、Gogoto OS、狗狗兔嵌入式、狗狗兔系统
** QQ:48092788
**
**------------------文件信息------------------------------------------------------------------------
** 文件名: GGT_Msg.c
** 创建人: 卢益贵
** 日 期: 2007年12月8日
** 版 本: V1.00.0
** 描 述: Gogoto OS 消息功能单元
**
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
****************************************************************************************************/
#include "GGT_OS.h"
#include "GGT_CPU.h"
#include "GGT_Type.h"
#include "GGT_SysType.h"
#include "GGT_SysCfg.h"
#include "GGT_Kernel.h"
#if(OS_MSG)
UINT32 *pOSBoxMsg;
/****************************************************************************************************
** 函数名: OSMsgInit
** 描 述: 初始化消息空间
** 输 入: 无
** 输 出: 无
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void OSMsgInit(void)
{
pOSBoxMsg = (UINT32 *)OSGetBoxMsg();
BoxInit(pOSBoxMsg, sizeof(_BoxHead) + OSGetSumMsg() * sizeof(_OSMsg), sizeof(_OSMsg));
}
/****************************************************************************************************
** 函数名: OSMsgPost
** 描 述: 消息发送函数,不等待目标处理,不管收到与否
** 输 入: TaskID:目标任务的ID,
Msg:消息内容,
wParam:消息参数
lParam:消息参数
** 输 出: 返回TRUE表示成功
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
BOOL OSMsgPost(const OS_ID TaskID, const UINT32 Msg, const UINT32 wParam, const UINT32 lParam)
{
BOOL R;
_pOSMsg pMsg;
_pOSTask pTask;
OSIRQLock();
pMsg = (_pOSMsg)BoxAlloc(pOSBoxMsg);
R = pMsg != NULL;
if(R)
{
pMsg->Sender = pOSTskNow->ID;
pMsg->Msg = Msg;
pMsg->wParam = wParam;
pMsg->lParam = lParam;
pTask = &pOSTask[TaskID - 1];
ListAppend((void *)(&(pTask->pMsg)), pMsg);
//如果对方正在等待,则加载他
if(OS_TSK_STATE_WAIT_MSG == pTask->State)
OSTaskPushReady(pTask);
}
OSIRQUnlock();
return(R);
}
/****************************************************************************************************
** 函数名: OSMsgPeek
** 描 述: 消息窥探
** 输 入: pMsg:指向消息结构的指针
** 输 出: 返回TRUE表示有消息
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
BOOL OSMsgPeek(_pMsg pMsg)
{
BOOL R;
_pOSMsg pOSMsg;
OSIRQLock();
R = (NULL != pOSTskNow->pMsg);
if(R)
{
pOSMsg = pOSTskNow->pMsg;
*pMsg = *((_pMsg)(&(pOSMsg->Sender)));
pOSTskNow->pMsg = (pOSTskNow->pMsg)->pNext;
BoxFree(pOSBoxMsg, pOSMsg);
}
OSIRQUnlock();
return(R);
}
/****************************************************************************************************
** 函数名: OSMsgWait
** 描 述: 消息等待函数,没有消息不返回,一直挂起等待
** 输 入: pMsg:指向消息结构的指针
** 输 出: 返回TRUE表示有消息
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
BOOL OSMsgWait(_pMsg pMsg)
{
DoWait:
if(OSMsgPeek(pMsg))
{
return(TRUE);
}else
{
pOSTskNow->State = OS_TSK_STATE_WAIT_MSG;
OSTaskIsNULLLoadDef();
OSTaskSW();
goto DoWait;
}
}
/****************************************************************************************************
** 函数名: OSMsgWaitFor
** 描 述: 等待指定消息的函数,等不到指定消息不返回,一直挂起等待
** 输 入: pMsg:指向消息结构的指针
** 输 出: 返回TRUE表示有消息
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
BOOL OSMsgWaitFor(const UINT32 Msg, _pMsg pMsg)
{
DoWait:
if(OSMsgPeek(pMsg))
{
if(Msg == pMsg->Msg)
return(TRUE);
else
goto DoWait;
}else
{
pOSTskNow->State = OS_TSK_STATE_WAIT_MSG;
OSTaskIsNULLLoadDef();
OSTaskSW();
goto DoWait;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -