首页 文章 精选 留言 我的

精选列表

搜索[内核任意读写],共10000篇文章
优秀的个人博客,低调大师

移动硬盘读写速度变慢,先换线换口再查碎片,按 5 步逐层排除

拷贝一个 4GB 的电影,进度条走到一半,速度从 110MB/s 掉到 3MB/s,任务管理器里那块盘的「活动时间」显示 100%;有时资源管理器还会弹「设备有问题,已停止响应」,或者事件查看器里出现 disk 来源、事件 ID 51 的告警。同一块盘、同一根线,换到别的电脑也一样慢,方向基本就集中在供电、文件系统和碎片这几层。

优秀的个人博客,低调大师

组态平台对接档案馆恒温恒湿设备:Modbus协议读写与闭环控制实现

近期在调试一套工业环境监控系统时,遇到了关于Modbus连接保持的问题。现场部署了一批网口温湿度变送器,PoE取电、Modbus TCP上云,同时利旧接入存量RS485探头,并开启了SNMP和UDP Trap服务。档案馆恒温恒湿系统由冷水阀、加热段、加湿器、除湿转轮、风机变频器等多台设备组成,组态平台需要实时读取设备运行状态并下发控制指令,形成温湿度的闭环调节。这篇从Modbus寄存器规划、组态平台通信配置、PID闭环控制逻辑到防抖动与安全联锁,完整记录档案馆恒温恒湿设备的Modbus对接与自动控制实现。

优秀的个人博客,低调大师

在Android源码树中添加userspace I2C读写工具(i2c-util)

by LiAnLab.org / 宋宝华 通过/dev/i2c-n节点,用户可以在userspace直接访问板上的i2c外设寄存器,主要是透过I2C_RDWR这个IO控制命令将i2c_msg数组传递给kernel去执行。下面的代码可以完成这个功能: [cpp] view plain copy #include<stdio.h> #include<linux/types.h> #include<fcntl.h> #include<unistd.h> #include<stdlib.h> #include<sys/types.h> #include<sys/ioctl.h> #include<errno.h> #include<assert.h> #include<string.h> #include<linux/i2c.h> /*ThisisthestructureasusedintheI2C_RDWRioctlcall*/ structi2c_rdwr_ioctl_data{ structi2c_msg__user*msgs;/*pointerstoi2c_msgs*/ __u32nmsgs;/*numberofi2c_msgs*/ }; inti2c_read_reg(char*dev,unsignedchar*buf,unsignedslave_address,unsignedreg_address,intlen) { structi2c_rdwr_ioctl_datawork_queue; unsignedcharw_val=reg_address; intret; intfd=open(dev,O_RDWR); if(!fd){ printf("Erroronopeningthedevicefile\n"); return0; } work_queue.nmsgs=2; work_queue.msgs=(structi2c_msg*)malloc(work_queue.nmsgs*sizeof(struct i2c_msg)); if(!work_queue.msgs){ printf("Memoryallocerror\n"); close(fd); return0; } ioctl(fd,I2C_TIMEOUT,2); ioctl(fd,I2C_RETRIES,1); (work_queue.msgs[0]).len=1; (work_queue.msgs[0]).addr=slave_address; (work_queue.msgs[0]).buf=&w_val; (work_queue.msgs[1]).len=len; (work_queue.msgs[1]).flags=I2C_M_RD; (work_queue.msgs[1]).addr=slave_address; (work_queue.msgs[1]).buf=buf; ret=ioctl(fd,I2C_RDWR,(unsignedlong)&work_queue); if(ret<0){ printf("ErrorduringI2C_RDWRioctlwitherrorcode:%d\n",ret); close(fd); free(work_queue.msgs); return0; }else{ printf("readsalve:%02xreg:%02x\n",slave_address,reg_address); close(fd); free(work_queue.msgs); returnlen; } } inti2c_write_reg(char*dev,unsignedchar*buf,unsignedslave_address,unsignedreg_address,intlen) { structi2c_rdwr_ioctl_datawork_queue; unsignedcharw_val=reg_address; unsignedcharw_buf[len+1]; intret; w_buf[0]=reg_address; intfd=open(dev,O_RDWR); if(!fd){ printf("Erroronopeningthedevicefile\n"); return0; } work_queue.nmsgs=1; work_queue.msgs=(structi2c_msg*)malloc(work_queue.nmsgs*sizeof(struct i2c_msg)); if(!work_queue.msgs){ printf("Memoryallocerror\n"); close(fd); return0; } ioctl(fd,I2C_TIMEOUT,2); ioctl(fd,I2C_RETRIES,1); (work_queue.msgs[0]).len=1+len; (work_queue.msgs[0]).addr=slave_address; (work_queue.msgs[0]).buf=w_buf; memcpy(w_buf+1,buf,len); ret=ioctl(fd,I2C_RDWR,(unsignedlong)&work_queue); if(ret<0){ printf("ErrorduringI2C_RDWRioctlwitherrorcode:%d\n",ret); close(fd); free(work_queue.msgs); return0; }else{ printf("writesalve:%02xreg:%02x\n",slave_address,reg_address); close(fd); free(work_queue.msgs); returnlen; } } intmain(intargc,char**argv) { unsignedintfd; unsignedintslave_address,reg_address; unsignedr_w; unsignedw_val; unsignedcharrw_val; if(argc<5){ printf("Usage:\n%s/dev/i2c-xstart_addrreg_addrrw[0|1][write_val]\n",argv[0]); return0; } fd=open(argv[1],O_RDWR); if(!fd){ printf("Erroronopeningthedevicefile%s\n",argv[1]); return0; } sscanf(argv[2],"%x",&slave_address); sscanf(argv[3],"%x",®_address); sscanf(argv[4],"%d",&r_w); if(r_w==0){ i2c_read_reg(argv[1],&rw_val,slave_address,reg_address,1); printf("Read%s-%xreg%x,readvalue:%x\n",argv[1],slave_address,reg_address,rw_val); }else{ if(argc<6){ printf("Usage:\n%s/dev/i2c-xstart_addrreg_addrr|w[0|1][write_val]\n",argv[0]); return0; } sscanf(argv[5],"%d",&w_val); if((w_val&~0xff)!=0) printf("Erroronwrittenvalue%s\n",argv[5]); rw_val=(unsignedchar)w_val; i2c_write_reg(argv[1],&rw_val,slave_address,reg_address,1); } return0; } 在android/external/新建i2c-util目录,上述源代码存入android/external/i2c-util/i2c-util.c,编写对应的Android.mk: [plain] view plain copy LOCAL_PATH:=$(callmy-dir) include$(CLEAR_VARS) LOCAL_MODULE_TAGS:=optional LOCAL_MODULE:=i2c-util LOCAL_SRC_FILES+=\ i2c-util.c\ include$(BUILD_EXECUTABLE) 编译Android后,上述工具会位于/system/bin目录。在电路板上使用它: [plain] view plain copy /#i2c-rw/dev/i2c-20x380x10 readsalve:38reg:01value:12 /# /#i2c-rw/dev/i2c-20x380x20 readsalve:38reg:02value:81 本文转自 21cnbao 51CTO博客,原文链接:http://blog.51cto.com/21cnbao/976137 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

零代码接口测试 APIAuto 6,AI Agent 自动操作&读写 DB 🔥 Star 2K+

APIAuto-机器学习 HTTP 接口工具 敏捷开发最强大易用的 HTTP 接口工具,机器学习零代码测试、生成代码与静态检查、生成文档与光标悬浮注释。 提供集 文档、测试、Mock、调试、管理 于一体的一站式体验,还有一键 格式化、注释/取消注释 等高效快捷键。 在常用功能上远超 Postman, Swagger, YApi, Rap 等其它各种 开源、商业 的 API 文档/测试 工具。 腾讯内部用户包括 IEG 互动娱乐事业群、TEG 技术工程事业群、CSIG 云与智慧事业群 等, 外部用户包含 华为、工商银行某地分行、500强上市公司传音、跨境电商巨头 SHEIN、行业领头羊社保科技 等。 更新内容: 用例管理 新增支持给用例打自定义标签,与或非快速筛选 场景串联用例新增支持绑定测试帐号;帐号上新增光标悬浮详情;新增自定义退出登录 URL 等配置 参数串联配置 PRE_ARG, PRE_DATA 新增支持指定接口、修改后自动刷新列表 零代码测试 新增自动生成场景用例参数传递配置 新增支持配置响应 JSON 的自定义断言规则,类似请求参数注入的写法,减少写脚本需求 随机与顺序测试: 新增支持 - Header: ORDER_IN('a', 'bc') 设置请求头生成规则 参数注入 RANDOM_DB, ORDER_DB 支持传自定义请求体 body,以及表名扩展为 schema.table CI/CD: 解决 Node.js HTTP API 后台跑用例出报告的依赖、进度计算、脚本加载等问题 文档 AI: 接入 page-agent 自动操作网页; 参数注入: 新增支持数据库增删改查快捷配置 DB_SELECT, DB_INSERT, DB_UPDATE, DB_DELETE; 新增各种 HTTP 请求配置;兼容自定义表达式; 零代码测试: 新增 HTTP Method, Content-Type 的下拉选项; 完善 TEXT, XML, HTML 等传参类型并修复 Content-Type: multipart/form-data; 断言配置 RANDOM_DB, ORDER_DB 去重后对比数组、解决用错 JSON;完善报告; 文档: 导出用例为 Markdown 文档:完善响应结果和注释; 其它: 解决 XSS in Helper.alert,感谢@tomaioo的贡献#83; 推荐新增 APIAuto:机器学习驱动的零代码HTTP接口智能测试平台深度解析 感谢 没伞请奔跑i 的热心分享,大家点赞、收藏、转发支持下热心的博主吧 ^_^ 具体见Release 发布版本 APIAuto 简介 敏捷开发最强大易用的 HTTP 接口工具,机器学习零代码测试、生成代码与静态检查、生成文档与光标悬浮注释。 现场录播回放视频:QECon大会-零代码开发和测试(APIJSON和APIAuto) https://www.bilibili.com/video/BV1yv411p7Y4 创作不易、坚持更难,打开链接右上角点亮 ⭐Star(GitHub 2.2K, Gitee 300+) 收藏/支持下本项目吧,谢谢 ^_^ https://github.com/TommyLemon/APIAuto https://gitee.com/TommyLemon/APIAuto

优秀的个人博客,低调大师

秋色园QBlog技术原理解析:性能优化篇:读写分离与文本数据库(十八)

上节回顾: 上节 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七), 秋色园QBlog对于频繁产生更新操作的访问计数器(用户表及文章表),进行了另一种优化方案处理,使得原来并发进行的操作,变成了定时的单个队列式顺序更新操作,有效的解决了计数器引发的并发的问题。 本节概要: 虽然减压方案频繁出招,可是依旧没能阻挡住access黄金4K的绝杀。 在压力之下,梦幻潜能再次被激发。 于是,新的绝招再次出世:一个失传已久的招数:文本数据库。 本节内容: 1:分析寻找优化点: 通过CYQ.Data的 AppDebug(即将发布的V4.5.5版本包含此类),打印出页面的SQL语句: PS:关于打印页面SQL语句的优化,可见之前的文章:秋色园QBlog技术原理解析:性能优化篇:全局的SQL语句优化(十三) 首先观察页面这些语句,我们看到这里涉及到几条语句: 1:第一次的表架构获取语句,即where 1=2的语句 2:博客用户的信息读取语句 3:友情链接的语句 PS:如果没有缓存,当然还有很多和文章列表相关的语句,文章的下节重点再讲。 然后我对着这些语句寻思了很久时间,最后得出结论,得把这些语句消灭掉。 2:步步分析并对可优化点进行优化: 2.1:消灭表架构读取SQL语句 这个其实关系不大,因为一个表仅读一次,而且之后全局默认缓存30分钟,所以出现频繁非常低,不过了为追求首页0语句,我还是比较严肃的把它给消灭了,怎么消灭的? 消灭其实还是很好解决的,只要首次读取时,把表架构外置到文本中即可,于是架构的读取顺序就变成了:缓存->文本->数据库。 下面给一张表架构外置文本和架构外置架构示例图: 2.2:消灭用户信息的读取SQL语句 其实用户表是个大问题,经常也会出现的4K,因为有太多的语句,可涉及到用户表的读取。 为此,虽然说用户信息每次读取完后也会进行缓存,但是,用户数量比较多,搜索引擎来来回回,啥用户也会扯到,所以总体来来回回就变的读取相当相当的频繁,为此,我想了一想,把它给消灭了,怎么消灭的? 同理,第一次读取时,我把用户信息外置到文本了,然后用户后台更新数据的时候,也刷新文本。 然后读取自然的顺序就变成了:缓存->文本->数据库。 于是当然的,秋色园现在4000多的用户,就产生了4000多个文本了,看似规模很庞大! 难免有人要发出感叹,要是你100万用户,不就产生100万个文本了?我想说,求之不得啊! 下面给一张用户信息文本及用户信息以json格式存储的示例图: 2.3:消灭友情链接的读取SQL语句 用户的友情链接,比起用户信息来说,不算重点,不过你会发现,用户的每个页面可都是也有友情链接的。 所以,我打算把它也给灭了,怎么消灭的? 有了上面两步的经验,这步实施起来太easy了,同理,首次把用户的友情链接转存到文件中,然后读取就是文本读取了,后台修改的时候,也是读的文本的,不过写的时候,先写数据库,再写文本。 于是,4000多用户,也会产生4000多的友情链接的文本。 下面给一张友情链接的文本及友情链接列表以json格式存储的示例图: 2.4:文章列表的SQL语句呢? 这里必须严肃的说一下,大量的文章列表的SQL语句,并没有使用文本的方式进行消灭。 为啥没有呢? 原因也很简单,因为文章列表涉及到查询及排序还有分组等复杂语句,文本不太好操作这些事情。 那文章列表是如何进行的优化,这是个大工程,当时我在外散步连续思考了3天,也是秋色园QBlog至今为止的最后一次优化,这么大工程,具体下节详细介绍了。 总结: 秋色园QBlog通过借助于文本,将大量的读取数据库转移到文本读取中,有效的降低了数据库的压力,同时网站运行也顺畅了很多。 经过一场应用之后,对文本有了第一印象: 优点:速度快,小数据量(10万或10M上下)简单的存储与读取非常方便。 缺点:删除,更新,查询,分页,排序及并发控制等操作复杂,而且数据量也不适合太多。 另外据网上搜索“文本数据库”的结果看来: 文本数据库以前在php界很流行,多数论坛都采用文本数据库,而且抗并发能力相当强,当然这背后相信有一定的技术手段在处理,然后后来的后来,php基本都统一mysql了。 至于.net界,文本数据库却从没流行过,这是为什么呢? 历史文章回顾: 1:秋色园QBlog技术原理解析:开篇:整体认识(一)--介绍整体文件夹和文件的作用 2:秋色园QBlog技术原理解析:认识整站处理流程(二)--介绍秋色园业务处理流程 3:秋色园QBlog技术原理解析:UrlRewrite之无后缀URL原理(三)--介绍如何实现无后缀URL 4:秋色园QBlog技术原理解析:UrlRewrite之URL重定向体系(四)--介绍URL如何定位到处理程序 5:秋色园QBlog技术原理解析:Module之页面基类设计(五)--介绍创建基类和自定义生命周期 6:秋色园QBlog技术原理解析:Module之页面基类-生命周期流程(六)--介绍基类生命周期内部业务 7:秋色园QBlog技术原理解析:Module之基类生命周期-页面加载(七)--介绍界面html加载原理 8:秋色园QBlog技术原理解析:Web之页面处理-内容填充(八)--介绍html的内容是如何填充 9:秋色园QBlog技术原理解析:独创的多语言翻译机制(九)--介绍html多语言翻译原理 10:秋色园QBlog技术原理解析:页面内容填充及多语言翻译流程演示示例(十)--总结演示示例代码 11:秋色园QBlog技术原理解析:页面Post提交机制(十一)--介绍如果Post提交数据 12:秋色园QBlog技术原理解析:性能优化篇:字节与缓存与并发(十二)--介绍性能优化:字节,并发及缓存 13:秋色园QBlog技术原理解析:性能优化篇:全局的SQL语句优化(十三)--介绍全局掌握SQL,进行针对性优化 14 :秋色园QBlog技术原理解析:性能优化篇:缓存总有失效时,构造持续的缓存方案(十四)--介绍二次缓存方案 15:秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五)--介绍内容分库减压 16:秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六)--介绍access并发上限 17:秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)--介绍用户和文章访问的计数优化方案 附章: 1:秋色园QBlog技术原理解析:博客一键安装工具技术实现[附源码下载]--开源秋色园安装工具原理 2:如何安装部署秋色园CYQBlog站点 3:Windows7下如何安装部署秋色园CYQBlog站点 PS:秋色园QBlog下载地址:http://www.cyqdata.com/download/article-detail-427 版权声明:本文原创发表于博客园,作者为路过秋天,原文链接: http://www.cnblogs.com/cyq1162/archive/2011/08/07/2129785.html

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册