用静态顺序表方式实现的消息队列

1.前言

之前挖的坑,今天可以实现了——“为了保证命令/数据一定能被执行,需要写一个消息队列(后面有空再写一下,给自己挖坑),当系统空闲时对命令/数据进行处理”。

有纰漏请指出,转载请说明。

学习交流请发邮件 [email protected]

2.实现原理

用宏定义定义队列的大小。队列不为满时,可入列;队列不为空时可出列。

队头队尾可前后移动,当队头队尾指向超过队列大小时,可重新指向第一个数据,实现一个循环队列。

3.queue.h

#ifndef __QUEUE_H
#define __QUEUE_H	 

#include "includes.h"

#define QueueMaxSize 5	//队列最大存放的数据个数

typedef enum {
	QueueEmpty,		//队列为空
	QueueNormal,	//队列不为空
	QueueFull,		//队列已满
} QueueState;	//队列当前状态

typedef enum {
	DataEmpty,		//数据为空
	DataNormal,		//数据不为空
} DeQueueState;	//出列的数据情况

typedef struct {
	int data;
} QueueData_S;		//队列存放的数据类型

// 定义队列结构
typedef struct {
    QueueData_S data[QueueMaxSize];	//队列缓存
	QueueData_S dataDeQueue;		//出列数据
	QueueState state;				//队列当前状态
    u8 front;						//队头
    u8 rear;						//队尾
	u8 size;						//队列大小
} Queue_S;

void QueueInit(Queue_S *queue);
QueueState QueueStateDetermine(Queue_S *queue);
void EnQueue(Queue_S *queue, QueueData_S data);
DeQueueState DeQueue(Queue_S *queue);

extern Queue_S stQueue;

#endif //__QUEUE_H

4.queue.c

#include "includes.h"

Queue_S stQueue;

/********************************************
*	@函数名	QueueInit
*	@描述	队列初始化
*	@参数	需要初始化的队列
*	@返回值	无
*	@注意	无
********************************************/
void QueueInit(Queue_S *queue)
{
	memset(&queue, 0, sizeof(queue));
}

/********************************************
*	@函数名	QueueStateDetermine
*	@描述	检查队列当前状态
*	@参数	需要检查的队列
*	@返回值	队列当前状态
*	@注意	无
********************************************/
QueueState QueueStateDetermine(Queue_S *queue)
{
	if(queue->size == 0)
	{
		return QueueEmpty;
	}
	else if(queue->size == QueueMaxSize)
	{
		return QueueFull;
	}
	else
	{
		return QueueNormal;
	}
}

/********************************************
*	@函数名	EnQueue
*	@描述	入列
*	@参数	
			queue 有入列需要的队列
			data  需要入列的数据
*	@返回值	无
*	@注意	当队列满时无法入列
********************************************/
void EnQueue(Queue_S *queue, QueueData_S data)
{
	if(queue->size == QueueMaxSize)
	{
		return;
	}	
	queue->data[queue->rear] = data;
	queue->size++;
	
	queue->rear++;
	if(queue->rear == QueueMaxSize)
	{
		queue->rear = 0;
	}
	queue->state = QueueStateDetermine(queue);
}

/********************************************
*	@函数名	DeQueue
*	@描述	出列
*	@参数	queue 有出列需要的队列
*	@返回值	返回的数据是否为空
*	@注意	实际出列的数据放在 queue->dataDeQueue
********************************************/
DeQueueState DeQueue(Queue_S *queue)
{
	if(queue->size == 0)
	{
		return DataEmpty;
	}
	queue->dataDeQueue = queue->data[queue->front];
	memset(&queue->data[queue->front], 0, sizeof(queue->data[queue->front]));
	queue->size--;

	queue->front++;
	if(queue->front == QueueMaxSize)
	{
		queue->front = 0;
	}
	queue->state = QueueStateDetermine(queue);
	return DataNormal;
}


5.实验结果

用静态顺序表方式实现的消息队列_第1张图片用静态顺序表方式实现的消息队列_第2张图片

你可能感兴趣的:(C语言内核深度解析,STM32,外设学习+项目实践,单片机,c语言)