• queue 的C语言实现


    /*
     * 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,
    };
    
    
    
    
    /*************************************************************************************************************************
    ** 文件结束
    *************************************************************************************************************************/

  • 相关阅读:
    不要随便用#define 沉沉_
    转载堆和栈的区别 沉沉_
    转载include包含源文件引发的错误 沉沉_
    浅议C和C++中的内存分配 沉沉_
    volatile 的应用 沉沉_
    Debian显示txt乱码
    Debian 64位安装wink
    Debian安装vmware虚拟机
    Debian安装scim中文、日语输入法
    Debian安装chrome
  • 原文地址:https://www.cnblogs.com/xiabodan/p/4038657.html
Copyright © 2020-2023  润新知