摩登3登录_Linux应用编程之动态库的制作与使用

关注、星标公众号,直达精彩内容 ID:嵌入式情报局 作者:情报小哥 1动态库制作和使用简介     在Linux中制作动态链接库只需要使用好GCC这两个编译选项即可搞定,下面小哥画了一张图简单的说明了下: 过程简要说明:     其实链接库的生成过程也可以先分别生成位置无关的目标文件.o文件,然后再创建生成最终的.so动态链接文件。不过gcc可以直接使用这两个编译选项一次性生成。 2动态链接库制作过程 01 准备源文件     这里小哥还是使用昨天的两个module作为例子来讲解动态链接过程,这里就不板书了,可以到上一节静态链接中查看源文件。 02 编译生成动态链接库     这里通过-fPIC和-shared两个选项即可把所有的.c文件生成libxxx.so文件。那下面看一下这两个选项是什么意思: > > > > -fPIC选项     PIC – Position Independent Code,意思是位置无关码,即加载器把其加载到内存任何位置,其代码均可以正常运行,所以代码中都是使用的是相对地址,这样的特点也就非常满足动态库加载位置变化的特性。     同时这样的特点也让动态库被多个应用程序连接的时候不需要copy形成多个副本,大大节省内存。 > > > > -shared选项    该选项主要是GCC把目标文件链接成为一个共享库。 03 使用库文件编译     这里使用共享库来生成可执行文件的用法和前面的静态链接库是类似的,-lxxx(其中的xxx即.so文件去掉lib和后缀的名称),-L.即表示在当前文件中链接共享库。 04 动态库的使用          如果直接运行可执行文件Test,系统会提示无法打开共享文件,那一般都是由于共享库没有在系统加载器所在指定的路径中。    一般加载器都会默认在”/lib”、”/usr/lib”后者LD_LIBRARY_PATH环境变量指定的路径中搜索动态库,所以如果把.so文件复制到前面两个目录便可执行,不过为了不破坏系统文件,一般都会使用环境变量定义路径。    上面小哥直接使用export设置了环境变量定义为了当前路径,通过”echo $xxx”便可以查看所设置的路径,当然你也可以使用unset来删除环境变量,然后再次运行程序即可获得跟上次静态链接库一样的结果了。     当然这里采用了最直接的环境变量设置方法,一般系统注销,该环境变量就会消失,后面小哥会再整理一下环境变量的设置包括如何长久保留环境变量等,比如在用户主目录下的.profile或.bashrc文件配置。 3小结     今天主要是跟大家介绍了动态链接库的制作和使用,下期精彩见。 最后以上就是本次的分享,如果觉得文章不错,转发、在看,也是我们继续更新的动力。猜你喜欢: 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3测速登录地址_干货!protobuf-c之嵌入式平台使用

什么是protobuf-c 之前的文章:《Protobuf:一种更小、更快、更高效的协议》详细介绍了protobuf及protobuf-c。这里再简单提一下: Protocol Buffers,是Google公司开发的一种数据格式,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。protobuf支持一些主流的语言,唯独没有支持C,所以诞生了第三方的protobuf-c。 之前文章介绍了protobuf、protobuf-c在PC平台上的安装及使用,本篇笔记我们来把它用在我们的嵌入式ARM平台。 交叉编译protobuf-c 之前的文章中我们已经把protobuf、protobuf-c安装在我们的PC环境中了: 我们简单回顾一下我们上一篇文章的大致内容: 从中我们知道,这里的protobuf的主要作用是生成了protoc工具,而protoc工具的作用是把.proto文件生成对应的C源、头文件,这个过程是与平台无关的,所以这里我们可以接着用。 而protobuf-c生成了编译需要用到的动态库,此处我们需要编译ARM架构的动态库。即我们本篇笔记需要做的事情是: (1)交叉编译protobuf-c 首先在protobuf-c目录下使用make clean命令清除我们之前编译得到的东西: 输入如下命令生成交叉编译的Makefile文件: 左右滑动查看全部代码>>> ./configure --host=arm-linux-gnueabihf CC=/home/book/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-gcc CXX=/home/book/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-g++ --disable-protoc --prefix=$PWD/tmp 这个命令似乎很长,但并不难,只是加了几个配置参数。这些配置参数怎么看?我们可以输入./configure --help命令来查看支持的配置: 下面我们依次来分析上面那个很长的命令: –host=arm-linux-gnueabihf:表明了我们最终可执行文件运行的环境。 CC=/home/book/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-gcc:这是指定我们的交叉编译工具arm-linux-gnueabihf-gcc,这里直接给出绝对路径。 CXX=/home/book/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-g++:这是指定我们的交叉编译工具arm-linux-gnueabihf-g++,这里直接给出绝对路径。 –disable-protoc:不使用protoc,前面我们也说了protoc工具把.proto文件生成对应的C源、头文件的过程是与平台无关的,所以这里不需要使用,除非我们想在我们的开发板上使用protoc,但这反而增加麻烦,不推荐直接在开发板上用。 –prefix=$PWD/tmp:指定安装的路径。表明安装路径在当前路径下的tmp文件夹中。 执行完这个命令之后就得到了交叉编译的Makefile文件,然后依次输入如下命令进行编译、安装: makemake install 此时就在当前目录的tmp文件夹下生成了arm版本的相关库文件: 其中我们比较重要的就是libprotobuf-c.so这个动态库了,我们可以使用file或者readelf工具查看其是不是arm格式的: 很显然,这就是我们ARM平台的动态库。关于readelf的使用相关文章:《简单认识认识ELF文件》 下面开始我们的demo演示: (2)protobuf-c实例演示 我们自定义一个.proto来创建我们的协议数据,然后使用protoc-c工具编译生成C代码,有两个文件:一个头文件、一个源文件。 例如我们创建一个student.proto文件: syntax = "proto2"; message Student{    required string name    = 1;    required uint32 num     = 2;    required uint32 c_score = 3;} 使用protoc-c工具工具编译student.proto文件: protoc --c_out=. student.proto 编写我们的student.c测试demo: 左右滑动查看全部代码>>> #include  #include  #include  #include "student.pb-c.h" int main(void){    Student pack_stu = {0};    uint8_t buffer[512] = {0};    Student *unpack_stu = NULL;    size_t len = 0;     student__init(&pack_stu);     /* 组包 */    pack_stu.name = "ZhengN";    pack_stu.num = 88;    pack_stu.c_score = 90;    len = student__pack(&pack_stu, buffer);    printf("len = %ld\n",len);     /* 解包 */    unpack_stu = student__unpack(NULL, len, buffer);    printf("unpack_stu.name = %s\n", unpack_stu->name);    printf("unpack_stu.num = %d\n", unpack_stu->num);    printf("unpack_stu.c_score = %d\n", unpack_stu->c_score);     student__free_unpacked(unpack_stu, NULL);    return 0;} demo很简单,组包就是构造一个协议数据结构体,调用pack组包接口往buffer中扔数据;解包正好是反过来,从buffer中拿数据放到结构体里。 此时我们工程的文件有: 交叉编译: 左右滑动查看全部代码>>> arm-linux-gnueabihf-gcc student.c student.pb-c.c -o student -I /home/book/git_clone/protobuf-c/tmp/include -L /home/book/git_clone/protobuf-c/tmp/lib -lprotobuf-c 这个命令似乎也很长,其实也很简单: arm-linux-gnueabihf-gcc:交叉编译器。 student.c student.pb-c.c:输入的源文件。 student:生成的可执行文件。 -I /home/book/git_clone/protobuf-c/tmp/include:指定头文件路径。 -L /home/book/git_clone/protobuf-c/tmp/lib:指定库路径。 -lprotobuf-c:链接动态库libprotobuf-c.so。 这里需要重点提的就是我们可以把我们上面编译得到的tmp/include里的文件复制到我们交叉编译器头文件搜索路径下、把tmp/lib里的文件复制到交叉编译器库文件搜索路径下,这样我们就不需要指定这么长的一串路径了。 但是这里我为了保持我的交叉编译器的一个原始性,我就不往里加东西了。关于这些链接、动态库更详细的内容可以阅读往期文章:《静态链接与动态链接补充(Linux)》、《什么是动态链接与静态链接?》 编译没问题的话就可以生成我们的可执行文件student: 同样的,我们可以看一下student可执行文件的运行环境: 可见,是可运行在我们的arm开发板的。 下面把student拷贝到我们的开发板上运行,我这里用的是韦东山老师的IMX6ULL开发板。 运行出现如下错误: 这是因为不能找到共享库文件libprotobuf-c.so1,加载失败,这个问题我们已经在《静态链接与动态链接补充(Linux)》一文中做了详细解释。 解决方法有两种:第一种就是把这个库文件拷贝至系统库默认搜索路径下;第一种就是把当前路径增加为动态库的搜索路径。 这里我们选择第二种方法:我们把libprotobuf-c.so、libprotobuf-c.so1也传到板子上,放在student同目录下。然后输入如下命令把当前路径增加为动态库的搜索路径: export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH 然后运行: 运行成功! 以上就是咱们介绍的protobuf-c在嵌入式Linux平台上的使用(如果是正在学单片机的朋友,也可以尝试着移植使用。),如有错误,欢迎指出,谢谢。 按照以上两篇文章的步骤,大概率是可以成功的,关键是有耐心。 心得分享:在Linux的学习中,很多时候会被开发环境阻碍我们。常常按照别人的方法、步骤来做,却做不出来,很容易心态崩,这都是很正常的。因为环境不同,有时候还需要各种依赖。但我们要有足够的耐心,见招拆招! 在此之前,我也遇到了很多问题,也搜索了很多博客文章,要么行不通,要么写得太乱。所以趁此学习、写一篇。 这一篇大概是全网第一篇关于protobuf-c在嵌入式Linux平台上的交叉编译、使用步骤最全、解释最多的文章了。如果文章对你有帮助,麻烦帮忙转发,谢谢大家。 最后 以上就是本次的分享,如果觉得文章不错,转发、在看,也是我们继续更新的动力。 猜你喜欢: Linux 的启动流程 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3测速登陆_花5分钟看这篇之前,你才发现你不懂RESTful

前言 在学习RESTful 风格接口之前,即使你不知道它是什么,但你肯定会好奇它能解决什么问题?有什么应用场景?听完下面描述我想你就会明白: 在互联网并没有完全流行的初期,移动端也没有那么盛行,页面请求和并发量也不高,那时候人们对接口的要求没那么高,一些动态页面(jsp)就能满足绝大多数的使用需求。 但是随着互联网和移动设备的发展,人们对Web应用的使用需求也增加,传统的动态页面由于低效率而渐渐被HTML+JavaScript(Ajax)的前后端分离所取代,并且安卓、IOS、小程序等形式客户端层出不穷,客户端的种类出现多元化,而客户端和服务端就需要接口进行通信,但接口的规范性就又成了一个问题: 所以一套结构清晰、符合标准、易于理解、扩展方便让大部分人都能够理解接受的接口风格就显得越来越重要,而RESTful风格的接口(RESTful API)刚好有以上特点,就逐渐被实践应用而变得流行起来。 现在,RESTful是目前最流行的接口设计规范,在很多公司有着广泛的应用,其中Github 的API设计就是很标准的RESTful API,你可以参考学习。 在开发实践中我们很多人可能还是使用传统API进行请求交互,很多人其实并不特别了解RESTful API,对RESTful API的认知可能会停留在: 面向资源类型的 是一种风格 (误区)接口传递参数使用斜杠(/)分割而不用问号(?)传参。 而其实一个很大的误区不要认为没有查询字符串就是RESTful API,也不要认为用了查询字符串就不是RESTful API,更不要认为用了JSON传输的API就是RESTful API。 本篇将带你了解RESTful并用SpringBoot实战RESTful API. 一、REST介绍 REST涉及一些概念性的东西可能比较多,在实战RESTful API之前,要对REST相关的知识有个系统的认知。 REST的诞生 REST(英文:Representational State Transfer,简称REST,直译过来表现层状态转换)是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。 它首次出现在 2000 年 Roy Thomas Fielding 的博士论文中,这篇论文定义并详细介绍了表述性状态转移(Representational State Transfer,REST)的架构风格,并且描述了 如何使用 REST 来指导现代 Web 架构的设计和开发。用他自己的原话说: 我写这篇文章的目的是:在符合架构原理前提下,理解和评估基于网络的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。 需要注意的是REST并没有一个明确的标准,而更像是一种设计的风格,满足这种设计风格的程序或接口我们称之为RESTful(从单词字面来看就是一个形容词)。所以RESTful API 就是满足REST架构风格的接口。 Fielding博士答辩 Fielding博士当时提出的是REST架构在很久的时间内并没有被关注太多,而近些年REST在国内才变得越来越流行。下面开始详细学习REST架构特征。 REST架构特征 既然知道REST和RESTful的联系和区别,现在就要开始好好了解RESTful的一些约束条件和规则,RESTful是一种风格而不是标准,而这个风格大致有以下几个主要特征: 以资源为基础 :资源可以是一个图片、音乐、一个XML格式、HTML格式或者JSON格式等网络上的一个实体,除了一些二进制的资源外普通的文本资源更多以JSON为载体、面向用户的一组数据(通常从数据库中查询而得到)。统一接口: 对资源的操作包括获取、创建、修改和删除,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。换言而知,使用RESTful风格的接口但从接口上你可能只能定位其资源,但是无法知晓它具体进行了什么操作,需要具体了解其发生了什么操作动作要从其HTTP请求方法类型上进行判断。具体的HTTP方法和方法含义如下: GET(SELECT):从服务器取出资源(一项或多项)。 POST(CREATE):在服务器新建一个资源。 PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)。 PATCH(UPDATE):在服务器更新资源(客户端提供需要修改的资源数据)。 DELETE(DELETE):从服务器删除资源。 当然也有很多在具体使用的时候使用PUT表示更新。从请求的流程来看,RESTful API和传统API大致架构如下: URI指向资源:URI = Universal Resource Identifier 统一资源标志符,用来标识抽象或物理资源的一个紧凑字符串。URI包括URL和URN,在这里更多时候可能代指URL(统一资源定位符)。RESTful是面向资源的,每种资源可能由一个或多个URI对应,但一个URI只指向一种资源。 无状态:服务器不能保存客户端的信息, 每一次从客户端发送的请求中,要包含所有必须的状态信息,会话信息由客户端保存, 服务器端根据这些状态信息来处理请求。当客户端可以切换到一个新状态的时候发送请求信息, 当一个或者多个请求被发送之后, 客户端就处于一个状态变迁过程中。每一个应用的状态描述可以被客户端用来初始化下一次的状态变迁。 REST架构限制条件 Fielding在论文中提出REST架构的6个限制条件,也可称为RESTful 6大原则, 标准的REST约束应满足以下6个原则: 客户端-服务端(Client-Server): 这个更专注客户端和服务端的分离,服务端独立可更好服务于前端、安卓、IOS等客户端设备。 无状态(Stateless):服务端不保存客户端状态,客户端保存状态信息每次请求携带状态信息。 可缓存性(Cacheability) :服务端需回复是否可以缓存以让客户端甄别是否缓存提高效率。 统一接口(Uniform Interface):通过一定原则设计接口降低耦合,简化系统架构,这是RESTful设计的基本出发点。当然这个内容除了上述特点提到部分具体内容比较多详细了解可以参考这篇REST论文内容。 分层系统(Layered System):客户端无法直接知道连接的到终端还是中间设备,分层允许你灵活的部署服务端项目。 按需代码(Code-On-Demand,可选):按需代码允许我们灵活的发送一些看似特殊的代码给客户端例如JavaScript代码。 REST架构的一些风格和限制条件就先介绍到这里,后面就对RESTful风格API具体介绍。 二、RESTful API设计规范 既然了解了RESTful的一些规则和特性,那么具体该怎么去设计一个RESTful API呢?要从URL路径、HTTP请求动词、状态码和返回结果等方面详细考虑。至于其他的方面例如错误处理、过滤信息等规范这里就不详细介绍了。 URL设计规范 URL为统一资源定位器 ,接口属于服务端资源,首先要通过URL这个定位到资源才能去访问,而通常一个完整的URL组成由以下几个部分构成: URI = scheme "://" host  ":"  port "/" path [ "?" query ][ "#" fragment ] scheme: 指底层用的协议,如http、https、ftphost: 服务器的IP地址或者域名port: 端口,http默认为80端口path: 访问资源的路径,就是各种web 框架中定义的route路由query: 查询字符串,为发送给服务器的参数,在这里更多发送数据分页、排序等参数。fragment: 锚点,定位到页面的资源 我们在设计API时URL的path是需要认真考虑的,而RESTful对path的设计做了一些规范,通常一个RESTful API的path组成如下: /{version}/{resources}/{resource_id} version:API版本号,有些版本号放置在头信息中也可以,通过控制版本号有利于应用迭代。resources:资源,RESTful API推荐用小写英文单词的复数形式。resource_id:资源的id,访问或操作该资源。 当然,有时候可能资源级别较大,其下还可细分很多子资源也可以灵活设计URL的path,例如: /{version}/{resources}/{resource_id}/{subresources}/{subresource_id} 此外,有时可能增删改查无法满足业务要求,可以在URL末尾加上action,例如 /{version}/{resources}/{resource_id}/action 其中action就是对资源的操作。 从大体样式了解URL路径组成之后,对于RESTful API的URL具体设计的规范如下: 不用大写字母,所有单词使用英文且小写。 连字符用中杠"-"而不用下杠"_" 正确使用 "/"表示层级关系,URL的层级不要过深,并且越靠前的层级应该相对越稳定 结尾不要包含正斜杠分隔符"/" URL中不出现动词,用请求方式表示动作 资源表示用复数不要用单数 不要使用文件扩展名…

摩登3平台开户_大彩串口屏在RTOS编程中应该注意的要点

这个月20号准备去参加RT-Thread一年一度的RDC开发者大会,顺便会带上我们公司的产品,这个产品就用到了大彩串口屏,所以昨天我也写了一篇表驱动法在大彩串口屏上的应用,文章如下: 【12月】大彩串口屏RT-Thread Nano STM32表驱动法产品应用开发 接下来我会做一个产品级的基于大彩串口屏的开源项目,用的大彩串口屏型号是:DC80480F070_6111_ON,128M,如下,这是一个7寸屏幕,分辨率800*480;当然价格也是超级便宜的了,入手价也就180块钱,今年屏疯狂涨价,这个价格已经很良心了。 近年来,RTOS在嵌入式系统设计中的主导地位也越来越明确,越来越多的工程师选用RTOS来完成产品功能的开发;从最熟悉不过的ucos,到后来的freertos、rt-thread、Tencentos tiny等等,以使用者的角度,我在产品开发上用过的RTOS非常多;但最后得出一个结论,只要通一个,其它则一通百通;正因为RTOS种类越来越多,所以ARM公司推出了CMSIS-RTOS,为统一操作系统、降低嵌入式门槛而发布的操作系统标准软件接口,CMSIS-RTOS的作用用通俗的话来讲就是:劳资不管你是什么RTOS,你只需要学习我的CMSIS-RTOS怎么用就可以了,但前提是你要把那些RTOS的接口适配到CMSIS-RTOS上,然后你就可以抛弃那些含义相同,写法不同的RTOS API,通通都可以不用它们,只用CMSIS-RTOS的API接口即可! CMSIS-RTOS架构图如下: 详情学习可以参考世伟兄之前在腾讯实习的时候周末写的文章: RTOS内功修炼记(八)— CMSIS RTOS API,内核通用API接口 1、串口屏是什么? 串口屏,在百度百科上是这么来解释的: 一套由单片机或PLC带控制器的显示方案,显示方案中的通讯部分由串口通讯,UART串口或者SPI串口等;它由显示驱动板、外壳、LCD液晶显 示屏三部分构成。接收用户单片机串口发送过来的指令,完成在LCD上绘图的所有操作。 1.1、大彩串口屏的数据收发接口 1.1.1、大彩串口屏数据接收处理 收的部分昨天的文章已经介绍过了: 【12月】大彩串口屏RT-Thread Nano STM32表驱动法产品应用开发 是通过一种类似消息机制的队列来进行实现,然后将队列里的数据进行拼接加工后满足大彩科技定义的一种协议指令集,所以中断服务函数实现如下,这样就可以持续的来接收串口屏回复的指令: /**  * @brief This function handles USART2 global interrupt.  */void USART2_IRQHandler(void){    /* USER CODE BEGIN USART2_IRQn 0 */    uint32_t i ;    uint32_t uart2_dma_rxlen ;    /*进入中断调用*/    rt_interrupt_enter();    if(__HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_IDLE) != RESET)    {        __HAL_UART_CLEAR_IDLEFLAG(&huart2);        HAL_UART_DMAStop(&huart2);        uart2_dma_rxlen = HMI_LCD_U2_BUFFER_SIZE - (__HAL_DMA_GET_COUNTER(huart2.hdmarx));            for(i = 0; i < uart2_dma_rxlen; i++)        {            queue_push(HMI_LCD_Handler.HMI_LCD_U2_Buffer[i]);        }        __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);        HAL_UART_Receive_DMA(&huart2, HMI_LCD_Handler.HMI_LCD_U2_Buffer, HMI_LCD_U2_BUFFER_SIZE);    }    /* USER CODE END USART2_IRQn 0 */    HAL_UART_IRQHandler(&huart2);    /* USER CODE BEGIN USART2_IRQn 1 */   /*离开中断调用*/   rt_interrupt_leave();  /* USER CODE END USART2_IRQn 1 */} 以下是大彩科技提供给开发者的MCU例程文档中接收指令集的流程图: 以使用RT-Thread为例,在进入中断前调用:rt_interrupt_enter,在离开中断前调用:rt_interrupt_leave。 以上描述来自RT-Thread文档中心。 比如TencentOS tiny也提供了一组API: tos_knl_irq_entertos_knl_irq_leave 在进入中断处理函数调用tos_knl_irq_enter,在退出前调用tos_knl_irq_leave。 又比如UCOSIII也提供了一组API: OSIntEnter();OSIntExit(); 在进入中断处理函数调用OSIntEnter,在退出前调用OSIntExit。 其它的RTOS也是类似的,这里就不多做介绍了,有兴趣可以自己测试和研究。 1.1.2、大彩串口屏数据发送处理 大彩串口屏提供了hmi_driver.c这个文件,这个文件提供了一系列串口命令驱动的函数,例如设置控件的值等等,这些 操作依赖于以下这些发送接口: #define TX_8(P1) SEND_DATA((P1)&0xFF)                    //发送单个字节#define TX_8N(P,N) SendNU8((uint8 *)P,N)                 //发送N个字节#define TX_16(P1) TX_8((P1)>>8);TX_8(P1)                 //发送16位整数#define TX_16N(P,N) SendNU16((uint16 *)P,N)              //发送N个16位整数#define TX_32(P1) TX_16((P1)>>16);TX_16((P1)&0xFFFF)     //发送32位整数 上面这些接口,最终我们需要提供这样一个发送单个字节的函数: /*! *  \brief  发送一个字节*  \param  c */void SEND_DATA(uint8 c){    SendChar(c);} 那我们就直接实现SendChar这个函数就行了,以带RT-Thread操作系统的STM32工程为例,编写如下接口: void SendChar(uint8_t data){    /*调度器上锁*/    rt_enter_critical();    HAL_UART_Transmit(&huart2, &data, 1, 1000);    while(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TXE) != SET);    /*调度器解锁*/    rt_exit_critical();} 这里为什么要加上调度锁呢??假设,你在界面上需要在不同任务里同时调用如下接口: void SetTextValue(u16 screen_id, u16 control_id, u8 *str){    BEGIN_CMD();    TX_8(0xB1);    TX_8(0x10);    TX_16(screen_id);    TX_16(control_id);    SendStrings(str);    END_CMD();} 这个接口是用来在给界面上某个文本控件显示字符串用的;当多个任务同时调用该接口时,这样不就是我们之前谈的打架问题了吗?在多任务系统中,这就是一种潜在的风险,当一个任务在使用某个资源的过程中,还没有完全结束对资源的访问时就被打断了,这样就会出现一些奇奇怪怪的问题,比如之前我用OLED结合RTOS编程时候也会出现像屏幕花屏的现象,这里我采用的方法是直接在底层的接口函数处加上调度锁,以防止这种情况发生,当然,还有另外一种方法可以实现,那就是互斥锁。 至于互斥锁该怎么用,打开各大RTOS的API参考手册,上面会详细的告诉你如何创建,如何使用,照着做就是了,这里就不多说了。 让传感器数据更直观之LCD曲线显示 【12月】大彩串口屏RT-Thread Nano STM32表驱动法产品应用开发 开源作品:基于TencentOS tiny英国达特甲醛探测仪产品级开发(二) 整理了很久之前在码云/Github/CSDN上收藏的嵌入式产品级项目分享开源 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3注册登录网_干货分享!嵌入式裸机编程中使用malloc、free会怎样?

在嵌入式裸机编程中,作为一名初级的CODER。经常要与CPU、内存等打交道。CPU作为系统的动力源,其重要程度不言而喻。 但是,在裸机编程中,对内存的管理也不容忽视。如果稍微不注意,轻则,可能造成内存泄漏,重则造成内存访问异常。导致系统死机。 嵌入式产品,对稳定性要求及其严格。动不动就死机,那可就麻烦大了。以下,是我本人对嵌入式系统裸机编程的内存管理的一些简介。 1、尽量不使用库自带的malloc和free。 malloc和free在PC编程中是很好用的一种内存分配手段。但是,其在嵌入式中,就未必好用了。由于嵌入式裸机编程中,无MMU,即内存管理单元。无法实现对内存进行动态映射(不明白什么叫动态映射的同学,可以参考网上的资料)。 也就是说,实际上,malloc和free并不能实现动态的内存的管理。这需要在启动阶段专门给其分配一段空闲的内存区域作为malloc的内存区。如STM32中的启动文件startup_stm32f10x_md.s中可见以下信息: Heap_Size EQU 0x00000800AREA HEAP, NOINIT, READWRITE, ALIGN=3__heap_baseHeap_Mem SPACE Heap_Size__heap_limit 其中,Heap_Size即定义一个宏定义。数值为 0x00000800。Heap_Mem则为申请一块连续的内存,大小为 Heap_Size。简化为C语言版本如下: #define Heap_Size 0x00000800unsigned char Heap_Mem[Heap_Size] = {0}; 在这里申请的这块内存,在接下来的代码中,被注册进系统中给malloc和free函数所使用: __user_initial_stackheapLDR R0, = Heap_Mem ; 返回系统中堆内存起始地址LDR R1, =(Stack_Mem + Stack_Size)LDR R2, = (Heap_Mem + Heap_Size); 返回系统中堆内存的结束地址LDR R3, = Stack_MemBX LR 就如上面分析的那样,其实,在裸机编程的时候,对堆内存的管理。并非是智能化的,并非你想申请多少就多少。而是使用一块固定的内存用作堆内存的分配。这在设计的时候,往往不是最佳的方案。这块内存,如果被多次按照不同的大小进行申请,就会造成内存碎片。最终导致无法申请到足够的内存。导致系统运行出错。这在原本内存就已经很少的嵌入式系统中,更是不能接受的。所以,建议是把那个Heap_Size设置成 0 吧。放弃其使用吧。 而更为致命的是,有些malloc,free函数,由于工程人员的偷懒。实现甚至可能如下: unsigned char mem_buffer[512];unsigned char *mem_offset = & mem_buffer;void *malloc(int size){unsigned char *tmp = mem_offset; mem_offset += size;return (void *)tmp;}void free(void *mem){ mem_offset = mem;} 2、不用malloc、free的原因 一般单片机的内存都比较小,而且没有MMU,malloc 与free的使用容易造成内存碎片。而且可能因为空间不足而分配失败,从而导致系统崩溃,因此应该慎用,或者自己实现内存管理。如: 《一个简单而强大的单片机内存管理器》 在函数中使用malloc,如果是大的内存分配,而且malloc与free的次数也不是特别频繁,使用malloc与free是比较合适的,但是如果内存分配比较小,而且次数特别频繁,那么使用malloc与free就有些不太合适了。 因为过多的malloc与free容易造成内存碎片,致使可使用的堆内存变小。尤其是在对单片机等没有MMU的芯片编程时,慎用malloc与free。如果需要对内存的频繁操作,可以自己实现一个内存管理。 使用动态内存分配,应分不同的应用场合。 对于在操作系统上运行的程序,实际的物理内存分配与释放使用操作系统来实现的,即使程序调用了 malloc和free物理内存并不会马上变化。物理内存的变化,直到系统的内存管理操作时才发生。 对于裸机跑在MCU上的程序,分配与释放内存都会造成实际物理内存的变化。因为此时物理内存的分配是由自己实现的,而内存管理我们自己并没有去做。这样,盲目的使用malloc与free恰恰并不好,反而会造成内存的不恰当使用。甚至于内存溢出。 所以,动态内存的使用前提是有一套好的内存管理方法,这样动态内存的使用才会合理使用内存。如果没有合适的内存管理代码,还是用静态内存好一些。 可能有些同学,觉得:内存池,这是什么东西? 内存池,简洁地来说,就是预先分配一块固定大小的内存。以后,要申请固定大小的内存的时候,即可从该内存池中申请。用完了,自然要放回去。注意,内存池,每次申请都只能申请固定大小的内存。这样子做,有很多好处: (1)每次动态内存申请的大小都是固定的,可以有效防止内存碎片化。(至于为什么,可以想想,每次申请的都是固定的大小,回收也是固定的大小) (2)效率高,不需要复杂的内存分配算法来实现。申请,释放的时间复杂度,可以做到O(1)。 (3)实现简单,易用。 (4)内存的申请,释放都在可控的范围之内。不会出现以后运行着,运行着,就再也申请不到内存的情况。 内存池,并非什么很厉害的技术。实现起来,其实可以做到很简单。只需要一个链表即可。在初始化的时候,把全局变量申请来的内存,一个个放入该链表中。在申请的时候,只需要取出头部并返回即可。在释放的时候,只需要把该内存插入链表。以下是一种简单的例子(使用移植来的linux内核链表,对该链表的移植,以后有时间再去分析): #define MEM_BUFFER_LEN 5 //内存块的数量#define MEM_BUFFER_SIZE 256 //每块内存的大小//内存池的描述,使用联合体,体现穷人的智慧。就如,我一同学说的:一个字节,恨不得掰成8个字节来用。typedef union mem {struct list_head list;unsigned char buffer[MEM_BUFFER_SIZE];}mem_t;static union mem gmem[MEM_BUFFER_LEN];LIST_HEAD(mem_pool);//分配内存void *mem_pop(){ union mem *ret = NULL; psr_t psr; psr = ENTER_CRITICAL();…

摩登3新闻554258:_大厂也在用的6种数据脱敏方案,别做泄密内鬼

最近连着几天晚上在家总是接到一些奇奇怪怪的电话,“哥,你是 xxx 吧,我们这里是 xxx 高端男士私人会所…”,握草,我先是一愣,然后狠狠的骂了回去。一脸傲娇的转过头,面带微笑稍显谄媚:老婆你听我说,我真的啥也没干,你要相信我! 啪~ 搞事情啊 过后揉揉脸细想想,肯定是哪个不道德的网站,又把我的个人信息给卖了,现在的人上网都处于一个裸奔的状态,个人信息已不再属于个人,时下这种事好像也见怪不怪了,不过,出现这种事大多是有内鬼。 停止交易,有内鬼 而作为开发者的我们,能做的就是尽量避免经我们手的用户数据泄露,那今天就来讲讲互联网中内部防止隐私数据泄露的手段-数据脱敏。 什么是数据脱敏 先来看看什么是数据脱敏?数据脱敏也叫数据的去隐私化,在我们给定脱敏规则和策略的情况下,对敏感数据比如 手机号、银行卡号 等信息,进行转换或者修改的一种技术手段,防止敏感数据直接在不可靠的环境下使用。 像政府、医疗行业、金融机构、移动运营商是比较早开始应用数据脱敏的,因为他们所掌握的都是用户最核心的私密数据,如果泄露后果是不可估量的。 数据脱敏的应用在生活中是比较常见的,比如我们在淘宝买东西订单详情中,商家账户信息会被用 * 遮挡,保障了商户隐私不泄露,这就是一种数据脱敏方式。 淘宝详情 数据脱敏又分为静态数据脱敏(SDM)和 动态数据脱敏(DDM): 静态数据脱敏 静态数据脱敏(SDM):适用于将数据抽取出生产环境脱敏后分发至测试、开发、培训、数据分析等场景。 有时我们可能需要将生产环境的数据  copy 到测试、开发库中,以此来排查问题或进行数据分析,但出于安全考虑又不能将敏感数据存储于非生产环境,此时就要把敏感数据从生产环境脱敏完毕之后再在非生产环境使用。 这样脱敏后的数据与生产环境隔离,满足业务需要的同时又保障了生产数据的安全。 数据脱敏过程 如上图所示,将用户的真实 姓名、手机号、身份证、银行卡号 通过 替换、无效化、乱序、对称加密 等方案进行脱敏改造。 动态数据脱敏 动态数据脱敏(DDM):一般用在生产环境,访问敏感数据时实时进行脱敏,因为有时在不同情况下对于同一敏感数据的读取,需要做不同级别的脱敏处理,例如:不同角色、不同权限所执行的脱敏方案会不同。 注意:在抹去数据中的敏感内容同时,也需要保持原有的数据特征、业务规则和数据关联性,保证我们在开发、测试以及数据分析类业务不会受到脱敏的影响,使脱敏前后的数据一致性和有效性。。 数据脱敏方案 数据脱敏系统可以按照不同业务场景自行定义和编写脱敏规则,可以针对库表的某个敏感字段,进行数据的不落地脱敏。 脱敏系统 数据脱敏的方式有很多种,接下来以下图数据为准一个一个的演示每种方案。 原始数据 1、无效化 无效化方案在处理待脱敏的数据时,通过对字段数据值进行 截断、加密、隐藏 等方式让敏感数据脱敏,使其不再具有利用价值。一般采用特殊字符(*等)代替真值,这种隐藏敏感数据的方法简单,但缺点是用户无法得知原数据的格式,如果想要获取完整信息,要让用户授权查询。 截断方式 比如我们将身份证号用 * 替换真实数字就变成了 “220724 ****** 3523″,非常简单。 隐藏方式 2、随机值 随机值替换,字母变为随机字母,数字变为随机数字,文字随机替换文字的方式来改变敏感数据,这种方案的优点在于可以在一定程度上保留原有数据的格式,往往这种方法用户不易察觉的。 我们看到 name 和 idnumber 字段进行了随机化脱敏,而名字姓、氏随机化稍有特殊,需要有对应姓氏字典数据支持。 随机值 3、数据替换 数据替换与前边的无效化方式比较相似,不同的是这里不以特殊字符进行遮挡,而是用一个设定的虚拟值替换真值。比如说我们将手机号统一设置成 “13651300000”。 数据替换 4、对称加密 对称加密是一种特殊的可逆脱敏方法,通过加密密钥和算法对敏感数据进行加密,密文格式与原始数据在逻辑规则上一致,通过密钥解密可以恢复原始数据,要注意的就是密钥的安全性。 对称加密 5、平均值 平均值方案经常用在统计场景,针对数值型数据,我们先计算它们的均值,然后使脱敏后的值在均值附近随机分布,从而保持数据的总和不变。 原始数据 对价格字段 price 做平均值处理后,字段总金额不变,但脱敏后的字段值都在均值 60 附近。 平均值 6、偏移和取整 这种方式通过随机移位改变数字数据,偏移取整在保持了数据的安全性的同时保证了范围的大致真实性,比之前几种方案更接近真实数据,在大数据分析场景中意义比较大。 比如下边的日期字段create_time中 2020-12-08 15:12:25 变为 2018-01-02 15:00:00。 取整 数据脱敏规则在实际应用中往往都是多种方案配合使用,以此来达到更高的安全级别。 总结 无论是静态脱敏还是动态脱敏,其最终都是为了防止组织内部对隐私数据的滥用,防止隐私数据在未经脱敏的情况下从组织流出。所以作为一个程序员不泄露数据是最起码的操守。 长按订阅更多精彩▼ 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3平台首页_RSL10 Mesh平台荣获2020年度中国IoT创新奖之“IoT技术创新奖”

12月4日,由电子发烧友举办的第七届中国IoT大会于深圳举办。在当天晚上的中国IoT创新奖颁奖典礼上,安森美半导体的RSL10 Mesh 平台荣获“IoT技术创新奖”。 安森美半导体医疗分部亚洲区高级市场经理杨正龙(Henry Yang) RSL10 Mesh平台。这Strata赋能的方案提供智能感知和云联接,支持节点对节点通信。 使用RSL10 Mesh平台,工程师可轻松实现使用低功耗蓝牙技术的超低功耗的网状网络,并迅速走向全面部署。该多面方案优化用于智能家居、楼宇自动化、工业IoT、远程环境监控以及资产跟踪和监控应用,具有开发和部署网状网络所需的所有基本要素。 与传统的点对点 (P2P) 蓝牙联接不同,蓝牙低功耗网状网络实现了,比传统的P2P蓝牙通信覆盖更大的距离,因为节点可以将数据包中继到传输节点范围之外的目标节点以执行消息传递。 这使以前无法用蓝牙技术实现的各种IoT应用成为可能,包括联网照明和远程传感器监控。蓝牙低功耗网状网络的价值和消除范围限制,现已在工业、农业、企业和物流领域以及智慧城市的兴起等多个不同环境得以认可。 但是,运作限制和实施便利性仍是主要挑战。安森美半导体的RSL10 Mesh平台,以更快地部署节点,推进在范围、灵活性和功率预算的性能极限。 RSL10 Mesh平台基于超低功耗RSL10系统级封装(RSL10 SIP),含两个RSL10 Mesh节点和一个Strata网关,以联接到Strata Developer Studio™。 RSL10 SIP辅以一系列传感器和指示器,已集成到节点硬件中,包括环境光传感器(LV0104CS)、温度传感器(N34TS108)、磁性传感器、LED指示器和三路输出NCP5623B LED驱动器 (用于混色)。另外还内置一个电池充电器,适用于具有锂离子或锂聚合物化学性质的电池。 网格节点可以简单地配置成不同的角色并展示特定的功能面。与之配套的Strata 网关支持使用高度直观的Strata Developer Studio进行评估过程。这云联接的软件可实现更多网格的配置,并支持空中固件升级(FOTA)。 使用虚拟工作区用于包括智能办公室在内的常见网状网络示例,开发人员可以访问传感器数据和触发设置。该高能效RSL10无线电配以基于Eclipse的集成开发环境、用于预配、配置和控制低功耗蓝牙网状网络的移动应用程序,以及符合蓝牙特别兴趣小组(Bluetooth SIG)的网状网络软件包。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3测速登陆_高通5G芯片骁龙888升级显著 GPU实现迄今为止最大提升

骁龙888全新的命名方式,也成为人们对这款高通5G芯片喜闻乐道的焦点。数字“8”在过去的十几年里一直代表着高通旗下最旗舰的产品层级。所以,这一次高通希望以一个“最能代表旗舰的命名”来赋予高通骁龙888这一款全新的5G芯片。 话不多说,让我们一起来领略高通这款迄今为止最强大5G芯片的秘密吧。 高通5G芯片骁龙888的Kryo 680 CPU采用了Arm今年5月刚刚发布的Cortex-A78、Cortex-X1内核,一个主频为2.84GHz的X1性能超大核+三个主频为2.4GHz的A78大核+四个主频1.8GHz的A55小核的三丛集设计,再加三星5nm制程加持,让高通5G芯片骁龙888具备极为出色的能效比。虽然高通5G芯片骁龙888在频率上保持和上代高通5G芯片骁龙865一致,但CPU综合性能还是提升了25%之多。高通一直注重CPU的持续性能,因为向其他友商一样单纯地追求“一两分钟”的高峰值性能,其实意义不大,只有持续稳定的性能才能给用户带来好的体验。 GPU方面,高通5G芯片骁龙888采用了Adreno 660 GPU,实现了迄今为止最大的性能提升,图形渲染速度的增幅高达35%之多。同样的,高通强调骁龙888 5G芯片的GPU也能够持续稳定输出高性能,这相比峰值性能更为重要。 再说说AI部分,高通5G芯片骁龙888采用了整体全新设计的第六代AI引擎,Hexagon 780处理器实现了Scalar、Tensor、Vector三个AI加速器之间的内存共享,拥有每秒26万亿次算力,性能增加了73%,每瓦特性能提升至前代的3倍。值得留意的是,第二代高通传感器中枢集成的专用低功耗AI处理器的运用,实现了低功耗(节能80%)与高效能的兼得。 拍照能力历来是高通骁龙芯片尤为重视的一个部分,高通5G芯片骁龙888首次采用了三ISP设计。现在智能手机普遍镜头数量都在三个以上,通过三ISP设计,高通5G芯片骁龙888可以让不同镜头调用不同的ISP,轻松实现10亿像素级的图像处理,每秒处理27亿像素,支持4K 120FPS不限时慢动作摄影。骁龙888的如此强大,以至于高通总裁安蒙就曾调侃道“高通是一家相机公司。” 当然,作为明年安卓旗舰智能手机的首选,高通5G芯片骁龙888更大的发力点还是在5G方面。高通5G芯片骁龙888完全集成了高通第三代5G调制解调器及射频系统——骁龙X60。骁龙X60是一个系统级的完整解决方案,包括基带、射频收发器、射频前端、毫米波天线模组,旨在为运营商提供极大的灵活性,最大化其可用的频谱资源。作为现阶段最全面的5G解决方案,高通骁龙X60 5G基带支持全球毫米波和Sub-6GHz全部主要频段,以及5G载波聚合、全球多SIM卡功能、独立(SA)和非独立(NSA)组网模式以及动态频谱共享(DSS),是真正面向全球的兼容性5G平台。在高通5G基带骁龙X60的加持下,高通5G芯片骁龙888能够支持5G在更多的国家得以部署,进一步提升终端整体性能和网络所提供的用户体验,以及解决随着时间而不断增加的频段组合的复杂性。 得益于高通5G基带骁龙X60在全球5G兼容性和对未来新技术的事先准备,高通5G芯片骁龙888既能保证消费者将来在全球各地的出差或旅游时,在不用换机的前提下,依然有高速5G网络可用,还会随着5G网络建设所采用的毫米波等技术,用户将获得更快的网速体验,不愧是现阶段最出色的5G基带。 目前,小米、vivo、realme、OnePlus、OPPO、黑鲨、联想、中兴等OEM产商都会推出搭载高通5G芯片骁龙888的手机产品,骁龙888的实际表现,很快就能在市场上见分晓。

摩登3登录网站_当收发器遇上外部本振,更强的射频性能get√

软件定义无线电是当今业界的主要话题之一。射频(RF)收发器在单芯片集成电路中(IC)中提供了完整的无线电解决方案,推动了软件定义无线电的领域的发展。ADI 收发器产品线推出了这类强大的芯片,正快速应用于许多通过软件控制的无线电设计中。但是如何获得较低的相位噪声仍是使用这些器件需要探索的领域之一。本文评估这些高度集成的射频集成电路(RFIC)的相位噪声性能,重点评估提供外部频率时的情况。 使用外部本振(LO)时对ADI公司 ADRV9009 收发器进行测量表明,当使用低噪声LO时,可显著改善相位噪声。从相位噪声贡献角度来分析收发器架构。通过一系列测量,残余或加性相位噪声被提取为在DAC输出编程的频率的函数。利用该噪声贡献以及LO和参考电压输入频率的相位噪声,可估计出发射输出的总相位噪声。将这些估计值与测得的结果进行比较。 动机 相位噪声是无线电设计中表征信号质量的重要指标之一。 在架构定义阶段需要进行大量工作,确保以经济的方式满足相位噪声需求。 通过分析ADRV9009收发器的测量结果,其噪声性能结果却决于所选架构,不同架构结果差异较大。使用内部LO功能时,相位噪声由IC内部的锁相环(PLL)和压控振荡器(VCO)决定。内部LO在设计上能满足大多数通信应用的需求。对于需要改进相位噪声的应用,将低相位噪声源作为外部LO时,可显著改进相位噪声。 如图1所示,ADRV9009收发器在10 kHz至100 kHz频段相位噪声改善超过40 dB。以上测量的条件为:对于内部LO测量,LO频率设置为2.6 GHz, DAC输出为8 MHz。对于外部LO测量,Rohde & SchwarzSMA100B用作LO源。由于外部LO信号需要经过ADRV9009的内部分频器,因此为获得2.6 GHz的LO频率,信号源设置为5.2 GHz。使用Holzworth HA7402相位噪声分析仪进行相位噪声的测量。 图1. ADRV9009收发器相位噪声测量。使用内部LO时,相位噪声受到IC内部PLL/VCO的限制。如果使用低相位噪声外部LO,可显著改进相位噪声。 ADRV9009收发器 ADRV9009是ADI收发器产品线的新产品。 收发器架构如图2所示。 该芯片使用直接变频架构,将发射和接收双通道收发链路集成在单芯片中。 其中包含正交校正、直流失调和LO泄漏校正等数字处理算法,这些算法保证了直接变频架构的性能。 收发器提供了射频(RF)与数字之间转换的完整功能。 支持高达6GHz的RF频率,JESD204B接口则为基于ASIC或FPGA的处理器提供高速数据接口。 图2. ADRV9009收发器功能框图。 无线电与外部输入的参考频率同步。转换器时钟、LO和数字时钟的PLL均会与参考时钟锁相。通过外部LO的配置可以绕过内部LO PLL。LO路径的PLL或外部LO输入与混频器端口之间有一个分频器,用于生成直接变频架构所需的正交LO信号。转换器时钟和LO会直接影响相位噪声,在评估相位噪声贡献因素时我们会对此进行进一步讨论。 检查相位噪声贡献因素 发射的相位噪声由多个因素组成。 图3阐明了使用直接变频波形发生器架构的简单功能框图以及主要相位噪声因素。 图3. 直接上变频功能框图和关联相位噪声贡献因素。 在倍频器或分频器中,相位噪声的比例为20logN,其中N是输入输出频率比。 这比例也适用于直接数字频率合成器(DDS),其中时钟噪声贡献与DDS输出频率的比例为20logN。 要考虑的第二个方面是PLL中的相位噪声传递函数,注入PLL的基准频率将作为频率比例函数(类似于倍频器)按比例分配到输出,但会受环路带宽(BW)和所选的环路滤波器所形成的低通滤波器影响。 将这些原则应用于收发器,可检查各种噪声因素的贡献。注入收发器的频率有两种,即LO频率和基准频率。LO频率直接影响相位噪声输出,但在用于创建混频器正交LO信号的内部分频器中减少了6 dB。基准频率贡献由几个因素决定。它用于在时钟PLL中创建DAC时钟。时钟输出上由于基准频率而产生的噪声将与PLL的噪声传递函数成比例。然后,这种噪声贡献再次与DAC时钟与DAC输出频率比成比例。这种效果可以简化为基准频率和DAC输出频率的比例,并受PLL BW低通传递函数影响。 接下来,考虑收发器相位噪声贡献。在发射路径中,所有电路元件都会产生残余噪声,另一个噪声贡献是DAC输出的加性噪声,它随DAC输出频率而变化。这可以总结为两个残余相位噪声术语:频率相关噪声贡献和频率无关噪声贡献。频率相关噪声与DAC输出频率的比例为20logN。频率无关噪声是固定的,将作为收发器的相位噪底。 为了提取IC残余噪声贡献作为频率相关贡献因素和频率无关贡献因素的函数进行了一系列相位噪声测量,如图4所示。 (a). The Reference Frequency and LO Frequency. (b). The Transceiver Transmit Output Phase Noise. (c). The Transceiver Residual Phase Noise. 图4. 用于提取可变相位噪声贡献因素的相位噪声测量。 用于相位噪声测量的测试设置如图5所示。对于收发器LO和基准频率输入,分别使用了Rohde & Schwarz SMA100B和100 A。Holzworth HA7402C用作相位噪声测试设置。对于绝对相位噪声测量,将收发器的发射输出注入测试设置。对于残余相位噪声测量,需要三个收发器,并且将额外的收发器作为测试设置中混频器的LO端口,可从测量中去除基准频率和LO频率的噪声贡献。 (a). Absolute Phase Noise Measurement. (b). Residual Phase Noise Measurement. 图5. 用于相位噪声测量的测试设置。 通过评估图4的实测数据,从收发器IC中提取了频率相关和频率无关相位噪声贡献因素。估计值如图6所示。估计值来自于对实测数据的拟合结果以及在偏移频率大于1 MHz时对相位噪底应用的阈值设置。 图6. 收发器残余相位噪声贡献。这些曲线是从图4的实测数据中提取出来的。 绝对相位噪声测量和预测 如前所述通过评估不同相位噪声贡献,基于DAC输出频率以及用于参考和本振的振荡源,相位噪声可以通过计算预测。 实测和预测结果如图7所示。 (a). DAC Ouput = 12.5 MHz. (b). DAC Output = 25 MHz. (c). DAC Output = 50 MHz. (d). DAC Output = 100 MHz. 图7. 外部LO的测量相位噪声与预测相位噪声的对比。对于2.6…

摩登3测试路线_华为灰度管理法之读书思维导图及感想分享

前一两个月,老板召集大家开了个会,给我们发了两本书: 在没打开这两本书之前,容我来猜测一下大家心里的想法: 老板又来给我们洗脑了,这次换了一种新的手段 这是资本主义剥削劳动者的手段 这是在荼毒我们打工者的的思想,让我们一辈子打工 这些都是毒鸡汤 形式主义 等等。。。 我先看的是< > 这本书,后来通过这本书了解到了< > ;在读完< > 这本书以后,我体会最深的一句话:人性是复杂的,不是简单的黑与白,整本书围绕着这句话展开了任总灰度理论的解释和应用,从而告诉大家,华为就是这么一步步走过来的。 虽然成功不可复制,但是成功的方法我们可以学习;看完这本书以后,我不禁从内心里发出感叹:感谢老板对我的馈赠!他是我的人生导师之一!一个人思维的贫穷才是真正的贫穷,所以只有从本质上改变自己的思维方式,才有可能真正的成长。和华为相关的书我也读过不少,但是这本书确实挺有意思;这是一本能够帮助企业和个人成长的书籍。 < >整本书分为以下模块进行介绍 1、华为的四个成长的重要阶段 2、华为团队管理核心理念精髓 3、灰度用人之法 4、灰度的评价 5、灰度高效组织体系 6、灰度选拔 7、灰度分钱:打破黑和白两个极端 1、什么是灰度文化? 灰度文化概括思维导图: 2、华为团队管理核心理念精髓 本章思维导图: 3、华为灰度用人之法 本章思维导图: 4、华为灰度的评价 本章思维导图: 5、华为灰度高效组织体系 本章思维导图: 6、华为灰度选拔 本章思维导图: 7、华为灰度分钱:打破黑和白两个极端 本章思维导图: 个人心得感想 为什么要有企业?企业的目的和本质又是什么? 企业是组织众多个人开展经济活动的一种方式,而公司是企业的组织形式。 目的:盈利 本质:代替市场交易机制的另外一种治理模式。 这种治理模式实质上是一种经济活动,经济活动通过价格机制来协调,而企业通过内部的协调来代替经济活动,从而让企业有可持续的超额的利润回报。 从这本书中不止一次提到的奋斗者这三个字,那到底什么才是真正的奋斗者?主要包含以下几点: 1、有使命感,有持续艰苦奋斗的精神 2、共享价值观,团队合作,群体奋斗 3、讲奉献,多付出,提出挑战性绩效目标,终生奋斗 4、有意愿、有能力、有业绩、有贡献、持续价值创造者 5、不断接受挑战,勇于自我批判,实现自我超越者 谈到这五点,可能在大多数人的脑海中会涌现出老板经常给他们说过似曾相识的话;可能大多数人都会认为老板说的话大多是在给员工画饼,没有实际的意义。 试想,咱们换个角度思考,如果自己是老板,招来的员工都是这样的心态,那么企业如何做大做强呢?员工的薪水和职位又如何能够往上走呢? 做了这么久的技术自媒体,杨工,您有什么感想要分享的吗? 技术总监,送给刚毕业的程序员们一句话——做好小事,才能成就大事 上海出差之行–领略外滩美景、RT-Thread总部之旅、嵌友面基、返程记录 软技能:读袁总分享< >之人人皆可成为卓越的领导! 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!