转自:https://blog.csdn.net/vertor11/article/details/53741681

struct kfifo{
uint8_t *buffer;
uint32_t in; // 输入指针
uint32_t out; // 输出指针
uint32_t size; // 缓冲区大小,必须为2的次幂
} /*判断n是否为2的幂*/
static bool is_power_of_2(unsigned int n)
{
return (n != && ((n & (n - )) == ));
} /*将数字a向上取整为2的次幂*/
static uint32_t roundup_power_of_2(uint32_t a)
{
if (a == )
return ; uint32_t position = ;
for (int i = a; i != ; i >>= )
position++; return (uint32_t)( << position);
} /*全局变量*/
struct kfifo fifo; /*环形缓冲区初始化*/
void fifo_init(uint32_t size)
{
if (!is_power_of_2(size))
size = roundup_power_of_2(_size); fifo->buffer = (unsigned char *)(malloc(size * sizeof(unsigned char)));
fifo->in = ;
fifo->out = ;
fifo->size = size;
} /*返回实际写入缓冲区中的数据*/
uint32_t put(const uint8_t *data, uint32_t len)
{
unsigned int l; /*当前缓冲区空闲空间*/
len = min(len,fifo->size - fifo->in + fifo->out); /*当前in位置到buffer末尾的长度*/
l = min(len, fifo->size - (fifo->in & (fifo->size - ))); /*首先复制数据到[in,buffer的末尾]*/
memcpy(fifo->buffer + (fifo->in & (fifo->size - )), data, l); /*复制剩余的数据(如果有)到[buffer的起始位置,...]*/
memcpy(fifo->buffer, data + l, len - l); fifo->in += len; // 直接加,不作模运算。当溢出时,从buffer的开始位置重新开始 return len;
} /*返回实际读取的数据长度*/
uint32_t get(uint8_t *data, uint32_t len)
{
unsigned int l; /*缓冲区中的数据长度: 注意都是无符号数*/
len = min(len, fifo->in - fifo->out); // 首先从[out,buffer end]读取数据
l = min(len, fifo->size - (fifo->out & (fifo->size - )));
memcpy(data, fifo->buffer + (fifo->out & (fifo->size - )), l); // 从[buffer start,...]读取数据
memcpy(data + l, fifo->buffer, len - l); fifo->out += len; // 直接加,不错模运算。溢出后,从buffer的起始位置重新开始 return len;
} 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/vertor11/article/details/53741681

环形缓冲区-模仿linux kfifo【转】的更多相关文章

  1. linux device driver —— 环形缓冲区的实现

    还是没有接触到怎么控制硬件,但是在书里看到了一个挺巧妙的环形缓冲区实现. 此环形缓冲区实际为一个大小为bufsize的一维数组,有一个rp的读指针,一个wp的写指针. 在数据满时写进程会等待读进程读取 ...

  2. linux网络编程--Circular Buffer(Ring Buffer) 环形缓冲区的设计与实现【转】

    转自:https://blog.csdn.net/yusiguyuan/article/details/18368095 1. 应用场景 网络编程中有这样一种场景:需要应用程序代码一边从TCP/IP协 ...

  3. linux下C语言实现多线程通信—环形缓冲区,可用于生产者(producer)/消费者(consumer)【转】

    转自:http://blog.chinaunix.net/uid-28458801-id-4262445.html 操作系统:ubuntu10.04 前言:     在嵌入式开发中,只要是带操作系统的 ...

  4. 35.Linux-分析并制作环形缓冲区

    在上章34.Linux-printk分析.使用printk调试驱动里讲述了: printk()会将打印信息存在内核的环形缓冲区log_buf[]里, 可以通过dmesg命令来查看log_buf[] 1 ...

  5. 物联网安全himqtt防火墙数据结构之ringbuffer环形缓冲区

    物联网安全himqtt防火墙数据结构之ringbuffer环形缓冲区 随着5G的普及,物联网安全显得特别重要,himqtt是首款完整源码的高性能MQTT物联网防火墙 - MQTT Applicatio ...

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

    在事件处理层(evdev.c)中结构体evdev_client定义了一个环形缓冲区(circular buffer),其原理是用数组的方式实现了一个先进先出的循环队列(circular queue), ...

  7. 模仿linux内核定时器代码,用python语言实现定时器

    大学无聊的时候看过linux内核的定时器,如今已经想不起来了,也不知道当时有没有看懂,如今想要模仿linux内核的定时器.用python写一个定时器,已经想不起来它的设计原理了.找了一篇blog,li ...

  8. STM32进阶之串口环形缓冲区实现(转载)

    转载自微信公众号“玩转单片机”,感谢原作者“杰杰”. 队列的概念 在此之前,我们来回顾一下队列的基本概念:队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO) ...

  9. 嵌入式框架Zorb Framework搭建二:环形缓冲区的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

随机推荐

  1. Final版本发布评论

    1.飞天小女警组做的礼物挑选小工具,相比较beta版本并没有太大的改动,新增添了“猜你喜欢”模块,在最后给出的礼物推荐下面会给出三个猜你喜欢的礼物.这样解决了推荐礼物的单一,也让礼物推荐变得更有趣了. ...

  2. PAT 1044 火星数字

    https://pintia.cn/problem-sets/994805260223102976/problems/994805279328157696 火星人是以13进制计数的: 地球人的0被火星 ...

  3. 对象函数的readFileSyc类

    对于所有的Syc后缀都是表示同步,默认不加是异步操作.

  4. python--inspect模块

    inspect模块主要提供了四种用处: 1.对是否是模块.框架.函数进行类型检查 2.获取源码 3.获取类或者函数的参数信息 4.解析堆栈 一.type and members 1. inspect. ...

  5. 【转】 CRC循环冗余校验码

    1.CRC CRC循环冗余校验码是数据通信中的一种查错校验码. 循环冗余检查对数据进行多项式计算,将计算结果附加在帧后面,接收数据的设备执行模2运算,保证数据传输的正确性和完整性. 2.模2除法 ①不 ...

  6. 解析word公式的解决方案(office插入和wps插入不同的解决方案)

    这几天在公司的项目有个需求就是数学公式的导入,而对于word来说,插入的公式xml格式,需要转换为mathML,借用插件MathJax来进行展示,而对于wps插入的公式来说,获取到的是一个wmf图片, ...

  7. 【洛谷P1509】找GF

    题目大意:给定 N 个物品,每个物品有两个维度的费用,有两个维度的价值,求在有一定费用基础的前提下,满足其中一个维度的价值最大化的前提下,第二个维度的价值最小是多少. 题解:由于是两个维度的价值,因此 ...

  8. 检测传入字符串是否存在重复字符,返回boolean

    检测传入字符串是否存在重复字符,返回boolean,比如"abc"返回true:"aac"返回false 这里提供两种思路: 第一种: import java. ...

  9. Linux 服务器上快速配置阿里巴巴 OPSX NTP服务

    编辑文件 "/etc/ntp.conf",根据情况修改文件内容为: 互联网上的服务器: driftfile /var/lib/ntp/drift pidfile /var/run/ ...

  10. Python 发射导弹的正确方式

    ——此文以纪念南京大屠杀79周年 今天Toby教你如何用python的basemap包绘制轰炸东京的地图. 在数据可视化过程中,我们常常需要将数据根据其采集的地理位置在地图上显示出来.比如说我们会想要 ...