📄 queue.c
字号:
//*****************************************************************************
// File Name : queue.c
//
// Title : A RAW Message Queue for MCU
// Revision : 1.0
// Notes :
// Target MCU : Atmel AVR series ( can easy port to other's)
// Editor Tabs : 4
//
// Revision History:
// When Who Description of change
// ----------- ----------- -----------------------
// 2005-0804 Zhanglei Create
//
//*****************************************************************************
//----- Include Files ---------------------------------------------------------
#include "queue.h" // include uart function library
//----- structure/typdefs -----------------------------------------------------
//----- global variables ------------------------------------------------------
static u08 msgPoolPoint=0;
static u08 msgType;
static u08 msgPool[MSG_STACK_DEPTH][2];
static u08 msgReturnValue=0;
//----- Begin Code ------------------------------------------------------------
//*****************************************************************************
//函数名: msgQueueIn
//参数: msgType 消息类型
// msgPoint 消息指针
//返回值: 无
//描述: 将消息添加到消息队列中去,消息堆栈最多记录4条消息.
//*****************************************************************************
void msgQueueIn(u08 msgType, u08 msgPoint)
{
if(msgPoolPoint == MSG_STACK_DEPTH) //如果消息堆栈满了,则退出
{
return;
}
DISABLE_INT();
msgPool[msgPoolPoint][0] = msgType;
msgPool[msgPoolPoint++][1] = msgPoint;
ENABLE_INT();
}
//*****************************************************************************
//函数名: msgQueueOut
//参数: 无
//返回值: MSG_NULL 当消息队列为空时返回MSG_NULL
// msgType 当消息队列不为空时返回消息类型
//描述: 弹出消息队列中最早进入的消息类型.
//*****************************************************************************
#ifdef FIFO //如果定义为先入先
u08 msgQueueOut(void)
{
if(msgPoolPoint == 0)
{
return(MSG_NULL);
}
DISABLE_INT(); //关断所有中断
msgReturnValue = msgPool[0][1]; //推出最早进入的消息
msgType = msgPool[0][0];
if(--msgPoolPoint) //如果消息队列未空,则剩余消息前移
{
for(u08 i = 0; i < msgPoolPoint; i++)
{
msgPool[i][0] = msgPool[i + 1][0];
msgPool[i][1] = msgPool[i + 1][1];
}
}
ENABLE_INT();
return(msgType);
}
#endif
#ifdef PRIORITY
u08 msgQueueOut(void)
{
u08 i;
if(msgPoolPoint == 0)
{
return(MSG_NULL);
}
DISABLE_INT();
if(msgPoolPoint == 1)
{
msgReturnValue = msgPool[--msgPoolPoint][1];
msgType = msgPool[msgPoolPoint][0];
ENABLE_INT();
return(msgType);
}
msgType =msgPool[0][0];
msgReturnValue = 0;
for( i = 1; i < msgPoolPoint; i++)
{
if((msgType & 0xF0) < (msgPool[i][0] & 0xF0))
{
msgType = msgPool[i][0];
msgReturnValue = i;
}
}
i = msgReturnValue;
msgReturnValue = msgPool[i][1];
msgPoolPoint--;
for(; i < msgPoolPoint; i++)
{
msgPool[i][0] = msgPool[i + 1][0];
msgPool[i][1] = msgPool[i + 1][1];
}
ENABLE_INT();
return(msgType);
}
#endif
//*****************************************************************************
//函数名: msgQueueGetData
//参数: 无
//返回值: MSG_NULL 当消息队列为空时返回MSG_NULL
// msgType 当消息队列不为空时返回消息类型
//描述: 弹出消息队列中最早进入的消息类型.
//*****************************************************************************
u08 msgQueueGetData(void)
{
return msgReturnValue;
}
//----- End of File ------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -