message.c

来自「一个流量控制仪器的源码」· C语言 代码 · 共 154 行

C
154
字号
/************************************************************************************/
/* 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 + =
减小字号Ctrl + -
显示快捷键?