首页 > 新闻频道 > 滚动  
环形队列到底是怎么回事?
2021-12-15 20:36:43  来源:中国文化报道网  作者:  分享:

前两天看到一位朋友转发了公众号:嵌入式Linux 作者发哥的一篇C语言环形队列文章:C语言,环形队列,写的非常好。做过实际项目的朋友大概率都用到过队列,它可用于解决生产者消费者产出和消费不平衡的问题,举两个我之前项目中遇到的案例:

1) 我需要在一块屏幕上显示多种事件,而事件的来源很多、触发时间也很快,但是屏幕由于资源限制,没法把所有事件都同步显示。这时就可以使用队列,将事件插入到队列中,显示程序读取队列中的事件逐条显示。

2) 我在之前文章:一个蓝牙实战项目的掏肺总结 里提到的那个蓝牙收发器,蓝牙芯片一方面接收手机发过来的数据,另一方面要把该数据通过USB 发送出去,但是USB发送数据的间隔又要求比较长,这也可以通过队列来解决。

C++里有现成的队列函数,但是C语言需要自己来实现,我之前项目里用到了Github上的一个代码,https://github.com/kuaileguyue/Ring-Buffer ,简洁好用。那时就是用,因为大概知道原理,就没有认真的去分析代码的实现细节,这次刚好看到发哥文章下有很多关于环形队列的留言讨论,我就详细的去看了一下之前用的代码,发现收获还是不小的,在此分享给大家。

先上代码:

ringbuffer.h

#include <inttypes.h>

/**
 * @file
 * Prototypes and structures for the ring buffer module.
 */

#ifndef RINGBUFFER_H
#define RINGBUFFER_H

/**
 * The size of a ring buffer.
 * Due to the design only <tt> RING_BUFFER_SIZE-1 </tt> items
 * can be contained in the buffer.
 * The buffer size must be a power of two.
*/
#define RING_BUFFER_SIZE 128

#if (RING_BUFFER_SIZE & (RING_BUFFER_SIZE - 1)) != 0
#error "RING_BUFFER_SIZE must be a power of two"
#endif

/**
 * The type which is used to hold the size
 * and the indicies of the buffer.
 * Must be able to fit /c RING_BUFFER_SIZE .
 */
typedef uint8_t ring_buffer_size_t;

/**
 * Used as a modulo operator
 * as <tt> a % b = (a & (b 

 

相关新闻

    无相关信息

◎版权作品,未经中国文化报道网书面授权,严禁转载,违者将被追究法律责任。


关于我们 - 媒体合作 - 广告服务 - 版权声明 - 联系我们 - 友情链接 - 网站地图

Copyright 2015-2019. 中国文化报道网 www.cgia.cn All rights reserved.

违法和不良信息举报邮箱:jubao@cgia.cn

未经过本站允许,请勿将本站内容传播或复制