1. 队列类型及操作的宏定义:
// 队列类型表示:Queue_元素类型(如元素为整形的队列类型为:Queue_int)
// _ET:元素类型
#define Q_TYPE(_ET)Queue_##_ET
// 队列变量定义:每个队列对应一个数组,用于存放元素,数组名表示成:qBuf##queue
// 在定义队列变量时需指定队列长度:由len指定
// ET:元素类型
// queue:队列变量名
// len:队列长度
#define Q_DEFINE(ET,queue,len)
ETqBuf##queue[len];
int qBufLen##queue = sizeof (ET) * len;
Q_TYPE(ET)queue
// 队列类型(结构体)定义:
// ET:元素类型
// Queue_##ET:具体化后的队列类型,由不同的元素类型决定
#define Q_TYPE_DEFINE(ET)
typedef struct
... {
ET*pElems;
intfront,rear,size;
intmaxSize;
} Queue_##ET;
// 队列变量声明表示:用于声明外部全局变量
// ET:元素类型
// queue:队列变量名
#define Q_EXTERN(ET,queue)
extern ETqBuf##queue[];
extern int qBufLen##queue;
extern Q_TYPE(ET)queue
// 队列初始化
#define Q_INIT(queue,len)
... {
memset(qBuf##queue,0,qBufLen##queue);
queue.pElems=qBuf##queue;
queue.size=0;
queue.front=queue.rear=0;
queue.maxSize=len;
}
// 队空
#define Q_EMPTY(queue)(queue.front==queue.rear)
// 队满
#define Q_FULL(queue)((queue.rear+1)%queue.maxSize==queue.front)
// 入队
#define Q_PUT(queue,pput)
... {
if(Q_FULL(queue))
...{
Uart_Printf("MQOF ");
}
else
...{
queue.pElems[queue.rear]=*pput;
queue.size++;
queue.rear=(queue.rear+1)%queue.maxSize;
}
}
// 出队
#define Q_GET(queue,pget)
... {
if(queue.front==queue.rear)
...{
pget=NULL;
}
else
...{
inthead=queue.front;
queue.front=(queue.front+1)%queue.maxSize;
pget=&queue.pElems[head];
queue.size--;
}
}
// 队列类型实例化:根据指定的不同类型
Q_TYPE_DEFINE(sGUI_MESSAGE) // 消息队列
Q_TYPE_DEFINE( char )
2.定义队列:
//
定义队列长度
#define MSG_QUEUE_LEN100 // 预定义消息队列的长度
#define KBD_BUF_LEN10
// 定义队列变量
Q_DEFINE(sGUI_MESSAGE,msgQueue,MSG_QUEUE_LEN);
Q_DEFINE( char ,keyQueue,KBD_BUF_LEN);
// 显式初始化
void q_init()
... {
Q_INIT(msgQueue,MSG_QUEUE_LEN);
Q_INIT(keyQueue,KBD_BUF_LEN);
}
#define MSG_QUEUE_LEN100 // 预定义消息队列的长度
#define KBD_BUF_LEN10
// 定义队列变量
Q_DEFINE(sGUI_MESSAGE,msgQueue,MSG_QUEUE_LEN);
Q_DEFINE( char ,keyQueue,KBD_BUF_LEN);
// 显式初始化
void q_init()
... {
Q_INIT(msgQueue,MSG_QUEUE_LEN);
Q_INIT(keyQueue,KBD_BUF_LEN);
}
3.外部引用队列变量:
//
外部引用,使用声明Q_EXTERN表达式
Q_EXTERN(sGUI_MESSAGE,msgQueue);
Q_EXTERN( char ,keyQueue);
Q_EXTERN(sGUI_MESSAGE,msgQueue);
Q_EXTERN( char ,keyQueue);
4.操作队列:
int
i
=
65
;
while ( ! Q_FULL(keyQueue))
... {
Q_PUT(keyQueue,&i);
i++;
}
char * pch;
while ( ! Q_EMPTY(keyQueue))
... {
Q_GET(keyQueue,pch);
if(pmsg)
printf("%c ",*pch);
}
while ( ! Q_FULL(keyQueue))
... {
Q_PUT(keyQueue,&i);
i++;
}
char * pch;
while ( ! Q_EMPTY(keyQueue))
... {
Q_GET(keyQueue,pch);
if(pmsg)
printf("%c ",*pch);
}