打印

一个循环队列的实现及测试函数

[复制链接]
1327|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2022-1-7 14:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是一个通过一个连续地址端存储空间(数组)和头、尾的指标实现的FIFO。配有测试用例,首先看头文件对数据结构和接口的定义:

#ifndef __ROUND_ROBIN__
#define __ROUND_ROBIN__

#define QUE_OK 0
#define QUE_ERR -1

#define QUE_TURN 1
#define QUE_FALSE 0
       

#ifndef NULL
#define NULL ((void *)0)
#endif

typedef struct{
        char *buf;
        unsigned int buf_size;
        int front;
        int rear;
}robin_queue_t;


int queue_init(robin_queue_t *q);
int queue_length(robin_queue_t *q);
int queue_is_full(robin_queue_t *q);
int queue_insert(robin_queue_t *q,char item);
int queue_is_empty(robin_queue_t *q);
char *queue_get_item(robin_queue_t *q);
int queue_del_item(robin_queue_t *q);



#endif
  

本贴及后面讲解都是原创,申请"原创”和“编辑推荐”。@21ic小管家 @21小跑堂

@qin552011373


使用特权

评论回复
评分
参与人数 1威望 +10 收起 理由
qin552011373 + 10 很给力!

相关帖子

沙发
keer_zu|  楼主 | 2022-1-7 14:14 | 只看该作者
.c文件,实现:
#include <string.h>
#include <stdio.h>
#include "round_robin_queue.h"
#include "sys.h"

extern void ENTER_CRITICAL() ;
extern void EXIT_CRITICAL() ;

#define RECV_BUF_SIZE 512  

char ec20_recv_buf[RECV_BUF_SIZE];

robin_queue_t  ec20_recv_queue = {
        .buf = ec20_recv_buf,
        .buf_size = RECV_BUF_SIZE
};


/********************** frame buffer queue ******************************/
int queue_init(robin_queue_t *q)
{
        q->front = 0;
        q->rear = 0;
        memset(q->buf,0,q->buf_size);
}

int queue_length(robin_queue_t *q)
{
        if(q == NULL)
                return QUE_ERR;
       
        if(q->rear >= q->front) {
                return q->rear - q->front;
        } else {
                return q->rear + q->buf_size - q->front;
        }
}



int queue_is_full(robin_queue_t *q)
{
        if(q == NULL)
                return QUE_ERR;
       
        if(q->front == (q->rear + 1) % q->buf_size) //
                return QUE_TURN;  
        else  
                return QUE_FALSE;  
}


int queue_insert(robin_queue_t *q,char item)
{
        if(q == NULL)
                return QUE_ERR;  
       
        if(queue_is_full(q))
                return QUE_ERR;  

       
        ENTER_CRITICAL();
        q->buf[q->rear] = item;
        q->rear = (q->rear + 1) % q->buf_size; //
        EXIT_CRITICAL();

       
        return QUE_OK;  

}

int queue_is_empty(robin_queue_t *q)
{
        if(q == NULL)
                return QUE_ERR;
       
        if(q->front == q->rear) {
                return QUE_TURN;  
        } else  {
                return QUE_FALSE;  
        }
}

char *queue_get_item(robin_queue_t *q)
{
        char *item;
       
        if(!queue_is_empty(q)){
                item = q->buf + q->front;
               
                ENTER_CRITICAL();
                q->front = (q->front + 1) % q->buf_size;
                EXIT_CRITICAL();
               
                return item;
        } else {
                return NULL;
        }
}

int queue_del_item(robin_queue_t *q)
{  
        if(q == NULL)
                return QUE_ERR;
       
        if(queue_is_empty(q))
                return QUE_ERR;

        ENTER_CRITICAL();
        q->front  = (q->front  + 1) % q->buf_size;  
        EXIT_CRITICAL();

        return QUE_OK;       
}



使用特权

评论回复
板凳
keer_zu|  楼主 | 2022-1-7 14:18 | 只看该作者
测试用例:

///////////////////////////////////////////// test ////////////////////////////////////

#define TEST_BUF_SIZE 100
char test_buf[TEST_BUF_SIZE];

robin_queue_t  test_queue = {
        .buf = test_buf,
        .buf_size = TEST_BUF_SIZE
};


void _test_queue(void)
{
        int i,ret;
        char *item = NULL;
        queue_init(&test_queue);

        for(i = 1;i <= test_queue.buf_size + 10;i ++) {
                ret = queue_insert(&test_queue,(char)i);
                if(ret != QUE_OK) {
                        printf("erro:%d  ",i);
                }
}

printf("====len:%d\n",queue_length(&test_queue));

        while(!queue_is_empty(&test_queue)) {
                item = queue_get_item(&test_queue);
                if(item != NULL) {
                        printf("item:%d  ",*item);
                }
        }

        printf("\n\n");

        int it = 0;//test_queue.buf_size/2;

        while(!queue_is_full(&test_queue)) {
                printf("inst:%d  ",it);
                queue_insert(&test_queue,(char)it);
                it ++;
        }

        printf("\n\n");
        while(!queue_is_empty(&test_queue)) {
                item = queue_get_item(&test_queue);
                if(item != NULL) {
                        printf("item:%d  ",*item);
                }
        }
        printf("\n\n");

        printf("====len:%d\n",queue_length(&test_queue));
}

int main(void)
{
        _test_queue();
        return 0;
}


使用特权

评论回复
地板
keer_zu|  楼主 | 2022-1-7 14:21 | 只看该作者
测试结果:
[ops@mit-service160-132 ~]$ ./oq
erro:100  erro:101  erro:102  erro:103  erro:104  erro:105  erro:106  erro:107  erro:108  erro:109  erro:110  ====len:99
item:1  item:2  item:3  item:4  item:5  item:6  item:7  item:8  item:9  item:10  item:11  item:12  item:13  item:14  item:15  item:16item:17  item:18  item:19  item:20  item:21  item:22  item:23  item:24  item:25  item:26  item:27  item:28  item:29  item:30  item:31item:32  item:33  item:34  item:35  item:36  item:37  item:38  item:39  item:40  item:41  item:42  item:43  item:44  item:45  item:46item:47  item:48  item:49  item:50  item:51  item:52  item:53  item:54  item:55  item:56  item:57  item:58  item:59  item:60  item:61item:62  item:63  item:64  item:65  item:66  item:67  item:68  item:69  item:70  item:71  item:72  item:73  item:74  item:75  item:76item:77  item:78  item:79  item:80  item:81  item:82  item:83  item:84  item:85  item:86  item:87  item:88  item:89  item:90  item:91item:92  item:93  item:94  item:95  item:96  item:97  item:98  item:99

inst:0  inst:1  inst:2  inst:3  inst:4  inst:5  inst:6  inst:7  inst:8  inst:9  inst:10  inst:11  inst:12  inst:13  inst:14  inst:15  inst:16  inst:17  inst:18  inst:19  inst:20  inst:21  inst:22  inst:23  inst:24  inst:25  inst:26  inst:27  inst:28  inst:29  inst:30  inst:31  inst:32  inst:33  inst:34  inst:35  inst:36  inst:37  inst:38  inst:39  inst:40  inst:41  inst:42  inst:43  inst:44  inst:45  inst:46  inst:47  inst:48  inst:49  inst:50  inst:51  inst:52  inst:53  inst:54  inst:55  inst:56  inst:57  inst:58  inst:59  inst:60  inst:61  inst:62  inst:63  inst:64  inst:65  inst:66  inst:67  inst:68  inst:69  inst:70  inst:71  inst:72  inst:73  inst:74  inst:75  inst:76  inst:77  inst:78  inst:79  inst:80  inst:81  inst:82  inst:83  inst:84  inst:85  inst:86  inst:87  inst:88  inst:89  inst:90  inst:91  inst:92  inst:93  inst:94  inst:95  inst:96  inst:97  inst:98

====len:99
item:0  item:1  item:2  item:3  item:4  item:5  item:6  item:7  item:8  item:9  item:10  item:11  item:12  item:13  item:14  item:15  item:16  item:17  item:18  item:19  item:20  item:21  item:22  item:23  item:24  item:25  item:26  item:27  item:28  item:29  item:30  item:31  item:32  item:33  item:34  item:35  item:36  item:37  item:38  item:39  item:40  item:41  item:42  item:43  item:44  item:45  item:46  item:47  item:48  item:49  item:50  item:51  item:52  item:53  item:54  item:55  item:56  item:57  item:58  item:59  item:60  item:61  item:62  item:63  item:64  item:65  item:66  item:67  item:68  item:69  item:70  item:71  item:72  item:73  item:74  item:75  item:76  item:77  item:78  item:79  item:80  item:81  item:82  item:83  item:84  item:85  item:86  item:87  item:88  item:89  item:90  item:91  item:92  item:93  item:94  item:95  item:96  item:97  item:98

====len:0


使用特权

评论回复
5
qin552011373| | 2022-1-7 14:44 | 只看该作者
找机会换掉我的FIFO试试这个

使用特权

评论回复
6
keer_zu|  楼主 | 2022-1-7 16:15 | 只看该作者
qin552011373 发表于 2022-1-7 14:44
找机会换掉我的FIFO试试这个

有空再帮我多测测,有问题随时反馈

使用特权

评论回复
7
qin552011373| | 2022-1-7 17:57 | 只看该作者
keer_zu 发表于 2022-1-7 16:15
有空再帮我多测测,有问题随时反馈

没问题

使用特权

评论回复
8
keer_zu|  楼主 | 2022-1-12 10:01 | 只看该作者
@21ic小管家 至少先给个编辑推荐吧

使用特权

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

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1352

主题

12436

帖子

53

粉丝