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

📄 message.c

📁 一个流量控制仪器的源码
💻 C
字号:
/************************************************************************************/
/* G7000 V3 消息列表管理											*/
/* MCU 型号: Philips P89C668														*/
/* 时钟频率: 11.0592 MHz	6 CLOCK														    */
/* 开发环境: Keil C51 V7.06a															*/
/* 开发日期: 2004.02.25													        	*/
/* 程序编写: BaoFang  鲍方															*/
/* 系统版本: V3.00																	*/
/************************************************************************************/
#include <REG668.H>
#include <G7000.H>
#include <Message.H>

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

//为防止同时调用Msg而设置的信号量!
bit MsgIsUse;	//0:无;1:使用中。

xdata MsgListStruct MsgList;

uchar MsgListN;	//消息列表的消息数,替代MsgList.ucListN,方便外部程序的引用。

/*
************************************************************************************************************************
**函数原型:  void List_Init();
**参数说明:  初始化清空当前列表。
**返回值:
**
**参数说明:

************************************************************************************************************************
*/
void MsgListInit()
{
	//队列初始化
	MsgList.ucListFirstP = 0;
	MsgList.ucListLastP = 0;
	
	//MsgList.ucListN = 0;
	MsgListN = 0;
	
	MsgIsUse = 0;
	
}
		
		
/****************************!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

注意使用了reentrant关键字必须要在STARTUP.A51中修改!!!!!!!
;  Stack Space for reentrant functions in the SMALL model.
IBPSTACK        EQU     1       ; set to 1 if small reentrant is used.
************************************************************/		
				
				
/*
************************************************************************************************************************
**函数原型:  uchar MsgListAdd(uchar NodeAddress,uchar NodeTurn,uchar NodeTurnOld);
**参数说明:  加入一个消息。(FIFO)
**返回值:		
**           	返回0xFF表示队列满!
		返回0表示成功!
**
**参数说明:	uchar NodeAddress	消息的节点地址
		uchar NodeTurn		消息节点的进入时段
		uchar NodeTurnOld	消息节点的退出时段
		
注意!!这个是可重入的函数
内部利用了信号量来防止同时操作队列
************************************************************************************************************************
*/
uchar MsgListAdd(uchar NodeAddress,uchar NodeTurn,uchar NodeTurnOld) //reentrant
{
	uchar tempi;
	
	//当队列在使用中时,等待
	//while(MsgIsUse)
	//	;
	
	//MsgIsUse = 1;
	
	tempi = MsgList.ucListLastP;		

	tempi = (tempi + 1) % MsgList_ZMAX;
	
	//判断队列满?
	if(tempi == MsgList.ucListFirstP)
	{
		//MsgIsUse = 0;
		
		return(0xFF);
	}
		
	//节点加入尾部
	MsgList.List[tempi].ucNodeAdd = NodeAddress;
	MsgList.List[tempi].ucTurnN = NodeTurn;
	MsgList.List[tempi].ucTurnOld = NodeTurnOld;
	
	MsgList.ucListLastP = tempi;
	
	//队列数+1
	//MsgList.ucListN++;
	MsgListN++;
	
	
	
	//MsgIsUse = 0;
	
	return(0);
	
}

/*
************************************************************************************************************************
**函数原型:  uchar MsgListGet(MsgStruct *MsgGet);
**参数说明:  取出一条消息。(FIFO)
**返回值:		
**           	返回0xFF表示失败,消息空。
		返回0表示成功。
**
**参数说明:     MsgStruct *MsgGet	取出的消息指针
************************************************************************************************************************
*/
uchar MsgListGet(MsgStruct *MsgGet)
{
	uchar tempi;
	
	tempi = MsgList.ucListFirstP;
	
	//判断队列是否空
	if(MsgList.ucListLastP == tempi)
		return(0xFF);
	
	//节点从头部取出
	tempi = (tempi + 1) % MsgList_ZMAX;
	
	MsgGet->ucNodeAdd = MsgList.List[tempi].ucNodeAdd;
	MsgGet->ucTurnN = MsgList.List[tempi].ucTurnN;
	MsgGet->ucTurnOld = MsgList.List[tempi].ucTurnOld;

	MsgList.ucListFirstP = tempi;
			
	//队列数-1
	//MsgList.ucListN--;
	MsgListN--;
	
	return(0);
	
}



⌨️ 快捷键说明

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