/*
* Queue.c
*
* Created on: 2013-3-20
* Author: feng
*/
#include "Queue.h"
/*************************************************************************************************************************
** 函数名称: InitBufferQueue
**
** 函数描述: 缓冲队列初始化;并按照初始化长度分配内存空间;
**
**
**
** 输入变量: struct BUFFER_QUEUE *p_buffer; uint8 length;
** 返回值: void;
**
** 使用宏或常量: None;
** 使用全局变量: None;
**
** 调用函数: None;
**
** 创建人:
** 创建日期: 2009-03-07
**------------------------------------------------------------------------------------------------------------------------
** 修订人:
** 修订日期: 2009-08-10
**------------------------------------------------------------------------------------------------------------------------
*************************************************************************************************************************/
static void InitBufferQueue(BUFFER_QUEUE *p_buffer, uint8 length)
{
uint8* p_free_space = NULL;
SetReg(p_buffer->state, 0);// 初始化状态寄存器
if(0x00 == length)
{
SetRegMask(p_buffer->state, ERR_MASK, ERR_VALUE);// 置错误类型标志位
return;
}
p_buffer->length = length;// 初始化缓冲区长度
p_free_space = malloc(length);// 分配长度为length的RAM空间
if (NULL == p_free_space)
{
SetRegMask(p_buffer->state, ERR_MASK, ERR_NOTAVAIL);// 置错误类型标志位
return;
}
p_buffer->init_address = p_free_space;
p_buffer->rear = p_free_space;
p_buffer->front = p_free_space;
SetRegBit(p_buffer->state, INIT_COMPLETE);// 置位初始化完成标志
}
/*************************************************************************************************************************
** 函数名称: TestEmptyBufferQueue
**
** 函数描述: 测试缓冲队列是否为空,为空则返回TRUE,不为空则返回FALSE。
**
**
**
** 输入变量: struct BUFFER_QUEUE *p_buffer;
** 返回值: void;
**
** 使用宏或常量: None;
** 使用全局变量: None;
**
** 调用函数: None;
**
** 创建人:
** 创建日期: 2009-03-07
**------------------------------------------------------------------------------------------------------------------------
** 修订人:
** 修订日期:
**------------------------------------------------------------------------------------------------------------------------
*************************************************************************************************************************/
static uint8 TestEmptyBufferQueue(BUFFER_QUEUE *p_buffer)
{
return (p_buffer->rear == p_buffer->front);
}
/*************************************************************************************************************************
** 函数名称: AddBufferQueue
**
** 函数描述: 向缓冲队列添加元素,队尾指针rear加1。
**
**
** 输入变量: struct BUFFER_QUEUE *p_buffer; uint8 &item;
** 返回值: void;
**
** 使用宏或常量: None;
** 使用全局变量: None;
**
** 调用函数: None;
**
** 创建人:
** 创建日期: 2009-03-07
**------------------------------------------------------------------------------------------------------------------------
** 修订人:
** 修订日期:
**------------------------------------------------------------------------------------------------------------------------
*************************************************************************************************************************/
static void AddBufferQueue(BUFFER_QUEUE *p_buffer, uint8 item)
{
*p_buffer->rear = item;// 数据入队
p_buffer->rear++;// 队尾地址+1
if (p_buffer->rear >= (p_buffer->init_address + p_buffer->length))// 队尾地址超过分配内存边界
{
p_buffer->rear = p_buffer->init_address;// 队尾地址回缓冲区首地址
}
if (p_buffer->rear == p_buffer->front)// 队列长度大于缓冲区长度
{
SetRegMask(p_buffer->state, ERR_MASK, ERR_OVERRUN);// 置溢出错误标志
}
}
/*************************************************************************************************************************
** 函数名称: OutBufferQueue
**
** 函数描述: 从队列取出元素,队头指针front加1。当队列为空时返回FALSE,操作成功返回TRUE。
**
**
**
** 输入变量: struct BUFFER_QUEUE *p_buffer; uint8 &item;
** 返回值: uint8;
**
** 使用宏或常量: None;
** 使用全局变量: None;
**
** 调用函数: None;
**
** 创建人:
** 创建日期: 2009-03-07
**------------------------------------------------------------------------------------------------------------------------
** 修订人:
** 修订日期:
**------------------------------------------------------------------------------------------------------------------------
*************************************************************************************************************************/
static uint8 OutBufferQueue(BUFFER_QUEUE *p_buffer, uint8 *p_item)
{
if(TestEmptyBufferQueue(p_buffer))
{
return FALSE;
}
else
{
*p_item = *p_buffer->front;// 数据出队
p_buffer->front++;
if(p_buffer->front >= (p_buffer->init_address + p_buffer->length))
{
p_buffer->front = p_buffer->init_address;
}
return TRUE;
}
}
/*************************************************************************************************************************
** 函数名称: CheckBufferQueueLength
**
** 函数描述: 检查缓冲队列长度;
**
** 输入变量: struct BUFFER_QUEUE *p_buffer;
** 返回值: void;
**
** 使用宏或常量: None;
** 使用全局变量: None;
**
** 调用函数: None;
**
** 创建人:
** 创建日期: 2009-08-19
**------------------------------------------------------------------------------------------------------------------------
** 修订人:
** 修订日期:
**------------------------------------------------------------------------------------------------------------------------
*************************************************************************************************************************/
static uint8 CheckBufferQueueLength(BUFFER_QUEUE* p_buffer)
{
uint8 temp_value = 0;
if (p_buffer->rear >= p_buffer->front)
{
temp_value = p_buffer->rear - p_buffer->front;
}
else
{
temp_value = p_buffer->front - p_buffer->rear;
temp_value = p_buffer->length - temp_value;
}
return temp_value;
}
/*************************************************************************************************************************
** 函数名称: CheckBufferQueueState
**
** 函数描述: 检查缓冲队列状态,分配内存空间失败、数据溢出等;
**
**
**
** 输入变量: struct BUFFER_QUEUE *p_buffer;
** 返回值: void;
**
** 使用宏或常量: None;
** 使用全局变量: None;
**
** 调用函数: None;
**
** 创建人:
** 创建日期: 2009-08-19
**------------------------------------------------------------------------------------------------------------------------
** 修订人:
** 修订日期:
**------------------------------------------------------------------------------------------------------------------------
*************************************************************************************************************************/
static uint8 CheckBufferQueueState(BUFFER_QUEUE *p_buffer)
{
return p_buffer->state;
}
/*************************************************************************************************************************
** 函数名称: ClearBufferQueue
**
** 函数描述: 清空队列;
**
**
** 输入变量: struct BUFFER_QUEUE *p_buffer;
** 返回值: void;
**
** 使用宏或常量: None;
** 使用全局变量: None;
**
** 调用函数: None;
**
** 创建人:
** 创建日期: 2009-08-19
**------------------------------------------------------------------------------------------------------------------------
** 修订人:
** 修订日期:
**------------------------------------------------------------------------------------------------------------------------
*************************************************************************************************************************/
static void ClearBufferQueue(BUFFER_QUEUE *p_buffer)
{
p_buffer->rear = p_buffer->front;// 移动头尾指针
SetReg(p_buffer->state, 0);// 初始化状态寄存器
SetRegBit(p_buffer->state, INIT_COMPLETE);// 置位初始化完成标志
}
/*************************************************************************************************************************
结构体声明
*************************************************************************************************************************/
BUFFER_QUEUE_CONTROL_STRUCT buffer_queue_control =
{
.pInit = InitBufferQueue,
.pTestEmpty = TestEmptyBufferQueue,
.pAdd = AddBufferQueue,
.pOut = OutBufferQueue,
.pCheckLength = CheckBufferQueueLength,
.pCheckState = CheckBufferQueueState,
.pClear = ClearBufferQueue,
};
/*************************************************************************************************************************
** 文件结束
*************************************************************************************************************************/