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


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;

robin_queue_tec20_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 = 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;

robin_queue_ttest_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

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

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

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

====len:0

qin552011373 发表于 2022-1-7 14:44

找机会换掉我的FIFO试试这个

keer_zu 发表于 2022-1-7 16:15

qin552011373 发表于 2022-1-7 14:44
找机会换掉我的FIFO试试这个

有空再帮我多测测,有问题随时反馈
{:lol:}

qin552011373 发表于 2022-1-7 17:57

keer_zu 发表于 2022-1-7 16:15
有空再帮我多测测,有问题随时反馈

没问题

keer_zu 发表于 2022-1-12 10:01

@21ic小管家 至少先给个编辑推荐吧

keer_zu 发表于 2025-2-6 11:40

循环队列
页: [1]
查看完整版本: 一个循环队列的实现及测试函数