一个循环队列的实现及测试函数
这是一个通过一个连续地址端存储空间(数组)和头、尾的指标实现的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
.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;
}
测试用例:
///////////////////////////////////////////// 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;
}
测试结果:
$ ./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
找机会换掉我的FIFO试试这个 qin552011373 发表于 2022-1-7 14:44
找机会换掉我的FIFO试试这个
有空再帮我多测测,有问题随时反馈
{:lol:} keer_zu 发表于 2022-1-7 16:15
有空再帮我多测测,有问题随时反馈
没问题 @21ic小管家 至少先给个编辑推荐吧 循环队列
页:
[1]