首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

环形缓冲区实现

队列到串口缓冲区实现 串口环形缓冲区收发:在很多入门级教程中,我们知道串口收发都是:接收一个数据,触发中断,然后把数据发回来。...将接受数据缓存一下,让处理速度有些许缓冲,使得处理速度赶得上接收速度,上面又已经分析了普通队列环形队列优劣了,那么我们肯定是用环形队列来进行实现了。...写入环形缓冲区代码实现: 1/** 2* @brief Write_RingBuff 3* @param u8 data 4* @return FLASE:环形缓冲区已满,写入失败;TRUE...补充 对于现在阶段,杰杰我本人写代码也慢慢学会规范了。所有的代码片段均使用了可读性很强,还有可移植性也很强。...我使用了宏定义来决定是否开启环形缓冲区方式来收发数据,移植到大家代码并不会有其他副作用,只需要开启宏定义即可使用了。

2.8K40
您找到你想要的搜索结果了吗?
是的
没有找到

优雅地用宏实现环形缓冲区

循环缓冲区是嵌入式软件工程师在日常开发过程中关键组件。 多年来,互联网上出现了许多不同循环缓冲区实现和示例。我非常喜欢这个模块,可以GitHub上找到这个开源 CBUF.h 模块。...地址:https://github.com/barraq/BRBrain/blob/master/firmware/CBUF.h CBUF.h 模块使用实现循环缓冲区,具体源码如下所示; #if !...,但实现已被证明是快速、高效且工作相对良好,这是很难争论。...例如,可以使用 CBUF_PUSH 将通过串行接口接收 UART接收字符推送到循环缓冲区,如图 3 所示。...循环缓冲区是在嵌入式系统中与串行设备通信一个重要方面。 循环缓冲区也很好理解,应该创建它们以便它们可以模块化并从一个应用程序到下一个应用程序重复使用

91810

每日一博 - 使用环形队列实现高效延时消息

---- Pre 来个场景: 24小时后将未进行某个Action业务,执行另外一个动作。 比如 24小时未付款订单,取消。 你可能会说 ?...But… 这方案有些明显缺点啊,老哥 (1)轮询效率比较低 (2)时效性不好,假设每小时轮询一次,最坏情况下,时间误差会达到1小时; ---- 那如何既保证效率同时,又保证实时性呢?...---- 方案B 来说下核心思路 高效延时消息,包含两个重要数据结构: 环形队列。例如可以创建一个大小为3600环形队列 任务集合。...环上每一个格是一个Set 同时,启动一个timer: 每隔1s,timer在环形队列中移动一格 用一个Current Index来标识当前所在格; Task结构中包含两个重要属性:...中; (2)计算这个TaskCycle-Num,由于环形队列是3600格(每秒移动一格,正好1小时),这个任务是3610秒后执行。

78940

数据结构 | TencentOS-tiny中队列环形队列、优先级队列实现使用

环形队列 2.1. 环形队列特点 普通队列入队操作将队尾指针后移+1,出队操作将队头指针后移+1,操作几次之后会发现队头指针和队尾指针都跑到缓冲区尾部去了: ?...环形队列实现 TencentOS-tiny中环形队列实现在tos_ring_queue.h和tos_ring_queue.c中。...环形队列使用Demo 编写如下测试代码: #include typedef struct item_st { int a; int b; int c; }...优先级队列实现 TencentOS-tiny中环形队列实现在tos_prio_queue.h和tos_prio_queue.c中。...总结 ① 普通队列是一种只能在一端入队,在一端出队数据结构,规则:FIFO。 ② 环形队列对内存空间利用率最高,使用最多,规则:FIFO。

82120

音视频环形缓冲区 介绍与实现

一、什么是环形缓冲区 环形缓冲区(也称为循环缓冲区)是固定大小缓冲区,工作原理就像内存是连续且可循环一样。...二、为什么使用环形缓冲区 环形缓冲区是嵌入式系统中十分重要一种数据结构,比如在一个音视频处理机制中,环形缓冲区就可以理解为数据码流通道,每一个通道都对应着一个环形缓冲区,这样数据在读取和写入时候都可以在这个缓冲区里循环进行...,程序员可以根据自己需要数据大小来决定自己使用缓冲区大小。...环形缓冲区通常用作固定大小队列。固定大小队列对于嵌入式系统开发非常友好,因为开发人员通常会尝试使用静态数据存储方法而不是动态分配。...通过使用循环缓冲区,能够保证我们始终使用最新数据。 三、代码实现 1.

87130

【RTOS训练营】作业讲解、队列环形缓冲区队列——传输数据、队列——同步任务和晚课提问

改成这样就没问题: 现在可以看到了,空闲任务运行时间非常非常短: 二:队列环形缓冲区 队列没什么复杂,本质就是一个环形缓冲区,再加上任务休眠和唤醒。...对于环形缓冲区,它有如下要点: 有读写位置 写到buff尾部之后,要绕到头部 读到buff尾部之后,要绕到头部 这里再复习下环形缓冲区。...“环形缓冲区”那几个文字一个指向是“写位置”,另一个指向是“读位置”。...在以前讲环形缓冲区时候,有同学问过一个问题:能不能够创建一个通用环形缓冲区?可以用来传递任意大小数据。 可以,队列就是:你可以指定这个环形缓冲区里每一个元素多大,有多少个元素。...可以看到,它创建一个队列时候,会去创建一个结构体Queue_t,还会去分配保存数据空间: 三:队列——传输数据 我们可以通过队列传递数据、同步任务,实现互斥操作。 怎么传递数据?

42640

无锁环形缓冲区详细解释

大家好,又见面了,我是你们朋友全栈君。 由以下博客分析可以知道,内核kfifo使用了很多技巧以实现其高效性。比如,通过限定写入数据不能溢出和内存屏障实现在单线程写单线程读情况下不使用锁。...后面有一篇博客还介绍了VxWorks下环形缓冲区实现机制点击打开链接,从而可以看出linux下fifo灵巧性和高效性。...kfifo是一种”First In First Out “数据结构,它采用了前面提到环形缓冲区实现,提供一个无边界字节流服务。...更重要是,kfifo采用了并行无锁技术,kfifo实现单生产/单消费模式共享队列是不需要加锁同步。...《眉目传情之并发无锁环形队列实现》给出自己并发无锁实现,有兴趣朋友可以参考一下。

82830

第10期 | ringbuff,通用FIFO环形缓冲区实现

嵌入式开源项目精选专栏 本专栏由Mculover666创建,主要内容为寻找嵌入式领域内优质开源项目,一是帮助开发者使用开源项目实现更多功能,二是通过这些开源项目,学习大佬代码及背后实现思想,提升自己代码水平...1. ringbuff 本期给大家带来开源项目是 ringbuff ,一款通用FIFO环形缓冲区实现开源库,作者MaJerle,目前收获 79 个 star,遵循 MIT 开源许可协议。...目前 ringbuff 特点有: 使用C99语法编写,并且没有平台相关代码; 没有动态内存分配; 使用更优内存复制而不是循环从内存读取数据/向内存写入数据; 项目地址:https://github.com...相较于数组,环形缓冲区对整段内存利用达到最大,并且使用非常方便,如下: ① 写入时候不用手动维护下标,直接写入即可(由缓冲区实现维护); ② 读取时候不用判断从哪里读,直接读取即可(有缓冲区实现维护...设计思想解读 关于环形缓冲区背后设计实现,请阅读这篇文章,写非常棒: STM32进阶之串口环形缓冲区实现

1.1K30

第10期 | ringbuff,通用FIFO环形缓冲区实现

1. ringbuff 本期给大家带来开源项目是 ringbuff ,一款通用FIFO环形缓冲区实现开源库,作者MaJerle,目前收获 79 个 star,遵循 MIT 开源许可协议。...目前 ringbuff 特点有: 使用C99语法编写,并且没有平台相关代码; 没有动态内存分配; 使用更优内存复制而不是循环从内存读取数据/向内存写入数据; 项目地址:https://github.com...缓冲区有两种形式,一种是数组,一种就是本文所介绍环形缓冲区ringbuff。...相较于数组,环形缓冲区对整段内存利用达到最大,并且使用非常方便,如下: ① 写入时候不用手动维护下标,直接写入即可(由缓冲区实现维护); ② 读取时候不用判断从哪里读,直接读取即可(有缓冲区实现维护...设计思想解读 关于环形缓冲区背后设计实现,请阅读这篇文章,写非常棒: STM32进阶之串口环形缓冲区实现

1.5K11

环形缓冲区-Hadoop Shuffle过程中利器

这篇文章来自一个读者在面试过程中一个问题,Hadoop在shuffle过程中使用了一个数据结构-环形缓冲区。...环形队列是在实际编程极为有用数据结构,它是一个首尾相连FIFO数据结构,采用数组线性空间,数据组织简单。能很快知道队列是否满为空。能以很快速度来存取数据。...因为有简单高效原因,甚至在硬件都实现环形队列环形队列广泛用于网络数据收发,和不同程序间数据交换(比如内核与应用程序大量交换数据,从硬件接收大量数据)均使用环形队列。...环形缓冲区数据结构 Map过程中环形缓冲区是指数据被map处理之后会先放入内存,内存中这片区域就是环形缓冲区。...初始化 环形缓冲区结构在MapOutputBuffer.init中创建。

2K10

柔性数组和环形队列之间故事

之前文章,讲解了柔性数组,有很多人留言,提到一些问题。刚好,之前发关于环形队列文章有些问题,这次刚好拿出来一起说一下,并用柔性数组实现一个环形队列。...柔性数组上一篇文章 环形队列C语言实现文章 1、环形队列文章之前代码有bug /*插入数据*/ int ring_buff_insert(struct ring_buff * p_ring_buff...出来地址不是一个位置,至少他们不是连续,而且使用malloc出来内存后,使用完之后,需要使用free释放内存。...4、使用柔性数组实现环形队列 /* 实现最简单ringbuff 有更多提升空间,可以留言说明 */ #include "stdio.h" #include "stdlib.h" #include "...*/ ring pt_ring_buff = fifo_init(); printf("write:\n"); /*向环形缓冲区中写入数据*/ for(i = 0;i<

53240

支持任意数据类型环形队列

Part1一、介绍 一个C语言编写支持任意类型环形队列。...初始化队列 QUEUE_INIT(__QUEUE, __BUFFER, __BUFFER_SIZE ) 参数说明: 参数名 描述 __QUEUE 队列地址 __BUFFER 队列缓存首地址 __...BUFFER_SIZE 队列长度 初始化队列之前首先需要通过byte_queue_t 结构体定义一个队列对象,和缓冲区buf。...使用typeof来获取接收地址类型,然后通过sizeof获取类似的大小,从而确定需要读出数据长度。...宏重载 如果看过前边文章C语言变参函数和可变参数宏,就可以发现这里其实使用就是宏重载,宏重载原理已经在前边文章讲解过了,宏DEQUEUE直接使用了PLOOC已经实现__PLOOC_EVAL

68220

input子系统事件处理层(evdev)环形缓冲区【转】

在事件处理层(evdev.c)中结构体evdev_client定义了一个环形缓冲区(circular buffer),其原理是用数组方式实现了一个先进先出循环队列(circular queue),用以缓存内核驱动上报给用户层...环形缓冲区工作机制 循环队列入队算法: head++; head &= bufsize - 1; 循环队列出队算法: tail++; tail &= bufsize - 1; 循环队列已满条件:...head == tail 循环队列为空条件: packet_head == tail “求余”和“求与” 为解决头尾指针上溢和下溢现象,使队列元素空间可重复使用,一般循环队列出入队算法都采用...”操作,使内核运作更高效,input子系统环形缓冲区采用了“求与”算法,这要求bufsize必须为2幂,在后文中可以看到bufsize值实际上是为64或者8n倍,符合“求与”运算要求。...环形缓冲区生产者 内核驱动作为生产者,通过input_event()上报input_event事件时,最终调用___pass_event()函数将事件写入环形缓冲区: static void __pass_event

1.3K60

来看看加入环形队列串口发送数据

一,为什么要使用环形队列来发送数据?是为了解决什么问题呢! ? 这节说了怎么用中断发送数据,但是大家是否想过,这种中断发送有个bug,看一下下面的 ? ?...现在想法是需要有个缓存,我不停往缓存里面写数据,串口发送中断不停从缓存里面取出来,然后发出去! 直接利用环形队列是很好选择....三,然后把数组交给 环形队列变量去管理 ? 四,串口发送中断里面就是这样 ? 五,修改一下环形队列一个函数,填充完数据就打开中断 ? 六,现在测试 ? ? 现在数据不会出现丢失!...注意:即使是使用环形队列也不要在主循环里面 ? 环形队列缓存也有限! 只要波特率定好了,中断发送每一位数据时间是一定,发送数据就一定需要时间! 现在是直接造成死机, ?...其实造成死机原因是因为环形队列里面使用printf, ? 而printf 并不是中断发送,造成了冲突 ? 改一下 ? ?

1.8K20

循环队列实现(附完整代码

,删除成功返回真 5.检查队列是否为空 6.检查队列是否已满 首先我们可以将之前写用链表实现队列代码拷贝到该题中,以便于循环队列实现,然后开始构思。...解题构思 所以我们可以把循环队列先画图,他是一个环形队列,并且首位相连尾接 那么,循环队列什么时候是满,什么时候是空呢?...在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新值。 什么意思呢?...他们之间关系就需要我们来求证一下了,因为在循环队列这个环形队列中,无论插入还是删除,都是从队头(或者是队尾)进行操作!...)和存储个数k有着以下关系: 就是说无论front位置怎么移动,他最终都是在1-k范围之内 front = front % ( k + 1 ) 现在,我们就可以开始用代码实现循环队列

14110

单片机模块化程序: 数据缓存封包-环形队列实现

咱们平时发送数据时候最希望是可以有个缓存,每次把要发送数据存到缓存里面   需要发送时候咱就去缓存里面去取   而且咱希望咱缓存可以存储多条数据   发送时候按照先进先出原则把数据提取出来发出去...使用说明   一,注意,这一节是对上一节封装,请先看上一节     不过LoopList做了下改动     然后增加了 BufferManage 文件 ?     ...三,定义两个数组     一个用于交给环形队列用于缓存数据     另一个交给环形队列用于记录每次缓存数据个数     注意:  u32 Managebuff[10];     数组个数是10个,说明最多可以管理...扩展:使用串口中断发送缓存数据   一,首先先说明处理思路   如果缓存区没有数据,则每隔1ms查询一次   如果查询到了有数据,则提取出来,然后交由中断处理   然后查询间隔变为10ms (该间隔可调节...)   10ms便是发送每一条数据之间时间间隔   因为是一条数据一条数据发送,咱需要让每条数据之间有间隔   这样才让另一头接收端认为是两条数据,方便处理   二,

92510
领券