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