分类目录:摩登3官网注册

摩登3娱乐登录地址_三万字,100题!Linux知识汇总!

导读:本文整理了最新的Linux面试题,近3万字,约100道题,分享至此,希望对大家有帮助。 一、Linux 概述 1. 什么是Linux Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。 2. Unix和Linux有什么区别? Linux和Unix都是功能强大的操作系统,都是应用广泛的服务器操作系统,有很多相似之处,甚至有一部分人错误地认为Unix和Linux操作系统是一样的,然而,事实并非如此,以下是两者的区别。 1. 开源性Linux是一款开源操作系统,不需要付费,即可使用;Unix是一款对源码实行知识产权保护的传统商业软件,使用需要付费授权使用。 2. 跨平台性Linux操作系统具有良好的跨平台性能,可运行在多种硬件平台上;Unix操作系统跨平台性能较弱,大多需与硬件配套使用。 3. 可视化界面Linux除了进行命令行操作,还有窗体管理系统;Unix只是命令行下的系统。 4. 硬件环境Linux操作系统对硬件的要求较低,安装方法更易掌握;Unix对硬件要求比较苛刻,安装难度较大。 5. 用户群体Linux的用户群体很广泛,个人和企业均可使用;Unix的用户群体比较窄,多是安全性要求高的大型企业使用,如银行、电信部门等,或者Unix硬件厂商使用,如Sun等。 相比于Unix操作系统,Linux操作系统更受广大计算机爱好者的喜爱,主要原因是Linux操作系统具有Unix操作系统的全部功能,并且能够在普通PC计算机上实现全部的Unix特性,开源免费的特性,更容易普及使用! 3. 什么是 Linux 内核? Linux 系统的核心是内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。    系统内存管理    应用程序管理    硬件设备管理    文件系统管理 4. Linux的基本组件是什么? 就像任何其他典型的操作系统一样,Linux拥有所有这些组件:内核,shell和GUI,系统实用程序和应用程序。Linux比其他操作系统更具优势的是每个方面都附带其他功能,所有代码都可以免费下载。 5. Linux 的体系结构 从大的方面讲,Linux 体系结构可以分为两块: 用户空间(User Space) :用户空间又包括用户的应用程序(User Applications)、C 库(C Library) 。 内核空间(Kernel Space) :内核空间又包括系统调用接口(System Call Interface)、内核(Kernel)、平台架构相关的代码(Architecture-Dependent Kernel Code) 。 为什么 Linux 体系结构要分为用户空间和内核空间的原因? 1. 现代 CPU 实现了不同的工作模式,不同模式下 CPU 可以执行的指令和访问的寄存器不同。2. Linux 从 CPU 的角度出发,为了保护内核的安全,把系统分成了两部分。 用户空间和内核空间是程序执行的两种不同的状态,我们可以通过两种方式完成用户空间到内核空间的转移:1)系统调用;2)硬件中断。 6. BASH和DOS之间的基本区别是什么? BASH和DOS控制台之间的主要区别在于3个方面: 1. BASH命令区分大小写,而DOS命令则不区分;2. 在BASH下,/ character是目录分隔符,\作为转义字符。在DOS下,/用作命令参数分隔符,\是目录分隔符3. OS遵循命名文件中的约定,即8个字符的文件名后跟一个点,扩展名为3个字符。BASH没有遵循这样的惯例。 7. Linux 开机启动过程?     1、主机加电自检,加载 BIOS 硬件信息。    2、读取 MBR 的引导文件(GRUB、LILO)。    3、引导 Linux 内核。    4、运行第一个进程 init (进程号永远为 1 )。    5、进入相应的运行级别。    6、运行终端,输入用户名和密码。 8. Linux系统缺省的运行级别?      关机。     单机用户模式。     字符界面的多用户模式(不支持网络)。     字符界面的多用户模式。     未分配使用。     图形界面的多用户模式。     重启。 9. Linux 使用的进程间通信方式? 管道(pipe)、流管道(s_pipe)、有名管道(FIFO)。 信号(signal) 。 消息队列。 共享内存。 信号量。…

摩登3注册网站_ADI加大中国市场投资,成立亚德诺半导体(中国)有限公司

ADI公司今日宣布加大对中国市场的投资,将亚德诺半导体技术(上海)有限公司升级为亚德诺半导体(中国)有限公司,作为ADI在中国投资运营的总部型机构,这也是ADI在中国市场实施本土化战略的重要举措。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3注册网址_华为徐文伟:5.5G是无线通信产业的下一步

近日,华为董事、战略研究院院长徐文伟受邀在IEEE GLOBECOM 2020大会上发表了主题为“万物智联的未来愿景”的演讲。IEEE GLOBECOM年会是IEEE(电气电子工程师学会)的两个旗舰会议之一,是IEEE在通信领域的全球顶级学术会议,旨在共同探讨并致力于推动通信相关的全方位创新。 徐文伟在会上表示:“5.5G是无线通信行业的下一步愿景,以满足从万物互联到万物智联的需求”,并呼吁坚持学术多样性和开放性,继续开放升级、科研升级、合作升级,产业、学术界和研究机构持续共同协作,推动基础技术的发明和基础理论的突破。 (华为董事、战略研究院院长徐文伟) 5G的发展,短期看投资、中期看生态、长期看技术演进。5G在快速规模商用的过程中,产业和垂直行业的应用和需求,推动5G进一步升级扩展,提供更丰富的联接类型、更高的联接质量,“将人类社会从万物互联带入万物智联”。 “5.5G是无线通信产业的下一步”,徐文伟表示。5.5G愿景,是对5G场景的增强和扩展。首先是继续增强ITU所定义的eMBB、mMTC、URLLC三大标准场景。然后5.5G还要扩展3大新场景,包括上行超宽带UCBC(Uplink Centric Broadband Communication)、宽带实时交互RTBC(Real-time Broadband Communication)和通信感知融合HCS(Harmonized Communication and Sensing),把5G场景的“三角形”变成更为丰富的“六边形”。 徐文伟还阐述了5.5G发展的三个技术诉求,“5.5G来源于5G,需要兼容所有5G设备;5.5G需要实现sub-100GHz全频段按需灵活使用;5.5G需要与AI深度融合,实现Air Interface+AI、Network+AI、Service+AI,应对网络多样性需求、能耗管理等诉求。”

摩登3测速登录地址_简单实用!5分钟学会Vim分屏操作

Vim分屏功能是通过分割窗口来实现的,这 是提高工作效率的一大利器。无论我们想同时显示两个文件,或者同时显示一个文件的两个不同的位置,又或者并排比较两个文件,等等,这些都能通过分屏来实现,这样子很方便代码的比对和复制粘贴。 水平方向分屏打开新文件 :sp linuxmi.py 或者 :split linuxmi.py 这个命令把窗口横向切分为两个窗口,并把光标置于上面的窗口中。 垂直方向分屏打开新文件 :vsp linux.py :vsplit linux.py :sview linux.py ->只读分屏打开文件 另外,要打开窗口编辑一个新的文件时,可以用以下命令: :new 从命令行直接打开多个文件且是分屏 vim -On file1, file2 … ->垂直分屏 vim -on file1, file2 … ->水平分屏 linuxmi@linuxmi:~/www.linuxmi.com$ vim -O3 linux.py linuxmi.py linuxmi.cpp 注:-O垂直分屏,-o水平分屏,n表示分几个屏 实时调整当前窗口的宽度 ctrl-w > //向右加宽,默认值为1ctrl-w N > //向右加宽宽度Nctrl-w < // 同理 横屏/竖屏分屏打开当前文件 ctrl+w sctrl+w v 切换分屏 ctrl+w h,j,k,lctrl+w 上下左右键 crtl+w进行分屏窗口的切换 按完以后再按一个w crtl+w进行分屏窗口的切换 按完以后再按一个r 互换窗口 crtl+w进行分屏窗口的切换 按完以后再按一个c 关闭窗口 关闭分屏 关闭窗口有以下几个个命令: ctrl+W c 关闭当前窗口 ctrl+w q 关闭当前窗口,若只有一个分屏且退出vim :only 仅保留当前分屏:hide 关闭当前分屏 调整分屏的大小(宽度与高度) ctrl+w = 所有分屏都统一高度ctrl+w + 增加高度,默认值为1ctrl+w – 减少高度10 ctrl+w + 增加10行高度ctrl-w N + //当前屏高度加N 使用指定当前屏的调整高度: res[ize] N 示例: :resize 30 移动分屏 ctrl+W H,J,K,L 将屏幕移动到最顶端ctrl-w + K 将屏幕移动到最低端ctrl-w + J 将屏幕移动到最左边ctrl-w + H 将屏幕移动到最右边ctrl-w + L 总结: 由于平时使用Vim比较多,每次都要同时打开多个文件进行操作,打开多个会话又比较麻烦,所以专门学习了一下有关Vim的一些分屏技巧并记录此文章。 END 作者:Linux迷 来源:www.linuxmi.com/vim-fenping.html 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3注册网站_亚洲硅业开启科创板上市之路,拟募资15亿元扩大多晶硅产能

11月25日,亚洲硅业(青海)股份有限公司(以下简称“亚洲硅业”)申请科创板上市已获受理,平安证券为其保荐机构,亚洲硅业成为青海省第一家冲刺科创板的公司。 据招股书显示,亚洲硅业主营业务为多晶硅材料的研发生产、光伏电站的运营、电子气体的研发制造等,是光伏产业链的上游龙头,其主要客户有隆基股份、晶澳科技、中环股份等知名企业,后者均是A股当下炙手可热的标的。亚洲硅业本次拟发行股份不超过约8854.17万股,计划募集资金15亿元。公司将本次募集资金计划用于60000t/a 电子级多晶硅一期项目。 市场新秀?还是行业龙头? 亚洲硅业是全球领先的高纯多晶硅材料供应商之一,也是我国最早以现代化工艺进行多晶硅材料研发和生产的公司之一。公司主营业务包括多晶硅材料的研发生产、光伏电站的运营、电子气体的研发制造等。高纯多晶硅材料是光伏行业及半导体行业的基础材料,公司多晶硅材料目前主要应用于光伏行业。公司还正在积极进行半导体用多晶硅材料及电子气体的研究开发工作。其中,多晶硅材料的研发生产是公司的主要业务,占据营业收入的比重八成以上。 亚洲硅业的行业地位如何?据招股书,公司是国内首批进行自主工艺包设计并实现首次投产即以闭路循环工艺运行的现代化多晶硅材料技术研发和产品生产的企业。2019年,亚洲硅业多晶硅产量19,358.82吨,占全球多晶硅产量的3.8%,是全球多晶硅产能规模排名前十的企业,排在第8位。 作为国家绿色制造和智能制造双试点企业、国家循环经济试点企业,亚洲硅业通过开展高效节能精馏提纯、四氯化硅净化、还原炉余热利用等多项循环化改造和创新,年电耗降低40%、天然气消耗降低70%、废水排放降低67%、降低成本3.26亿元。在向数字化、智能化迈进的步伐中,亚洲硅业先后入围国家两化融合管理体系贯标试点企业,国家知识产权优势企业,全国“五一劳动”奖状单位。 在亚洲硅业的客户名单中,拥有一系列市场熟悉的公司:包括隆基股份、晶澳科技、中环股份、天合光能等。近年来,光伏领域“大牛股”隆基股份跃升为公司第一大客户。2018年、2019年、今年上半年,公司来自隆基股份的销售收入占比分别为20.09%、40.73%和69.72%。排第二的国网青海省电力公司也是公司的供应商,销售业务主要是光伏发电。 公开资料显示,高纯多晶硅材料是光伏及半导体行业的基础材料,从上述销售对象可看出,亚洲硅业多晶硅材料目前主要应用于光伏行业。当前半导体行业火热,对上游硅材料的需求日益增长,这一市场变化促使亚洲硅业积极开拓半导体用多晶硅材料的研发工作。而本次募投项目便是其在半导体业务方向的加码。但是这样的决定也是有风险的。 2017年至2019年,亚洲硅业的营业收入和净利润有所下滑。公司营收从2017年的16.9亿元下降至2019年的14.2亿元,净利润则从2017年的3.6亿元下滑至2019年的1.1亿元。亚洲硅业称,这主要由于受到多晶硅价格持续下降影响。 今年上半年公司业绩有所回升,营业收入为7.1亿元,净利润为0.6亿元。好消息是,目前多晶硅市场随着高成本、旧产能的逐渐停产,供需逐渐平衡,2020年7月开始价格在快速上扬,今年8月中旬,硅料价格一度达到了10万元/吨。对于多晶硅的价格,多位业内人士表示其波动较为频繁。亚洲硅业坦言,“公司经营业绩和盈利能力受多晶硅价格变动影响较大,虽然今年三季度开始,多晶硅价格上涨幅度较大,但是未来如果多晶硅价格再次大幅下降,公司将面临毛利率下降和经营业绩波动的风险。” 不过,根据中国有色金属工业协会硅业分会最新预测,“多晶硅市场供需关系已呈现逐步扭转的趋势,另考虑到2021年硅料供应增量远不及需求增量,因此根据相对明朗的供不应求预期,预计从12月份开始,下游将陆续进入备货阶段,多晶硅价格则逐步企稳。” 光伏产业是我国具有国际竞争优势的战略性、朝阳性产业。近年来,在政策引导和市场需求双轮驱动下,我国光伏产业快速发展,产业规模迅速扩大,产业链各环节市场占有率多年位居全球首位,已经成为世界上重要的光伏大国。作为国内首批自主工艺包设计并全封闭循环清洁生产的现代化多晶硅企业,亚洲硅业能否成功上市对市场影响较大,我们拭目以待。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3注册登录网_加强生产管理,黑湖智造助力企业降本增效

当前全球各国都将制造业放到非常重要的战略位置,智能制造已成为高端制造业竞争的主战场。我国高度重视智能制造发展,随着制造业智能化的升级改造,我国智能制造产业呈现较快的增长,到2020年产值规模将超27000亿元。 在政策的大力支持下,智能制造行业发展前景又将如何?行业难题又该如何解决?为此OFweek维科网有幸采访到了黑湖智造合伙人肖总,为我们深度解读“智造”的奥秘。 智能制造革新者——黑湖智造 黑湖智造的定位是一家致力于为制造业量身打造实时生产监控和通讯协同SaaS工具的企业。为自我革新的制造型企业提供基于移动端的实时数据协同、采集、呈现、监控和分析工具,提高其生产效率、降低制造成本,实现数据实时驱动决策。 黑湖智造在工厂内织了一张网,从上到下,从后到前,都可以使用黑湖智造的产品解决行业问题。举一个最简单的例子:原本的金属加工行业,各个环节间的衔接,通过纸质单据的填写与传递来完成,这样处理容易出现填错、污损或丢失等情况,并且难以快速统计。但基于黑湖的产品,企业则可以实现全生产链路的透明化管理,从客户下单到成品出厂,所有生产数据都可以通过手机或平板,被实时、准确地录入到系统中。 原本存在于工厂各角色间的信息不对称被打破,整体的协作效率也得到大大提升。不仅如此,管理者可通过数据快速定位生产瓶颈,及时调整和优化生产,选择更加适合的生产线,让企业充分利用产能,保障订单及时交期。 对于中大型工厂而言,凭借云端部署的优势,黑湖产品可以实现将数据快速复制到多个工厂,实现异地多厂协同,既能加强企业协调性,也能同步进度、方便管理。 畅快协作不仅仅在工厂内部发生,通过数据对接的方式,黑湖智造整合供应商、外协工厂以及消费端等多维度数据,进一步打通工厂、外协工厂、供应商、物流仓储、消费者之间的信息孤岛。并且将这些整体化、结构化、关系化的数据进行聚合处理,通过多维度数据的叠加分析,使库存、物流、生产等方面的协作更加高效。 在全国,黑湖智造已经服务了近千家大中小型制造业客户,涵盖食品、医药、化学制品、塑料、金属、电器等行业,其中华润集团、欧莱雅、中国兵器等都是黑湖智造的标杆用户。 在助力企业进行智能制造和数字化转型的过程中,黑湖智造帮助了许多客户,其中就有一家全球知名的连锁快餐品牌。作为全球最大的玩具经销商,该品牌每年通过旗下3.5万家门店向外输出超过15亿件玩具,而这些玩具均来自于分布在中国各地和越南的13家玩具厂商。 随着营销节奏的加快和品牌联动的日益流行,该品牌为保证每一批玩具能够准时上线全球门店,所以对供应商的交付能力特别看重。并且作为一个主打“儿童”市场的产品,它对玩具的安全和质量也提出了严格的要求。 在大多数工厂里,生产信息多以纸单和Excel表格的形式被记录,这就导致生产记录不准确成为玩具工厂内部管理遇到的第一个难题。人工填写的数据,天然存在错填和造假的风险,可靠性存疑。如果没有可靠的生产记录,厂家既无法准确掌握生产进度,也无法提供可追溯的生产信息。 另外,电子化生产信息记录的缺乏给产品追溯和质量管理方面也造成了一定的困难。在车间里,各工序质检人员通常采用手工纸单的方式记录检验数据,每天要写200多张纸质报告,之后由文员在第二天早上将几百份质检报告数据再录入到Excel中统计。这种方式既耗时耗力,又容易出错误,并且当遇到质量问题时,也很难定位问题产品出自哪家工厂的哪条产线,无法采取有针对性的措施。 该玩具厂对数字化升级的价值有较高认同基础,希望借助信息化部署加强生产管理。在新形势下多批次、小订单的个性化产品生产中,做到更严格的质量把控,同时降低自身成本。在深入了解不同类型的生产管理系统之后,玩具厂坚定不移地选择拥抱黑湖智造“云端制造协同系统”。 首先,黑湖智造“云端制造协同系统”拥有更好的用户体验和界面友好性。不同于定制化软件交付后不再更新的模式,黑湖智造“云端制造协同系统”通过持续更新迭代,以适配计算机操作系统、浏览器软件和 OFFICE 等办公软件的不断更新。系统页面能保持友好美观的同时,基本上不会发生由于不兼容而导致的按钮功能不正常,系统页面显示不正常等问题,大大减轻了信息化部门的维护成本。 在时间、经济和人力成本方面,黑湖智造“云端制造协同系统”性价比远远高于传统MES。凭借成熟的产品模块,黑湖智造“云端制造协同系统”可以在需求分析结束后直接进入搭建与测试阶段,省去了过去最为耗时费力的设计和代码编写工作,做到快速搭建、快速部署、快速上线。 由于有产品化功能模块和可视化系统搭建平台的存在,整个项目实施过程中基本不需要编程,并不需要具备很强技术功底的开发人员参与其中,降低了整个项目建设的人力成本。得益于可视化、配置化的系统搭建平台的理念,黑湖智造“云端制造协同系统”的90%日常维护都可以由企业信息化系统管理员自主完成,大大减少相应费用。 针对长期发展中出现的新的管理需求,企业信息化人员也可以在黑湖智造“云端制造协同系统”内自主实现,,大大节省了维护成本。一方面,企业信息化人员经过培训后,可以自主完成对大多数流程和表单内容的调整,节省了很大一部分由需求变更所产生的开发费用。另一方面,黑湖智造“云端制造协同系统”会定期对产品功能进行更新迭代,如果已购买了此模块的功能,后期可免费享受系统更新迭代带来的红利。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3主管554258:_面试必备!常见的C语言字符串操作

#字符串倒序输出 实现逻辑,通过strlen获取字符串长度,然后通过 len/2 进行交叉赋值,这里需要注意,不需要考虑len是奇数还是偶数的问题。 如果len是奇数,最后一个字符就不需要倒序,如果是偶数,最后两个字符就倒序。 #include "stdio.h"void rechange_str(char *str){ int i, len; char tmp; if (NULL == str) {  return ; } len = strlen(str); for (i = 0; i < len/2; i ++) {  tmp = str[i];  str[i] = str[len-i-1];  str[len-i-1] = tmp; }}int main(void){ char str[20] = "hello,world"; printf("%s\n",str); rechange_str(str); printf("%s\n",str); return (0);}  程序输出 hello,worlddlrow,olleh--------------------------------Process exited after 0.02841 seconds with return value 0请按任意键继续. . . #整型转字符串 实现逻辑,每个整数看其转换进制,从个位到十位百位都可以通过%操作加上/操作获得,再用一个字符数组保存0-F。 用个位数对应值转为字符,注意转换出的字符串是反向的,还要考虑传入的若是负数如何处理,再用翻转字符串完成最后整个操作 下面这段代码需要好好研究一下,最好自己运行试试。 #include "stdio.h"char *sky_itoa(int value, char *str, unsigned int radix){ char list[] = "0123456789ABCDEF"; unsigned int tmp_value; int i, j, k; if (NULL == str) {  return NULL; } if (2 != radix && 8 != radix && 10 != radix && 16 != radix) {  return NULL; } i = 0; k = 0; if (radix == 10 && value < 0) {  tmp_value = (unsigned int)(0 - value);  str[i++] = '-';  k = 1; } else {  tmp_value = (unsigned int)value; } do {  str[i++] = list[tmp_value%radix];  tmp_value /= radix; } while(tmp_value); str[i] = '\0'; //翻转 char tmp; for (j = k; j < (i+k)/2; j++) {  tmp = str[j];  str[j] = str[i+k-j-1];  str[i+k-j-1] = tmp; } return str;}int main(void){ int a = 1254545; char str[100] ={0}; printf("%s\n",sky_itoa(a,str,2)); printf("%s\n",sky_itoa(a,str,8)); printf("%s\n",sky_itoa(a,str,10)); printf("%s\n",sky_itoa(a,str,16)); return (0);}  程序输出 10011001001001001000146222211254545132491--------------------------------Process exited after 0.02963 seconds with return value 0请按任意键继续. . . #字符串复制 实现逻辑,逐个赋值直到遇到’\0’停止即可 #include "stdio.h"char *sky_strcpy(char *dst, const char *str){ if (NULL == dst ||  NULL == str) {  return NULL; } char *ret = dst; while (*str != '\0') {  *dst ++ = *str ++; } return ret; } int main(void){ char str_1[100] = "hello,world"; char str[100] ={0}; sky_strcpy(str,str_1); printf("str_1:%s\n",str_1); printf("str:%s\n",str); return (0);}  程序输出 str_1:hello,worldstr:hello,world--------------------------------Process exited after 0.03334 seconds with return value 0请按任意键继续. . . #字符串比较 1、正常比较是否相同 实现逻辑,判断字符串长度是否相同,若相同逐个比较字符是否相同 #include "stdio.h"int sky_strcmp(char *dst, char *str){ int i, len; if (NULL == dst || NULL == str) {  return 0; } if (strlen(dst) != strlen(str)) {  return 0; } len = strlen(dst); for (i = 0; i < len; i++) {  if (*dst++ != *str++) {   return 0;  } } return 1;} int main(void){ char str_1[100] = "hello,world"; char str_2[100] = "hello,world"; char str[100] = "adfs";  printf("%d\n",sky_strcmp(str_1,str)); printf("%d\n",sky_strcmp(str_1,str_2)); return (0);}  程序输出 01--------------------------------Process exited after 0.02802 seconds with return value 0请按任意键继续. . . 2、忽略大小写字符串比较 实现逻辑,在比较字符时可以将其统一转换为大写或小写,然后再进行比对即可,和正常对比无其他不同  #include "stdio.h"  #define CONVERT(c) (((c) >= 'A' && (c) <= 'Z') ? ((c) - 'A' + 'a') : (c)) int sky_strcmp(char *dst, char *str) {  int i, len;  if (NULL == dst || NULL == str) {   return 0;  }  if (strlen(dst) != strlen(str)) {   return 0;  }  len = strlen(dst);  for (i = 0; i < len; i++) {   if (CONVERT(*dst) != CONVERT(*str)) {    return 0;   }   dst ++;   str ++;  }  return 1; }   int main(void) {  char str_1[100] = "heLlo,world";  char str_2[100] = "hello,world";  char str[100] = "adfs";    printf("%d\n",sky_strcmp(str_1,str));  printf("%d\n",sky_strcmp(str_1,str_2));  return (0); }  程序输出 01--------------------------------Process exited after 0.04624 seconds with return value 0请按任意键继续. . . #memcpy函数实现 实现逻辑,主要就是逐个赋值即可完成  1、不考虑拷贝覆盖问题 #include "stdio.h"#include "string.h"void *sky_memecpy(void *dst, const void *str, int n){ if (NULL == dst || NULL == str || n <= 0) {  return NULL; } char *pdst = (char *)dst; char *pstr = (char *)str; while (n --) {  *pdst ++ = *pstr ++; } return dst;}int main(void){ char str_1[100] = "heLlo,world"; char str_2[100] = "sdfsdfs"; sky_memecpy(str_2,str_1,strlen(str_1)); printf("%s\n",str_2); return (0);}  程序输出 heLlo,world--------------------------------Process exited after 0.02516 seconds with return value 0请按任意键继续. . . 2、考虑拷贝覆盖问题 拷贝覆盖是我们在拷贝字符串的时候需要注意的一个问题,我下面的示例程序,使用第一个函数的时候,就出现了问题,使用第二个函数就没有出现问题。 原因是,我们源字符串和目的字符串的地址都是一样的,我们希望把字符串往后移动一个位置,但是实际上出现了问题。  #include "stdio.h" #include "string.h"  void *sky_memecpy_1(void *dst, const void *str, int n) {  if (NULL == dst || NULL == str || n <= 0) {   return NULL;  }  char *pdst = (char *)dst;  char *pstr = (char *)str;  while (n --) {   *pdst ++ = *pstr ++;  }  return dst; }  void *sky_memecpy(void *dst, const void *str, int n) {  if (NULL == dst || NULL == str || n <= 0) {   return NULL;  }  char *pdst = (char *)dst;  char *pstr = (char *)str;     if (pdst > pstr && pdst < pstr + n) {   pdst = pdst + n - 1;   pstr = pstr + n - 1;   while (n --) {    *pdst -- = *pstr --;   }  } else {   while (n --) {    *pdst ++ = *pstr ++;   }  }  return dst; }  int main(void) {  char str_1[100] = "heLlo,world";  char str_2[100] = "heLlo,world";  sky_memecpy_1(str_1+1,str_1,strlen(str_1));  printf("%s\n",str_1);    sky_memecpy(str_2+1,str_2,strlen(str_2));  printf("%s\n",str_2);  return (0); }  程序输出 hhhhhhhhhhhhhheLlo,world--------------------------------Process exited after 0.02773 seconds with return value 0请按任意键继续. . . 针对上面的拷贝覆盖问题,单独写了一个测试程序 #include "stdio.h"#include "string.h"void *sky_memecpy(void *dst, const void *str, int n){ if (NULL == dst || NULL == str || n <= 0) {  return NULL; } char *pdst = (char *)dst; char *pstr = (char *)str; while (n --) {  printf("dst:%c--->str:%c\n",*pdst,*pstr);  *pdst ++ = *pstr ++; } return dst;}int main(void){ char str_1[100] = "heLlo,world"; sky_memecpy(str_1+1,str_1,strlen(str_1)); printf("%s\n",str_1); return (0);}  程序输出 dst:e--->str:hdst:L--->str:hdst:l--->str:hdst:o--->str:hdst:,--->str:hdst:w--->str:hdst:o--->str:hdst:r--->str:hdst:l--->str:hdst:d--->str:hdst: --->str:hhhhhhhhhhhhh--------------------------------Process exited after 0.02575 seconds with return value 0请按任意键继续. . . 初始的时候,dst指向 e 字符,str 指向h 字符,然后每次都是dst先移动,str再移动,就出现了dst被h字符所覆盖。 好了,就这些内容,希望大家好好消化,这些代码对面试很有帮助。 END 来源:嵌入式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新闻554258:_交织型ADC到底是个啥?今天咱们就科普一下~

点击蓝字进入亚德诺半导体,然后右上角“设为星标”吧~ 在当今的许多细分市场,交错式模数转换器(ADC)在许多应用中都具有多项优势。在通信基础设施中,存在着一种推动因素,使ADC的采样速率不断提高,以便支持多频段、多载波无线电,除此之外满足DPD(数字预失真)等线性化技术中更宽的带宽要求。在军事和航空航天领域,采样速率更高的ADC可让多功能系统用于通信、电子监控和雷达等多种应用中——此处仅举数例。工业仪器仪表应用中始终需要采样速率更高的ADC,以便充分精确地测量速度更高的信号。 首先,一定要准确地了解交织型ADC是什么。要了解交错,最好了解一下实际发生的情况以及它是如何实现的。有了基本的了解后,再讨论交错的好处。当然,我们都知道,天下没有免费的午餐,因此需要充分评估和验证交织采样相关的技术难点。 关于交错 若ADC为交错式,则两个或两个以上具有固定时钟相位差关系的ADC用来同步采样输入信号,并产生组合输出信号,使得采样带宽为单个ADC带宽的数倍。利用m个ADC可让有效采样速率增加m倍。为简便起见并易于理解,我们重点考察两个ADC的情况。这种情况下,如果两个ADC的每一个采样速率均为fS, 且呈交错式,则最终采样速率为2× fS。这两个ADC必须具有确定的时钟相位差关系,才能正确交错。时钟相位关系由等式1给出,其中:n是某个特定的ADC,m是ADC总数。 举例而言,两个ADC采样速率均为100 MSPS且呈交错式,因此采样速率为200 MSPS。此时,等式1可用来推导出两个ADC的时钟相位关系,如等式2和等式3。 注意,如果已知时钟相位关系,便可确定不同量化值的组合输出。图1以图形说明时钟相位关系,以及两个100 MSPS交织型ADC的样本结构。注意180°时钟相位关系,以及样本是如何交 错的。输入波形也可由两个ADC进行采样。在这种情况下,采用经过2分频的200 MHz时钟输入,并所需的时钟相位发送至每个ADC,便可实现交错。 图1. 两个交错式100 MSPS ADC—基本原理图。 此概念还可以另一种方式表达,如图2所示。通过将这两个100MSPS ADC以交错方式组合,采样速率便能增加至200 MSPS。这样每个奈奎斯特区可以从50 MHz扩展到100 MHz,使工作时的可 用带宽翻倍。增加的工作带宽可为多个市场领域的应用带来诸多优势。无线电系统可以增加其支持的频段数;雷达系统可以增加空间分辨率;而测量设备可以实现更高的模拟输入带宽。 图2. 两个交错式100 MSPS ADC—时钟和样本。 交错的优势 交错结构的优势可惠及多个细分市场。交织型ADC最大好处是增加了带宽,因为ADC的奈奎斯特带宽更宽了。同样,我们举两个100 MSPS ADC交错以实现200 MSPS采样速率的例子。图3显示通过交错两个ADC,可以大幅增加带宽。这为多种应用场景产生了诸多收益。就像蜂窝标准增加了通道带宽和工作频段数一样,对ADC可用带宽的要求也越来越高。此外,在军事应用中,需要更好的空间识别能力以及增加后端通信的通道带宽,这些都要求ADC提供更高的带宽。由于这些领域对带宽的要求越来越高,因此需要准确地测量这些信号。因此,为了正确地获取和测量这些高带宽信号,测量设备也需要更高的带宽。很多设计中的系统要求其实领先于商用ADC技术。交错结构可以弥补这一技术差距。 图3. 两个交织型ADC——奈奎斯特区。 增加采样速率能够为这些应用提供更多的带宽,而且频率规划更轻松,还能降低通常在ADC输入端使用抗混叠滤波器时带来的复杂性和成本。面对这些优势,大家一定想知道需要为此付 出什么代价。就像大多数事情一样,天下没有免费的午餐。交织型ADC具有更高的带宽和其他有用的优势,但在处理交织型ADC时也会带来一些挑战。 交错挑战 在交错组合ADC时存在一些挑战,还有一些注意事项。由于与交错ADC相关的缺陷,输出频谱中会出现杂散。这些缺陷基本上是两个正在交错的ADC之间不匹配。输出频谱中的杂散导致的基本不匹配有四种。包括失调不匹配、增益不匹配、时序不匹配和带宽不匹配。 其中最容易理解的可能是两个ADC之间的失调不匹配。每个ADC都会有一个相关的直流失调值。当两个ADC交错并在两个ADC之间来回交替采样时,每个连续采样的直流失调会发生变化。图4 举例说明了每个ADC如何具有自己的直流失调,以及交错输出如何有效地在这两个直流失调值之间来回切换。输出以fS/2的速率在这些失调值之间切换,将导致位于fS/2的输出频谱中产生杂散。由于不匹配本身没有频率分量,并且仅为直流,因此出现在输出频谱中的杂散频率仅取决于采样频率,并将始终出现fS/2在2频率下。杂散的幅度取决于ADC之间失调不匹配的幅度。不匹配值越大,杂散值就越大。为了尽可能减少失调不匹配导致的杂散,不需要完全消除每个ADC中的直流失调。这样做会滤除信号中的所有直流成分,不适合使用零中频(ZIF)架构的系统,该架构信号成分复杂,DC量实际是有用信号。相反,更合适的技术是让其中一个ADC的失调与另一个ADC匹配。选择一个ADC的失调作为基准,另一个ADC的失调设置为尽可能接近的值。失调值的匹配度越高,在fS/2产生的杂散就越低。 图4. 失调不匹配。 交错时要注意的第二个不匹配是ADC之间的增益不匹配。图5显示了两个交错式转换器之间的增益不匹配。在这种情况下,有一个不匹配频率分量。为了观察这种不匹配,必须向ADC施加 信号。对于失调不匹配,无需信号即可查看两个ADC的固有直流失调。对于增益不匹配,如果不存在信号,就无法测量增益不匹配,因而无法了解增益不匹配。增益不匹配将会产生与输入频率和采样速率相关的输出频谱杂散,出现在fS/2 ± fIN处。为了最大程度地降低增益不匹配引起的杂散,采用了与失调不匹配类似的策略。选择其中一个ADC的增益作为基准,另一个ADC的增益设置为尽可能接近的值。每个ADC增益值的匹配度越高,输出频谱中产生的杂散就越小。 图5. 增益不匹配。 接下来,我们必须探讨两个ADC之间的时序不匹配。时序不匹配有两个分量:ADC模拟部分的群延迟和时钟相位偏差。ADC中的模拟电路具有相关的群延迟,两个ADC的群延迟值可能不同。此外还有时钟偏斜,它也包括两个分量:各ADC的孔径不确定性和一个与输入各转换器的时钟相位精度相关的分量。图6以图形说明ADC时序不匹配的机制和影响。与增益不匹配杂散相似,时序不匹配杂散也与输入频率和采样速率呈函数关系,出现在fS/2 ± fIN处。 图6. 时序不匹配 为了尽可能降低时序不匹配引起的杂散,需要利用合适的电路设计技术使各转换器模拟部分的群延迟恰当匹配。此外,时钟路径设计必须尽量一致以使孔径不确定性差异最小。最后,必须精确控制时钟相位关系,使得两个输入时钟尽可能相差180°。与其他不匹配一样,目标是尽量消除引起时序不匹配的机制。 最后一个不匹配可能最难理解和处理:带宽不匹配。如图7所示,带宽不匹配具有增益和相位/频率分量。这使得解决带宽不匹配问题变得更为困难,因为它含有另外两个不匹配参数的分量。然而,在带宽不匹配中,我们可在不同的频率下看到不同增益值。此外,带宽具有时序分量,使不同频率下的信号通过每个转换器时具有不同的延迟。出色的电路设计和布局布线实践是减少ADC间带宽失配的最好方法。ADC之间的匹配越好,则产生的杂散就越少。正如增益和时序不匹配会导致在输出频谱的fS/2 ± fIN处产生杂散一样,带宽不匹配也会在相同频率处产生杂散。 图7. 带宽不匹配。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!