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

📄 message.c

📁 程序概述: 这是个具体产品程序
💻 C
字号:
// Copyright (c)2005 - 2006 by Laser Electronics, All Rights Reserved.
/*----------------------------------------------------------------------------+
|  File Name:  Message.c, v1.0.1                                              |
|  Author:                                                                    |
|  Date:                                                                      |
+-----------------------------------------------------------------------------+
|  Description: 联网型智能楼宇对讲系统 -- 管理中心机消息机制驱动程序          |
|               器件选择 -- STC89C58RD+, PQFP-44                              |
|               时钟频率 -- 24.000 MHz                                        |
+-----------------------------------------------------------------------------+

/*----------------------------------------------------------------------------+
| Include files                                                               |
+----------------------------------------------------------------------------*/
#include "Main.h"
#include "Message.h"

/*----------------------------------------------------------------------------+
| Internal Variables                                                          |
+----------------------------------------------------------------------------*/
BYTE MsgPoolLength;
xdata MSG MsgPool[MAX_MSG_STACK_DEPTH];//32

xdata BYTE MsgBuf[16][16];
data UINT bMsgBuf;


/*----------------------------------------------------------------------------+
| System Initialization Routines                                              |
+----------------------------------------------------------------------------*/
void InitMessagePool(void)
{
	BYTE i;
	MsgPoolLength = 0;
	for (i=0; i<MAX_MSG_STACK_DEPTH; i++)
	{
		MsgPool[i].Msg = MSG_NULL;
	}
	bMsgBuf = 0x00;
}

/*----------------------------------------------------------------------------+
| General Subroutines                                                         |
+----------------------------------------------------------------------------*/
// 分配一个缓冲区
BYTE xdata *MsgGetBuf(void) reentrant
{
	BYTE i;
	UINT Temp;

	Temp = 0x01;
	for (i=0; i<16; i++)
	{
		if ((bMsgBuf & Temp) == 0)
		{
			bMsgBuf |= Temp;
			return (BYTE *)(&MsgBuf[i][0]);
		}
		Temp <<= 1;
	}
	// 缓冲区空间不足
	return NULL;
}

// 释放一个缓冲区
void MsgPutBuf(BYTE *pBuf) reentrant
{
	BYTE i;
	UINT Temp;

	Temp = 0x01;
	for (i=0; i<16; i++)
	{
		if (pBuf == (BYTE *)(&MsgBuf[i][0]))
		{
			bMsgBuf &= ~Temp;
		}
		Temp <<= 1;
	}
}

// 从消息堆栈中读取一条消息
BOOL GetMessage(PMSG pMsg)
{
	BYTE i;
	bit OldEA;

	if (MsgPoolLength == 0)             // 队列中没有消息
		return FALSE;

	OldEA = EA;
	EA = DISABLE;                       // 关断所有中断

	pMsg->Msg = MsgPool[0].Msg; 		// 推出最早进入的消息
	pMsg->Param  = MsgPool[0].Param;
	if ( --MsgPoolLength )
	{
		for (i=0; i<MsgPoolLength; i++)  // 剩余消息前移
		{
			MsgPool[i].Msg = MsgPool[i+1].Msg;
			MsgPool[i].Param  = MsgPool[i+1].Param;
		}
	}
	EA = OldEA;

	return TRUE;
}

// 发送一个不带参数的消息到消息堆栈
void SendMessage(BYTE nMessage) reentrant
{
	BYTE i, j;
	BYTE OldEA;

	OldEA = EA;                 // 先将当前所有中断允许位保存起来
	EA = DISABLE;			    // 暂时禁止一切中断,待处理完消息后恢复

	if (MsgPoolLength >= MAX_MSG_STACK_DEPTH)    // 如果消息堆栈满了,则先清空定时器消息
	{
		// 清空定时器消息并重新排序,
		for (i=0, j=0; i<MsgPoolLength; i++)
		{
			if (MsgPool[i].Msg != MSG_TIMER_OVER)   // 只保留非定时器消息
			{
				MsgPool[j].Msg = MsgPool[i].Msg;
				MsgPool[j].Param = MsgPool[i].Param;
				j ++;           // j表示有用的消息的数目
			}
		}
		MsgPoolLength = j;
	}
	if (MsgPoolLength < MAX_MSG_STACK_DEPTH)
	{
		MsgPool[MsgPoolLength].Msg = nMessage;
		MsgPoolLength ++;
	}
	EA = OldEA;
}

// 发送一个特定的消息到消息堆栈
BYTE PostMessage(BYTE nMessage, UINT wParam) reentrant
{
	BYTE i, j;
	BYTE OldEA;
	BYTE rt;

	rt = KO;
	OldEA = EA;                 // 先将当前所有中断允许位保存起来
	EA = DISABLE;			    // 暂时禁止一切中断,待处理完消息后恢复
	if (MsgPoolLength >= MAX_MSG_STACK_DEPTH)    // 如果消息堆栈满了,则先清空定时器消息
	{
		// 清空定时器消息并重新排序,
		for (i=0, j=0; i<MsgPoolLength; i++)
		{
			if (MsgPool[i].Msg != MSG_TIMER_OVER)   // 只保留非定时器消息
			{
				MsgPool[j].Msg = MsgPool[i].Msg;
				MsgPool[j].Param = MsgPool[i].Param;
				j ++;           // j表示有用的消息的数目
			}
		}
		MsgPoolLength = j;
	}
	if (MsgPoolLength < MAX_MSG_STACK_DEPTH) // 如果消息堆栈满了,则退出
	{
		MsgPool[MsgPoolLength].Msg = nMessage;
		MsgPool[MsgPoolLength].Param = wParam;
		MsgPoolLength ++;
		rt = OK;
	}

	EA = OldEA;
	return rt;
}

/*
void ClearMessage(BYTE nMessage)
{
	bit OldEA;
	BYTE i;
	if (nMessage == MSG_ALL)    // 如果要清除队列中的所有消息
	{
		InitMessagePool();      // 队列初始化
	}
	else
	{
		OldEA = EA;             // 先将当前所有中断允许位保存起来
		EA = DISABLE;			// 暂时禁止一切中断,待处理完消息后恢复
		for (i=0; i<MsgPoolLength; i++)
		{
			if (MsgPool[i].Msg == nMessage)
				MsgPool[i].Msg = MSG_NULL;
		}
		EA = OldEA;
	}
}
*/
/*----------------------------------------------------------------------------+
| End of source file                                                          |
+----------------------------------------------------------------------------*/
/*------------------------ Nothing Below This Line --------------------------*/

⌨️ 快捷键说明

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