📄 message.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 + -