linux+内核+环形缓冲,环形缓冲区-模仿linux kfifo【转】

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 device driver —— 环形缓冲区的实现

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

linux网络编程--Circular Buffer&lpar;Ring Buffer&rpar; 环形缓冲区的设计与实现【转】

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

linux下C语言实现多线程通信—环形缓冲区&comma;可用于生产者&lpar;producer&rpar;&sol;消费者&lpar;consumer&rpar;【转】

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

35&period;Linux-分析并制作环形缓冲区

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

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

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

input子系统事件处理层&lpar;evdev&rpar;的环形缓冲区【转】

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

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

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

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

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

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

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

随机推荐

HTML ------ 关于表单 Form

Form(表单)主要用于采集和提交用户输入的信息,是页面与WEB服务器交互过程中 最重要的信息来源. 掌握表单(Form)有以下几个要点: 重要form属性 form常用控件 form提交方式 § 重 ...

js获取当前日期的前一天、一月、一年的日期 明天、后天&lpar;转&rpar;

function getYestoday(date){ var yesterday_milliseconds=date.getTime()-1000*60*60*24; var yesterday = ...

关于页面查询多数据查询问题(foreach)

最近纠结的一个问题,就是页面综合查询总报错,之前用过传参用list传就没问题,但现在用map总是报错,缓释直接贴图吧,希望对遇到问题的朋友有帮助页面传来参数,之前是 这样写的,直接将拿来的数据封装成一 ...

Python学习笔记10

1.函数式编程   理论就来自lambda演算,虽然没有学过lisp,一直被其大名震撼. 特性: 函数是以一等公民 可以作为参数 可以作为返回值 具有闭包特性   1.1参数传递方式 一般参数传递 ...

duilib进阶教程 -- 改进List控件 &lpar;16&rpar;

一.控件隐藏后,允许用代码操作所有行为. 在做播放器的时候,最常用的功能莫过于顺序播放.随机播放了,而当我们切换歌曲的时候,显然应该选中该歌曲,List的选中函数是SelectItem,但是调用此函数 ...

uboot总结:uboot配置和启动过程3(config&period;mk分析)

说明:文件位置:在uboot的目录下,文件名为:config.mk.是一个makefile文件,以后会被主Makefile调用. 它的主要作用的是: (1)具体的设置交叉编译工具链接(主Makefil ...

加载loading的ajax写法

ajaxStart()与ajaxStop():当Ajax请求开始时,会触发ajaxStart()方法的回调函数.当Ajax请求结束时,会触发ajaxStop()方法的回调函数.这些方法都是全局的方法, ...

input 显示&sol;隐藏密码

js代码: // 显示/隐藏密码 $('.open').on('click',function(){ if($("#psw").prop('type')=='password'){ ...

&period;net 项目与网站区别

背景 .net 的又一个杰作,我作为资深开发人员,好久没搞明白两者关系,后来慢慢总算琢磨明白了.在2003和2005的时候,都是用的网站方式,后来见到某同事用的项目方式,当时还很不理解,真是个傻瓜程序 ...

Scrapy学习篇(八)之settings

Scrapy设定(settings)提供了定制Scrapy组件的方法.你可以控制包括核心(core),插件(extension),pipeline及spider组件.设定为代码提供了提取以key-va ...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Project3】技术总结

1.quartz 百分百自己会用 2.转载于:https://www.cnblogs.com/mount/archive/2011/11/09/2243265.html

4-7月份规划

1.准备管理系统中计算机应该实践2.学习高等数学二及英语二3.学习VB.Net(估计公司会用VB.Net)&#xff0c;不过可以尽量争取C#4.和红哲讨论一下测试方法.5.对财务系统的测试,加强财务的能力6.购一本练习会计分录的习题集. 7.今后的发展方向&#xff0c;融投资管理 转载于:https:…

没去公司上班的这两天

这周得到通知是居家办公&#xff0c;但因为项目的事&#xff0c;前两天去了公司&#xff0c;今天情况特殊&#xff0c;我需要去合作的公司调试&#xff0c;就没去公司。早上还是9点起来&#xff0c;因为合作的公司离我家很近&#xff0c;可以多休息一会。但早早就睁开了眼&…

Activity的缓存方法

转载地址:http://blog.csdn.net/zhichu_2025/article/details/52047605 有a、b两个activity&#xff0c;当a进入b之后的一段时间&#xff0c;可能系统就把a回收了&#xff0c;这时候按back键&#xff0c;执行的不是a的onStart()方法&#xff0c;而是onCreate()方法&#xff0c…

c# datatable

DataTable dt new DataTable("cart"); //创建表dt.Columns.Add( new DataColumn("number", Type.GetType("System.String"))); //创建列 dt.Columns.Add( new DataColumn("qq", Type.GetType("System.String")));DataR…

linux pdm 查看工具,linux系统监控工具

通过系统监控可以了解系统的运行状态、及时发现异常、分析原因、提早解决&#xff0c;避免系统故障&#xff0c;确保用户对系统的感知度和满意度。IPTV系统一般是通过告警管理、日志管理、信令跟踪、探针、诊断测试来实现对系统的监控。小编为大家分享了linux系统监控工具&…

windows服务器下com6僵尸***删除

服务器被挂马&#xff0c;有一些可以被清除&#xff0c;有一个***被命名为com6.asp&#xff0c;无法被简单删除&#xff0c;网上baidu了一下&#xff0c;只能通过命令行的方式才能删掉&#xff0c;试了半天还是不可以&#xff0c;最后发现***文件还被设置成为了 RSH 属性&#…

USB抓包

安装的时候需要选上安装完之后&#xff0c;会提示让你重启电脑&#xff0c;如果不重启电脑的话也看不到USB的设备。之后可以通过usb.src来过滤自己想dump的设备信息当然&#xff0c;有一个技巧是&#xff0c;你可以先停止读写你的USB&#xff0c;然后再操作你的USB设备&#xf…

波波的个人简历

本人概况 姓名&#xff1a;bobo民族&#xff1a;汉 学历 (学位 )&#xff1a;大专 联系电话&#xff1a; 54103165联系地址&#xff1a;上海 云景路 185弄 10楼 101室 Email Address &#xff1a; caravarnhotmail.com QQ:179326710性别&#xff1a;男 手机&#xff1a; 139179…

Linux记起始和结束时间,Linux历史命令的记住执行时间

本文主要说明平台是Red Hat / CentOS系列系统。当安装完一台Linux后&#xff0c;我们可以把下列事情当作第一件要做的事&#xff1a;让history记录执行命令的时间&#xff1a;上代码export HISTTIMEFORMAT"[%Y-%m-%d %H:%M:%S] "export HISTFILESIEZE1000000export H…

Appium的环境搭建和配置

Appium的环境搭建和配置 一、安装Nodejs 下载nodejs安装包&#xff08;https://nodejs.org/en/download/&#xff09;安装 下载后&#xff0c;双击安装文件&#xff0c;按提示来安装。 测试安装是否成功&#xff1a;运行cmd&#xff0c;输入node –v 二、安装android的SDK 安装…

[转载]C#异步委托的用法 .

每个委托都有三个方法&#xff1a;Invoke、BeginInvoke、EndInvoke。第一个方法是委托指定函数的同步调用&#xff0c;另外两个是异步调用。BeginInvoke方法&#xff0c;调用后立即返回&#xff0c;不等待调用结果。EndInvoke方法&#xff0c;用于检索调用结果。调用BeginInvok…

sqlite3的基本操作

转自&#xff1a;http://blog.chinaunix.net/uid-26833883-id-3239313.html一、数据库基本概念 A.数据(Data)能够输入计算机并能被计算机程序识别和处理的信息集合。B.数据库(Database)数据库是在数据库管理系统管理和控制之下&#xff0c;存放在存储介质上的数据集合。注意&am…

收藏这些芯片原厂的代码仓库

本次给大家分享一些芯片原厂的代码仓库&#xff0c;这些资源已收录到咱们嵌入式大杂烩的资源仓库里了&#xff1a;https://gitee.com/zhengnianli/EmbedSummary我们用到一个新的芯片时&#xff0c;一般在它们的官网都可以找到一些入门、上手的资料。除此之外&#xff0c;有些原…

javascript计算小数保留两位小数,多位小数的方法

<SCRIPT LANGUAGE"JavaScript"><!--functionformatFloat(src, pos){ return Math.round(src*Math.pow(10, pos))/Math.pow(10, pos);}alert(formatFloat("1212.2323", 2));//--></SCRIPT>转载于:https://www.cnblogs.com/catxp/archi…

Android dumpsys命令详细使用

Android dumpsys命令详细使用 一、dumpsys命令介绍 1.命令说明 Dumpsys用户系统诊断&#xff0c;它运行在设备上&#xff0c;并提供系统服务状态信息 命令格式&#xff1a; adb shell dumpsys [system serbices] 2.系统服务查询 如果直接运行adb shell dumpsys&#xff0c;将会…

qemu+linux+x86+64,qemu以64位跟32位的方式跑busybox

qemu以64位和32位的方式跑busybox两种方式x86_64 和32位的i386方式-----------x86_64-----------------------------------------参考http://mgalgs.github.io/2015/05/16/how-to-build-a-custom-linux-kernel-for-qemu-2015-edition.html下载busybox和linux内核TOP/var/www/my…

基于 esp32 + lvgl8.0 的小电视

一个有趣的作品&#xff0c;转给需要的小伙伴。详情可阅读&#xff1a;https://gitee.com/wangpeng25/the-little-bili-tv输入图片说明支持功能微信配网&#xff08;完成&#xff09;时间显示&#xff08;完成&#xff09;三日天气显示&#xff08;完成&#xff09;温湿度显示&…

Android中常见的MVC/MVP/MVVM模式

Android中常见的MVC/MVP/MVVM模式 经典MVC 在1979年&#xff0c;经典MVC模式被提出。 在当时&#xff0c;人们一直试图将纯粹描述思维中的对象与跟计算机环境打交道的代码隔离开来&#xff0c;而Trygve Reenskaug在跟一些人的讨论中&#xff0c;逐渐剥离出一系列的概念&#xf…

同步滚动两个DataGrid

拿到这个首先想到的就是重写Scroll方法&#xff0c;可是想想工作量有些大&#xff0c;所以想在Form级别上做做手脚&#xff0c;看看DataGrid的成员列表可以看到这样两个保护性的方法&#xff1a;GridHScrolled Listens for the horizontal scrollbars scroll even…