循环队列实现

/******************************************************************************
* @file    queue.c
* @author  LiangXianJin
* @version V1.0.0
* @date    2015-12-09
* @brief   固定长度 实现循环队列
******************************************************************************/
/*
===============================================================================
                     ##### How to use Array Queue Buffer #####
===============================================================================
 1、修改名称 如  CanMsgRx_ 和 宏定义 CANMSGRX_QUEUE_SIZE    修改为 UsartRx_ 和宏定义USARTRX_QUEUE_SIZE
 2、修改类型 修改队列中单元数据的类型 
 3、声明对应数据类型和宏
 4、初始化 队列 CanMsgRx_Queue_Init();
*/
#include "string.h"

/*定义队列长度*/
#define CANMSGRX_QUEUE_SIZE    (10)
/*定义数据单元类型*/
typedef struct
{
    char Data[8];
}CanMsgRx_QueueDataType;

/*定义队列协议数据*/
typedef struct
{
 CanMsgRx_QueueDataType Data[CANMSGRX_QUEUE_SIZE];
 int DatatSize; //元素长度
 int Front;  //当前队头
 int Rear;  //当前队尾
 int CurentNum; //当前已入队列元素总数
}str_CanMsgRx_QueueType,*str_CanMsgRx_QueuePtrType;

/*定义一个协议队列变量*/
str_CanMsgRx_QueueType CanMsgRx_Queue,*CanMsgRx_QueuePtr;

/*-------------------------------------------------
* @函数介绍:    初始化Queue
* @参数    :    None
* @返回值  :    OK Queue指针 Fault NULL
* @备注    :    None
*-------------------------------------------------*/
void CanMsgRx_Queue_Init()
{
 CanMsgRx_QueuePtr = &CanMsgRx_Queue;
 memset(CanMsgRx_QueuePtr,0x00,sizeof(str_CanMsgRx_QueueType));
 CanMsgRx_QueuePtr->DatatSize = sizeof(CanMsgRx_QueueDataType);
}
/*-------------------------------------------------
* @函数介绍:    进队列
* @参数    :    数据
* @参数    :    Queue
* @返回值  :    0 失败 1 成功 2 不存在
* @备注    :    None
*-------------------------------------------------*/
int CanMsgRx_Queue_In(CanMsgRx_QueueDataType *pData)
{
 if(CanMsgRx_QueuePtr->CurentNum == CANMSGRX_QUEUE_SIZE)
  return 0;
 memcpy(CanMsgRx_QueuePtr->Data+CanMsgRx_QueuePtr->Rear,pData,CanMsgRx_QueuePtr->DatatSize);
 CanMsgRx_QueuePtr->Rear = (CanMsgRx_QueuePtr->Rear+1)%CANMSGRX_QUEUE_SIZE;
 CanMsgRx_QueuePtr->CurentNum++;
 return 1;
}
/*-------------------------------------------------
* @函数介绍:    出队列
* @参数    :    元素值保存值 Queue
* @参数    :    Queue
* @返回值  :    0 失败 1 成功 2 不存在
* @备注    :    None
*-------------------------------------------------*/
int CanMsgRx_Queue_Out(CanMsgRx_QueueDataType *pData)
{
 if(CanMsgRx_QueuePtr->CurentNum == 0)
  return 0;
 memcpy(pData,CanMsgRx_QueuePtr->Data+CanMsgRx_QueuePtr->Front,CanMsgRx_QueuePtr->DatatSize);
 CanMsgRx_QueuePtr->Front= (CanMsgRx_QueuePtr->Front+1)%CANMSGRX_QUEUE_SIZE;
 CanMsgRx_QueuePtr->CurentNum--;
 return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值