裸机中环形队列与RTOS中消息队列的区别
来源:strongerhuang
环形队列
环形队列是在实际编程极为有用的数据结构,它是一个首尾相连的FIFO的数据结构,采用数组的线性空间,数据组织简单,能很快知道队列是否满为空,能以很快速度的来存取数据。
环形队列通常用于通信领域,比如UART、USB、CAN、网络等。

当head赶上tail,队列空,则令tag=0
当tail赶上head,队列满,则令tag=1
队列空: head==tail
队列满: (tail+1)% MAXN ==head
typedef struct ringq{int head; /* 头部,出队列方向*/int tail; /* 尾部,入队列方向*/int tag ;int size ; /* 队列总尺寸 */int space[RINGQ_MAX]; /* 队列空间 */}RINGQ;
初始化状态:
q->head = q->tail = q->tag = 0;队列为空:
( q->head == q->tail) && (q->tag == 0)队列为满 :
((q->head == q->tail) && (q->tag == 1))入队操作,如队列不满,则写入:
q->tail = (q->tail + 1) % q->size ;出队操作,如果队列不空,则从head处读出。
下一个可读的位置在:
q->head = (q->head + 1) % q->sizeextern "C" {typedef struct ringq{int head; /* 头部,出队列方向*/int tail; /* 尾部,入队列方向*/int tag ; /* 为空还是为满的标志位*/int size ; /* 队列总尺寸 */int space[QUEUE_MAX]; /* 队列空间 */}RINGQ;/*第一种设计方法:当head == tail 时,tag = 0 为空,等于 = 1 为满。*/extern int ringq_init(RINGQ * p_queue);extern int ringq_free(RINGQ * p_queue);/* 加入数据到队列 */extern int ringq_push(RINGQ * p_queue,int data);/* 从队列取数据 */extern int ringq_poll(RINGQ * p_queue,int *p_data);}
#include#include "ringq.h"int ringq_init(RINGQ * p_queue){p_queue->size = QUEUE_MAX ;p_queue->head = 0;p_queue->tail = 0;p_queue->tag = 0;return 0;}int ringq_free(RINGQ * p_queue){return 0;}int ringq_push(RINGQ * p_queue,int data){print_ringq(p_queue);if(ringq_is_full(p_queue)){printf("ringq is full\n");return -1;}p_queue->space[p_queue->tail] = data;p_queue->tail = (p_queue->tail + 1) % p_queue->size ;/* 这个时候一定队列满了*/if(p_queue->tail == p_queue->head){p_queue->tag = 1;}return p_queue->tag ;}int ringq_poll(RINGQ * p_queue,int * p_data){print_ringq(p_queue);if(ringq_is_empty(p_queue)){printf("ringq is empty\n");return -1;}*p_data = p_queue->space[p_queue->head];p_queue->head = (p_queue->head + 1) % p_queue->size ;/* 这个时候一定队列空了*/if(p_queue->tail == p_queue->head){p_queue->tag = 0;}return p_queue->tag ;}
消息队列
在RTOS中基本都有消息队列这个组件,也是使用最常见的组件之一。
消息支持先进先出方式排队,支持异步读写工作方式。
读写队列均支持超时机制。
消息支持后进先出方式排队,往队首发送消息(LIFO)。
可以允许不同长度(不超过队列节点最大值)的任意类型消息。
一个任务能够从任意一个消息队列接收和发送消息。
多个任务能够从同一个消息队列接收和发送消息。
当队列使用结束后,可以通过删除队列函数进行删除。

xQueue = xQueueCreate(QUEUE_LEN, QUEUE_SIZE);
4.消息队列的阻塞机制
“环形队列”和“消息队列”的异同
通过以上分析,你会发现“环形队列”和“消息队列”之间有很多共同点:
1.他们都是一种数据结构,结构中都包含头、尾、标志等信息;
2.它们都是分配一块连续的内存空间,且都可以分配多个队列。
3.应用场景类似,有大量吞吐数据的情况下,比如通信领域。
版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
关注我的微信公众号,回复“加群”按规则加入技术交流群。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。
