首页 文章 精选 留言 我的

精选列表

搜索[读写分离],共10000篇文章
优秀的个人博客,低调大师

在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 ,如需转载请自行联系原作者

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

如何用阿里云HiTSDB时序数据库实现百万级海量数据点秒级读写

2017云栖大会·上海峰会上,阿里云发布了面向物联网场景的HiTSDB时序数据库,可支持每秒1000万时序数据点写入;具备PB级别的数据存储能力,提供高效压缩算法,整体存储成本降低90%;提供时序数据插值计算,降精度计算,时间纬度聚合计算,空间纬度聚合计算的能力。 HiTSDB的能力脱胎于阿里巴巴多年的实践,面对集群规模拥有独特的分析计算能力,本文将从电商视角对HiTSDB进行深度剖析。 阿里巴巴拥有着全球最大的电商交易平台,2016双十一单日成交额突破了1207亿。而这个庞大的业务规模的背后是由上千个应用服务,几万台服务器,每天上亿的服务调用来支撑的。如此大规模的应用监控需要全局监控服务APM(ApplicationPerformance Monitoring)来完成,通过采集各个服务和机器的运行数据和业务指标进行数据跟踪监控,就可以全局的掌握业务和服务运行情况,帮助进行故障诊断和业务评估。 阿里的全局监控服务叫做Ali360,通过Ali360可以进行全局的业务和服务监控。Ali360技术挑战题在于集群规模。最初面临的规模就是几百个应用,几万台的机器规模,要对每一台机器进行QPS等相关服务指标监控,应用系统依据Metric规范产生数据,上千万的数据点写入,上百万的数据点查询,这个规模是相当惊人的。(天猫双11大屏也是APM的一部分)同时,Ali360的平均写入维持在200W/S,每个数据点平均大小为200字节,那么每秒写入量在0.4G,每天就要产生34T的数据,而APM这种常见的时序领域的应用,通常数据写入都是持续进行的,按照这样的写入速度,那么每年业务存储所需存储成本变得非常的巨大,迫切需要进行成本的优化。面对这个巨大的挑战,我们必须要寻找一条最合适的路。 最先排除掉的方案是通过关系型数据库的方案。百万级别的数据写入给关系数据库带来的写入压力巨大,由于关系数据库为了支持多维查询而创建的索引导致写入效率下降,同时索引存储空间也造成了整个方案的成本巨大,性能也不理想。 第二个排除的方案是NoSQL的存储方案。KV的问题在于数据的append操作通常是转化为get 和put的操作,比较适合大量小的热数据,并不适合这种监控数据的大数据写入,数据写入的效率也非常差。 从监控的业务形态和数据特点来分析,最终我们找到了阿里云HiTSDB 时序数据库来解决这个问题。由于业务监控数据最终的呈现形态都是基于时间纬度的监控数据,技术领域对这些呈现的数据统称为“TimeSeries Data 时序数据”,对于某一个指标的一系类持续数据点系列称为“TimeLine 时间线”。那么监控系统最终呈现的就是一系列的TimeLines。而时序数据库则是针对时序数据的管理进行特殊优化的数据库产品。系统按照Metric的规范的通过HiTSDB提供的接口进行任意的数据写入。写入的信息可以包括任意的Tag,如:机房,区域,IP,应用,服务,方法名等以及写入指标如:异常数,QPS,TPS等,通过HiTSDB接口将时序数据写入到HiTSDB存储,HiTSDB支持任意纬度的时序数据监控应用进行监控指标的查询,以时间线的方式对应用提供服务。阿里云HiTSDB 引入了倒排索引技术可支持每秒1000万时序数据点写入,可以充分满足Ali360的600W/S 数据点写入量的业务高峰。同时HiTSDB采用分布式的架构,可以进行横向的水平扩展,理论上是不存在任何的性能瓶颈,而在实际的业务应用中,资源利用率水平维持在60%以下。 同时由于每秒写入的数据点达到几百万且监控数据是24小时不断的持续写入,实际每天要产生T级别的数据,这些数据的存储成本变得非常高。HiTSDB采用Gorilla的压缩算法,可以把一个时间点压缩到1.37字节,实际应用中可以做到2字节以内,那么实际只需占用1%的存储空间,1T的原始数据写入,只需要10G左右的存储空间,整体节约了90%以上的存储成本,这个压缩效果对于业务来说节省的成本非常可观,也可以提升查询速度。 Ali360的业务里包括一项业务趋势数据的查询分析功能,通常查询的时间跨度比较丰富,比如半小时、1小时、1天,设置1个月的趋势数据。同时还要提供特定纬度的计算,如将每秒的服务调用量,按照分钟级别进行sum计算,每分钟的系统负载按照AVG进行平均计算,当查询的时间线数量增加,时间跨度拉长的时候,需要查询和计算的数据规模就迅速增长。 HiTSDB提供多种计算能力,包括时序数据插值计算、降精度计算、时间纬度聚合计算和空间纬度聚合计算等,百万数据点计算响应时间小于5秒,可以充分的满足业务查询计算需求。 除了提供接口级别的数据查询外,HiTSDB也可以和Grafana以及其他的可视化系统对接,快速实现数据的展现,对于非定制化的监控系统来说可以大大提高业务分析决策的效率。事实上,除了APM应用分析外,这种对于时序数据数据的管理和使用场景也广泛应用于IoT和实时分析领域,都可以通过HiTSDB 来解决,目前这款产品即将公测,欢迎有类似需求的团队试用。 本文作者:阿里巴巴资深工程师 凤豪原文链接

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。