首页 > 其他分享 >环形缓冲区FIFO

环形缓冲区FIFO

时间:2023-11-30 09:59:36浏览次数:48  
标签:lwrb 环形 FIFO KEY printf 缓冲区 数据 buff

-------------------------------------------------------------------------------------------------------------------------------------

最近学习一个LwRB开源环形缓冲区FIFO设计,即先入先出缓冲区。LwRB 是一个开源、通用环形缓冲区库。
    1、只有单个任务写和单个任务读时,线程是安全的
    2、只有单个中断写和单个中断读时,中断是安全的
    3、支持内存间的 DMA 操作,实现缓冲区和应用程序内存之间零拷贝
    4、对于读数据,提供 peek(窥读,读数据但不改变读指针) 、skip (跳读,向前移动读指针,将指定长度的数据标记为已读)函数,
    5、对于写数据,提供 advance (跳写,向前移动写指针,比如 DMA 硬件向环形缓冲区写入了 10 字节,应用程序需要调用此函数更新写指针)函数。
    6、支持事件通知

具体的设计思路和原理图,可以观看这篇转载的博客:https://blog.csdn.net/zhzht19861011/article/details/126524101?spm=1001.2014.3001.5506

 

这里通过一些程序,简单介绍这个环形缓冲区的具体使用过程: 

            // 写入数据到循环缓冲区
            size_t writeBytes = lwrb_write(&KEY_buff, "0123456789", 10);  //向循环缓冲区 KEY_buff 写入字符串 “0123456789” 数据
            printf("写入数据大小:%d\r\n", (int)writeBytes);

            // 获取缓冲区中已存储的数据大小
            size_t full_data = lwrb_get_full(&KEY_buff);
            printf("已存储数据大小: %d\r\n", (int)full_data); //打印已经存储缓冲区中的大小

            //lwrb_read 函数读取数据后会移动读指针,也就是读取数据后,环形缓冲区会将这些数据移除掉
            uint8_t readData[BUFFER_SIZE];
            size_t readBytes = lwrb_read(&KEY_buff, readData, 5);  //从缓冲区中读取的字节数为5
            printf("读取数据大小:%d\r\n", (int)readBytes);
            printf("read_data: ");
            for (int i = 0; i < readBytes; i++)
            {
                printf("%c", readData[i]); //打印读出的数据
            }
            printf("\n");

            // lwrb_peek() 函数用于查看循环缓冲区 KEY_buff 中的数据,不改变缓冲区中的数据位置
            uint8_t peekData[BUFFER_SIZE];
            size_t peekBytes = lwrb_peek(&KEY_buff, 2, peekData, BUFFER_SIZE); //在BUFFER_SIZE缓冲区中从索引2开始查看
            printf("查看数据大小:%d\r\n", (int)peekBytes);
            printf("Peek_data: ");
            for (int i = 0; i < peekBytes; i++)
            {
                printf("%c", peekData[i]);
            }
            printf("\n");

            //lwrb_skip() 函数用于跳过循环缓冲区 KEY_buff 中的数据
            size_t skipBytes = lwrb_skip(&KEY_buff, 4); // 跳过 4 个字节
            printf("跳过数据data:%d\r\n", (int)skipBytes);

            // 获取缓冲区中已存储的数据大小
            full_data = lwrb_get_full(&KEY_buff);
            printf("再一次已存储数据大小: %d\r\n", (int)full_data);

            // 再次读取数据
            size_t readBytes2 = lwrb_read(&KEY_buff, readData, BUFFER_SIZE);
            printf("再一次读取数据大小:%d\r\n", (int)readBytes2);
            printf("data2: ");
            for (int i = 0; i < readBytes2; i++)
            {
                printf("%c", readData[i]);  //打印读出缓冲区中跳过4个字节后的数据
            }
            printf("\n");

 

通过串口打印出数据 

在程序中,
1、通过lwrb_write函数向环形缓冲区写数据,数据将“0123456789”指向的数组拷贝到环形缓冲区,
2、通过lwrb_get_full函数获取当前缓冲区中已存储的数据大小
3、通过lwrb_read函数将数据从环形缓冲区拷贝到指向的数组readData里面,读取数据后会移动读指针,也就是读取数据后,环形缓冲区会将这些数据移除掉。将读取的数据和数据个数打印出来,即01234。
4、通过lwrb_peek() 函数用于查看循环缓冲区 KEY_buff 中的数据,不改变缓冲区中的数据位置。程序中在缓冲区中从索引2开始查看,也就是56789这五个数据第三个数据开始查看。此时,打印出来的数据时789。
lwrb_peek 函数不移动读指针,也就是读取数据后,环形缓冲区不会将这些数据移除掉,就只是到环形缓冲区中看看这些数据都是什么样子,并不把数据拿出来,也就称为窥读。
相比 lwrb_read 函数,lwrb_peek 函数多了一个参数。这个参数是允许用户先跳过指定的字节数,再开始读取。
5、通过lwrb_skip() 函数用于跳过循环缓冲区 KEY_buff 中的数据,数据并不会被保存到用户层,而是直接丢弃掉,就是环形缓冲区会删除这些数据,就像跳过了这些数据,所以称为跳读。
在程序中,写了跳过4个数据,也就是将56789五个数据,跳过前面四个数据,也就是将5678这四个数据删掉。
6、通过lwrb_get_full函数和lwrb_read函数,读取此时的缓冲区中的数据,通过打印可以看出只有一个数据,就是最后一个9。

 

这篇有关的环形缓冲区学习都是来自于以下博客,可自行查看原文

【转载】:https://blog.csdn.net/zhzht19861011/article/details/126524101?spm=1001.2014.3001.5506

 

 

标签:lwrb,环形,FIFO,KEY,printf,缓冲区,数据,buff
From: https://www.cnblogs.com/ZYL-FS/p/17866571.html

相关文章

  • 模仿环形图
    问题:模仿已有环形图步骤:建构数据源(如果图片上已有数据,可以抄录至单元格中)插入环形图修改图表标题删除图例连续添加三个系列,其中系列2的系列值与系列1一样,其他为默认。修改系列顺序,从上至下是系列4、系列3、系列2、系列1修改系列1和系列4的填充色,用取色取提取修改系列2和系列3的填充......
  • 实现环形进度条效果【一】
    好基友扔过来一张效果图,简单分析下,一起看看如何实现它吧。一个半环形用于表示0-100%。半环形开头有一个圆点作为修饰。半环形两端需要呈现为圆角。通过div实现先画一个长方形。<divclass="graph"></div>.graph{width:200px;height:100px;border:20p......
  • 约瑟夫(环形链表)
    约瑟夫(环形链表)/***@author缪广亮*@version1.0*/classJoseph{publicstaticvoidmain(String[]args){CircleSingleLinkedListcircleSingleLinkedList=newCircleSingleLinkedList();circleSingleLinkedList.addBoy(5);circ......
  • 实现环形进度条效果
    好基友扔过来一张效果图,简单分析下,一起看看如何实现它吧。一个半环形用于表示0-100%。半环形开头有一个圆点作为修饰。半环形两端需要呈现为圆角。通过div实现先画一个长方形。<divclass="graph"></div>.graph{width:200px;height:100px;border:20pxsolidrgb......
  • 快速生成一组环形数据
      sklearn是一个开源的机器学习库,支持不同种类的机器学习算法,并且提供了许多质量良好的数据集。假如我们想要得到一组环形数据集,借助sklearn的包很轻易就可以实现,不过换个角度思考,我们自己动手是否也可以生成一组数据,使之在散点图上环状分布;借助C++的random头文件以及一点高中数......
  • 142. 环形链表 II
    2023-11-21142.环形链表II-力扣(LeetCode)思路:1hashmap:将其next一个个存入,直到找到next已经存在的,这里用set就行2快慢指针,一个一步步走,一个一次走2步,自己画一下图,其一定会在环中相遇,且一定是多走一圈,然后相遇时,将慢指针保留,继续走,重新定义一个指针从一开始走,他们相等时就......
  • 第十二章 块设备I/O和缓冲区管理
    第十二章块设备I/O和缓冲区管理块设备I/O缓冲区I/O缓冲的基本原理:文件系统使用一系列I/O缓冲区作为块设备的缓存内存。当进程试图读取(dev,blk)标识的磁盘块时。它首先在缓冲区缓存中搜索分配给磁盘块的缓冲区。如果该缓冲区存在并且包含有效数据、那么它只需从缓冲区中读取数据、而......
  • 第十一周Linux教材第十二章学习笔记——块设备I/O和缓冲区管理
    块设备I/O和缓冲区管理本章讨论了块设备1/O和缓冲区管理;解释了块设备1/O的原理和T/O缓冲的优点;论述了Unix的缓冲区管理算法,并指出了其不足之处;还利用信号量设计了新的缓冲区管理算法,以提高1/O缓冲区的缓存效率和性能;表明了简单的PV算法易于实现,缓存效果好,不存在死锁和饥饿问题;还......
  • 20211316郭佳昊 《信息安全系统设计与实现(上)》 第十周学习总结 块设备I/O和缓冲区处理
    一、任务要求[1]知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)我在学****知识点,请你以苏格拉底的方式对我进行提问,一次一个问题核心是要求GPT:请你以苏格拉底的方式对我进行提问然后GPT就会......
  • verilog 简易fifo
    fifo.v`timescale1ns/1psmodulefifo#(parameterfifo_depth=128)(inputclk,inputrst,inputread_en,inputwrite_en,inputwrite_data,outputregread_data,outputfull,outputempty);localparamptr_len=......