打印

源码公开

[复制链接]
960|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Vansm|  楼主 | 2018-8-3 13:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
Vansm|  楼主 | 2018-8-3 13:51 | 只看该作者
本帖最后由 Vansm 于 2018-8-3 14:07 编辑
<div class="blockcode"><blockquote>/*
**#############################################################################
**      SVN Information
**
**      Checked In          : 2017-12-27
**
**      Author              : Fan
**
**      Revision            : V1.1
**
**      Release Information : Loop queue (.c)
**#############################################################################
*/

#include "Loop_queue.h"

/*
**#############################################################################
** Loop queue initialzation
**#############################################################################
*/
void LoopQueueInit(LoopQueue *queue)
{
    unsigned int i = 0;
    queue->getIndex = 0;
    queue->putIndex = 0;
    queue->dataNumber = 0;
    for(i = 0; i<QUEUE_MAX_LENGTH; i++)
    {
        queue->queueFIFO[i] = 0;   // Clear all fifo
    }
}

/*
**#############################################################################
** Loop queue clear
**#############################################################################
*/
void LoopQueueClear(LoopQueue *queue)
{
    unsigned int clearIndex;

    queue->getIndex = 0;
    queue->putIndex = 0;
    for(clearIndex = 0; clearIndex < QUEUE_MAX_LENGTH ; clearIndex ++)
    {
        queue->queueFIFO[clearIndex] = 0;
    }
    queue->dataNumber = 0;
}

/*
**#############################################################################
** Loop queue write data by pointer
**#############################################################################
*/
LoopQueueStateType LoopQueueWrite(LoopQueue *queue, unsigned char *data, unsigned int length)
{
    unsigned int i = 0;
    if(length > (QUEUE_MAX_LENGTH - queue->dataNumber))   
    {
        return UNDONE;
    }
    for(i = 0; i<length ; i++)
    {
        if((QUEUE_MAX_LENGTH - queue->dataNumber) == 0)
        {
            return FULL;
        }
        queue->queueFIFO[queue->putIndex] = *(data++);
        queue->dataNumber ++;
        if(queue->putIndex == QUEUE_MAX_LENGTH-1)
        {
           queue->putIndex = 0;
        }
        else
        {
           queue->putIndex ++;
        }
    }
    return DONE;
}

/*
**#############################################################################
** Loop queue read data from queue and put its into somewhere with pointer
**#############################################################################
*/
LoopQueueStateType LoopQueueRead(LoopQueue *queue, unsigned char *addr ,unsigned int length)
{
    unsigned int i = 0;

    if(queue->dataNumber == 0)
    {
        return EMPTY;
    }
    for(i = 0; i<length; i++)
    {
        if(queue->dataNumber == 0)
        {
            return UNDONE;
        }
        *addr++ = queue->queueFIFO[queue->getIndex];
        queue->dataNumber --;
        if(queue->getIndex == QUEUE_MAX_LENGTH-1)
        {
           queue->getIndex = 0;
        }
        else
        {
           queue->getIndex ++;
        }
    }
    return DONE;
}

/*
**#############################################################################
** Loop queue write one data
**#############################################################################
*/
LoopQueueStateType LoopQueueWriteOne(LoopQueue *queue, unsigned char data)
{
    if((QUEUE_MAX_LENGTH - queue->dataNumber) == 0)
    {
        return FULL;
    }
    queue->queueFIFO[queue->putIndex] = data;
    queue->dataNumber ++;
    if(queue->putIndex == QUEUE_MAX_LENGTH-1)
    {
         queue->putIndex = 0;
    }
    else
    {
         queue->putIndex ++;
    }

    return DONE;
}

/*
**#############################################################################
** Loop queue read one data
**#############################################################################
*/
LoopQueueStateType LoopQueueReadOne(LoopQueue *queue, unsigned char *addr)
{
    if(queue->dataNumber == 0)
    {
        return EMPTY;
    }
    *addr = queue->queueFIFO[queue->getIndex];
    queue->dataNumber --;
    if(queue->getIndex == QUEUE_MAX_LENGTH-1)
    {
         queue->getIndex = 0;
    }
    else
    {
         queue->getIndex ++;
    }
    return DONE;
}

/*
**#############################################################################
** Loop queue get data length
**#############################################################################
*/
unsigned int LoopQueueGetLength(LoopQueue *queue)
{
    return queue->dataNumber;
}

使用特权

评论回复
板凳
Vansm|  楼主 | 2018-8-3 13:52 | 只看该作者
/*
**#############################################################################
**      SVN Information
**
**      Checked In          : 2017-12-27
**
**      Author              : Fan
**
**      Revision            : V1.1
**
**      Release Information : Loop queue head file(.h)
**#############################################################################
*/

#ifndef _RING_QUEUE_H_
#define _RING_QUEUE_H_

#define QUEUE_MAX_LENGTH  256                   // The max length of queue

//---------------- Loop queue states
typedef enum _LoopQueueStateType
{
    EMPTY = 0x50000000,                         // Queue is empty
    FULL,                                       // Queue is full
    DONE,                                       // Queue operating is done
    UNDONE,                                     // Queue operating is not done
}LoopQueueStateType;

//---------------- Loop queue struct
typedef struct _LoopQueue
{
    unsigned char putIndex;                     // Put data index
    unsigned char getIndex;                     // Get data index
    unsigned int dataNumber;                    // Current data number
    unsigned char queueFIFO[QUEUE_MAX_LENGTH];  // Loop queue FIFO
}LoopQueue;

//---------------- Loop queue initialization
extern void LoopQueueInit(LoopQueue *queue);

//---------------- Loop queue clear
extern void LoopQueueClear(LoopQueue *queue);

//---------------- Loop queue write data by pointer and length of data
extern LoopQueueStateType LoopQueueWrite(LoopQueue *queue, unsigned char *data, unsigned int length);

//---------------- Loop queue read data and put data by it's pointer
extern LoopQueueStateType LoopQueueRead(LoopQueue *queue, unsigned char *addr ,unsigned int length);

//---------------- Loop queue write one data
extern LoopQueueStateType LoopQueueWriteOne(LoopQueue *queue, unsigned char data);

//---------------- Loop read once
extern LoopQueueStateType LoopQueueReadOne(LoopQueue *queue, unsigned char *addr);

//---------------- Get the data length with queue pointer
extern unsigned int LoopQueueGetLength(LoopQueue *queue);

#endif


使用特权

评论回复
地板
new21jackie| | 2018-8-3 22:09 | 只看该作者
  直接 i < dataNumber 不就完了吗? 自己练练手就可以了,开源社区里的这种轮子已经很多了。
  for(i = 0; i<length; i++)
    {
        if(queue->dataNumber == 0)
        {
            return UNDONE;
        }

使用特权

评论回复
5
Vansm|  楼主 | 2018-8-3 22:12 | 只看该作者
new21jackie 发表于 2018-8-3 22:09
直接 i < dataNumber 不就完了吗? 自己练练手就可以了,开源社区里的这种轮子已经很多了。
  for(i = 0; ...

哎 其实是想发来让大家帮找找bug

使用特权

评论回复
6
caijie001| | 2018-8-3 22:46 | 只看该作者
谢谢分享,下载看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

187

帖子

3

粉丝