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

📄 queue.c

📁 工业电力民用仪器频率控制系统原代码!正在销售的产品
💻 C
字号:
//*****************************************************************************
// File Name	: queue.c
// 
// Title		: A RAW Message Queue for MCU
// Revision		: 1.0
// Notes		:	
// Target MCU	: Atmel AVR series ( can easy port to other's)
// Editor Tabs	: 4
// 
// Revision History:
// When			Who			Description of change
// -----------	-----------	-----------------------
// 2005-0804	Zhanglei    Create
// 
//*****************************************************************************

 
//----- Include Files ---------------------------------------------------------
#include "queue.h"		// include uart function library

//----- structure/typdefs -----------------------------------------------------

//----- global variables ------------------------------------------------------

static u08 msgPoolPoint=0;
static u08 msgType;
static u08 msgPool[MSG_STACK_DEPTH][2];
static u08 msgReturnValue=0;

//----- Begin Code ------------------------------------------------------------
//*****************************************************************************
//函数名:		msgQueueIn		
//参数:			msgType			消息类型
//				msgPoint		消息指针
//返回值:		无
//描述:			将消息添加到消息队列中去,消息堆栈最多记录4条消息.		
//*****************************************************************************
void msgQueueIn(u08 msgType, u08 msgPoint)	
{
	if(msgPoolPoint == MSG_STACK_DEPTH)	//如果消息堆栈满了,则退出
	{
		return;
	}
	DISABLE_INT();
	msgPool[msgPoolPoint][0] = msgType;
	msgPool[msgPoolPoint++][1] = msgPoint;
	ENABLE_INT();
}

//*****************************************************************************
//函数名:		msgQueueOut
//参数:			无
//返回值:		MSG_NULL		当消息队列为空时返回MSG_NULL
//				msgType			当消息队列不为空时返回消息类型
//描述:			弹出消息队列中最早进入的消息类型.
//*****************************************************************************
#ifdef FIFO					//如果定义为先入先
u08 msgQueueOut(void)
{
	if(msgPoolPoint == 0)
	{
		return(MSG_NULL);
	}
	DISABLE_INT();					//关断所有中断
	msgReturnValue = msgPool[0][1];	//推出最早进入的消息
	msgType = msgPool[0][0];
	if(--msgPoolPoint)				//如果消息队列未空,则剩余消息前移
	{
		for(u08 i = 0; i < msgPoolPoint; i++)
		{
			msgPool[i][0] = msgPool[i + 1][0];
			msgPool[i][1] = msgPool[i + 1][1];
		}
	}
	ENABLE_INT();
	return(msgType);
}
#endif	

#ifdef PRIORITY
u08 msgQueueOut(void)
{
	u08 i;
	if(msgPoolPoint == 0)
	{
		return(MSG_NULL);
	}
	
	DISABLE_INT();
	
	if(msgPoolPoint == 1)
	{
		msgReturnValue = msgPool[--msgPoolPoint][1];
		msgType = msgPool[msgPoolPoint][0];
		ENABLE_INT();
		return(msgType);
	}	
	
	msgType =msgPool[0][0];
	msgReturnValue = 0;
	for( i = 1; i < msgPoolPoint; i++)
	{
		if((msgType & 0xF0) < (msgPool[i][0] & 0xF0))
		{
			msgType = msgPool[i][0];
			msgReturnValue = i;
		}
	}
	i = msgReturnValue;
	msgReturnValue = msgPool[i][1];
	msgPoolPoint--;
	for(; i < msgPoolPoint; i++)
	{
		msgPool[i][0] = msgPool[i + 1][0]; 
		msgPool[i][1] = msgPool[i + 1][1]; 
	}

	ENABLE_INT();
	return(msgType);	
}
#endif

//*****************************************************************************
//函数名:		msgQueueGetData
//参数:			无
//返回值:		MSG_NULL		当消息队列为空时返回MSG_NULL
//				msgType			当消息队列不为空时返回消息类型
//描述:			弹出消息队列中最早进入的消息类型.
//*****************************************************************************
u08 msgQueueGetData(void)
{
	return msgReturnValue;
}
//----- End of File ------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -