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

📄 ggt_msg.c

📁 ARM下的多任务操作系统源码:GogotoOS
💻 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 + -