摩登3平台登录_干货分享!状态机思路在嵌入式开发中的应用详解

状态机的概念 状态机是软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。 比如说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态;再触发另一个键后切换到C状态,或者返回到A状态。这就是最简单的按键状态机例子。实际的按键解析程序会比这更复杂些,但这不影响我们对状态机的认识。 进一步看,击键动作本身也可以看做一个状态机。一个细小的击键动作包含了:释放、抖动、闭合、抖动和重新释放等状态。 同样,一个串行通信的时序(不管它是遵循何种协议,标准串口也好、I2C也好;也不管它是有线的、还是红外的、无线的)也都可以看做由一系列有限的状态构成。 显示扫描程序也是状态机;通信命令解析程序也是状态机;甚至连继电器的吸合/释放控制、发光管(LED)的亮/灭控制又何尝不是个状态机。 当我们打开思路,把状态机作为一种思想导入到程序中去时,就会找到解决问题的一条有效的捷径。有时候用状态机的思维去思考程序该干什么,比用控制流程的思维去思考,可能会更有效。这样一来状态机便有了更实际的功用。 程序其实就是状态机。 也许你还不理解上面这句话。请想想看,计算机的大厦不就是建立在“0”和“1”两个基本状态的地基之上么? 状态机的要素 状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下: 现态 是指当前所处的状态。 条件 又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。 动作 条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。 次态 条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。 如果我们进一步归纳,把“现态”和“次态”统一起来,而把“动作”忽略(降格处理),则只剩下两个最关键的要素,即:状态、迁移条件。 状态机的表示方法有许多种,我们可以用文字、图形或表格的形式来表示一个状态机。 纯粹用文字描述是很低效的,所以就不介绍了。接下来先介绍图形的方式。 状态迁移图(STD) 状态迁移图(STD),是一种描述系统的状态、以及相互转化关系的图形方式。状态迁移图的画法有许多种,不过一般都大同小异。我们结合一个例子来说明一下它的画法,如图1所示。 图1状态迁移图 状态框 用方框表示状态,包括所谓的“现态”和“次态”。 条件及迁移箭头 用箭头表示状态迁移的方向,并在该箭头上标注触发条件。 节点圆圈 当多个箭头指向一个状态时,可以用节点符号(小圆圈)连接汇总。 动作框 用椭圆框表示。 附加条件判断框 用六角菱形框表示。 状态迁移图和我们常见的流程图相比有着本质的区别,具体体现为:在流程图中,箭头代表了程序PC指针的跳转;而在状态迁移图中,箭头代表的是状态的改变。 我们会发现,这种状态迁移图比普通程序流程图更简练、直观、易懂。这正是我们需要达到的目的。 状态迁移表 除了状态迁移图,我们还可以用表格的形式来表示状态之间的关系。这种表一般称为状态迁移表。 表1就是前面介绍的那张状态迁移图的另一种描述形式。 表1状态迁移表 采用表格方式来描述状态机,优点是可容纳更多的文字信息。例如,我们不但可以在状态迁移表中描述状态的迁移关系,还可以把每个状态的特征描述也包含在内。 如果表格内容较多,过于臃肿不利于阅读,我们也可以将状态迁移表进行拆分。经过拆分后的表格根据其具体内容,表格名称也有所变化。 比如,我们可以把状态特征和迁移关系分开列表。被单独拆分出来的描述状态特征的表格,也可以称为“状态真值表”。这其中比较常见的就是把每个状态的显示内容单独列表。这种描述每个状态显示内容的表称之为“显示真值表”。同样,我们把单独表述基于按键的状态迁移表称为“按键功能真值表”。另外,如果每一个状态包含的信息量过多,我们也可以把每个状态单独列表。 由此可见,状态迁移表作为状态迁移图的有益补充,它的表现形式是灵活的。 状态迁移表优点是信息涵盖面大,缺点是视觉上不够直观,因此它并不能取代状态迁移图。比较理想的是将图形和表格结合应用。用图形展现宏观,用表格说明细节。二者互为参照,相得益彰。 状态机思路实现一个时钟程序 接下来,我将就状态机的应用,结合流程图、状态迁移图和状态迁移,举一个实际例子。下面这张图是一个时钟程序的状态迁移图,如图2所示。 图2时钟程序状态迁移图 把这张图稍做归纳,就可以得到它的另一种表现形式——状态迁移表,如表2所示。 表2时钟程序状态迁移表 状态机应用的注意事项 基于状态机的程序调度机制,其应用的难点并不在于对状态机概念的理解,而在于对系统工作状态的合理划分。 初学者往往会把某个“程序动作”当作是一种“状态”来处理。我称之为“伪态”。那么如何区分“动作”和“状态”。本匠人的心得是看二者的本质: “动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了; 而“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。 初学者的另一种比较致命的错误,就是在状态划分时漏掉一些状态。我称之为“漏态”。 伪态和漏态 这两种错误的存在,将会导致程序结构的涣散。因此要特别小心避免。 前面介绍的是一种简单的状态结构。它只有一级,并且只有一维,如图3所示。 图3 线性状态机结构 如果有必要,我们可以建立更复杂的状态机模型。 多级状态结构 状态机可以是多级的。在分层的多级状态机系统里面,一个“父状态”下可以划分多个“子状态”,这些子状态共同拥有上级父状态的某些共性,同时又各自拥有自己的一些个性。 在某些状态下,还可以进一步划分子状态。比如,我们可以把前面的时钟例子修改如下: 把所有和时钟功能有关的状态,合并成1个一级状态。在这个状态下,又可以划分出3个二级子状态,分别为显示时间、设置小时、设置分钟; 同样,我们也可以把所有和闹钟功能有关的状态,合并成1个一级状态。在这个状态下,再划分出4个二级子状态,分别为显示闹钟、设置“时”、设置“分”、设置鸣叫时间。 我们需要用另一个状态变量(寄存器)来表示这些子状态。 子状态下面当然还可以有更低一级的孙状态(子子孙孙无穷尽也),从而将整个状态体系变成了树状多级状态结构,如图4所示。 图4树状多级状态结构 多维状态结构 状态结构也可以是多维的。从不同的角度对系统进行状态的划分,这些状态的某些特性是交叉的。比如,在按照按键和显示划分状态的同时,又按照系统的工作进程做出另一种状态划分。这两种状态划分同时存在,相互交叉,从而构成了二维的状态结构空间。 举一个这方面的例子,如:空调遥控器,如图5所示。 图5多维状态机结构 同样,我们也可以构建三维、四维甚至更多维的状态结构。每一维的状态都需要用一个状态变量(寄存器)来表示。 无论多级状态结构和多维状态结构看上去多么迷人,匠人的忠告是:我们依然要尽可能地简化状态结构,能用单级、单维的结构,就不要给自己找事,去玩那噩梦般的复杂结构。 简单的才是最有效的。 End  微信搜一搜 点分享 点点赞 点在看 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3内部554258_荣耀与微软签署全球PC合作协议,Windows 10成为荣耀笔记本电脑官方操作系统

【2020年12月24日】今日,知名科技品牌荣耀宣布与微软签署全球合作协议。荣耀将在全球范围内采用微软Windows 10作为荣耀笔记本电脑官方操作系统。Windows 10 是全球最受欢迎的Windows 操作系统,在 Windows 10 的支持下,荣耀笔记本电脑将在办公、学习、生活、娱乐等全场景为消费者提供更出色的用户体验。 荣耀CEO赵明先生表示:“荣耀很高兴与微软达成全球范围内的合作,通过主流的操作系统和技术,给消费者带来设计卓越、性能强大、体验一流的PC产品。荣耀坚持以消费者为核心,持全面开放的态度和全球产业链合作伙伴一起创造属于每个人的智慧新世界。” 微软大中华区OEM事业部总经理黄逸群先生表示:“Windows 10 是一个多元且强大的平台,为我们的 OEM 合作伙伴提供了向世界输出创意的灵活工具。微软希望通过Windows 10平台,予力OEM 合作伙伴们不断推出创新产品,把最新技术推送给用户,让他们无论何时何地都能去创造、学习和沟通。” 荣耀一如既往地重视对研发和前瞻性技术的投入,坚持把品质、创新和服务作为战略控制点,为全球消费者带来领先和创新的产品及体验。 2021年1月,搭载微软Windows 10和英特尔 Core i5处理器的荣耀笔记本电脑MagicBook Pro,将继中国市场热销后登陆海外市场,为海外消费者带来耳目一新的创新体验。 MagicBook Pro采用酷炫而雅致的金属机身,90%以上的超高屏占比和三面4.9mm的微边框设计,带来宽广的视野和强大的全屏生产力;沉浸式环绕立体声音效,配合对称的双扬声器设计,带来观影、游戏时身临其境的畅快体验;指纹电源二合一,开机登录一步到位,超大触控板让操控更加准确自如;多屏协同再升级,电脑手机之间实现无感连接,电脑可直接打开手机上的文件,带来生产力的直线提升;连续11小时工作的绝佳续航能力,轻松为多线程、多任务的高负荷运载保驾护航。MagicBook Pro的全屏生产力,让工作生活的每个瞬间都更加高效、畅快。 与此同时,荣耀下一代MagicBook系列产品也将于2021年1月在中国首发。请随时关注荣耀中国官网及“荣耀智慧生活”官方微博,了解更多荣耀与微软等合作伙伴相关动态。

摩登3新闻554258:_超级干货!开关电源的电磁干扰(EMI)防制技术

电源产品在做验证时,经常会遭遇到电磁干扰(EMI)的问题,有时处理起来需花费非常多的时间,许多工程师在对策电磁干扰时也是经验重于理论,知道哪个频段要对策那些组件,但对于理论上的分析却很欠缺。 笔者从事开关电源设计多年,希望能借由之前对策的经验与相关理论基础做个整理,让目前正从事或未来想从事开关电源设计的人员对电磁干扰防制技术能有初步的认识。 开关电源的电磁干扰测试可分为传导测试与辐射测试,一般开关电源的传导测试频段是指150K~30MHz之间,而辐射干扰的频段是指30M~300MHz,300MHz之后的频段一般皆不是电源所产生,因此大都可以给予忽略。 下面内容章节包括开关电源的传导测试法规,测试与量测方式,基本概念,抑制传导干扰的滤波器设计,布线与变压器设计等章节。 02 传导测试的法规 传导的法规因产品别的不同,其所适用之条文亦不同,一般是使用欧洲的EN-55022或是美国的FCC part15来定义其限制线,又可以区分为CLASS A与CLASS B两种标准,CLASS A为产品在商业与工业区域使用,CLASS B为产品在住宅及家庭区域使用,笔者所设计的产品为3C的家用电源,传导测试频段为150K~30MHz,在产品测试前请先确认申请的安规为何,不同的安规与等级会有不同的标准线。 图1举例为EN-55022 CLASS B的限制线图,红色线为准峰值(QP, Quasi-peak)的限制线,粉红色为平均值(AV, Average)的限制线,传导测试最终的目的,就是测试的机台可以完全的低于其限制线,不论是QP值或AV值; 一般在申请安规时,虽然只有在限制线下方即可申请,但多数都会做到低于2dB的误差以预防测试场地不同所导致的差异,而客户端有时会要求必须低于4~6dB来预防产品大量生产后所产生的误差。 图1 图2 图2为一量测后的例子,一般量测时都会先用峰值量测,因峰值量测是最简单且快速的方法,量测仪器以9KHz为一单位,在150K~30MHz之间用保持最大值(maximum hold)的方式来得到传导的峰值读值,用此来确认电源的最大峰值然后再依此去抓最高峰值的实际QP,AV值来减少扫描时间,图2的蓝色曲线为准峰值的峰值量测结果,一般在峰值量测完后会再对较高的6个频率点做准峰值(QP)与平均值(AV)的量测,就如同图2所标示。 峰值与准峰值的差别在于:峰值量测是不论时常出现或是偶尔出现的信号皆被以最大值的方式置在接收器的读值中,而准峰值量测是指在一时间内取数次此频段的脉冲信号,若某频率的信号在一段时间内重复出现率较高,才会得到较高之量测值;平均值则是对此频段的振幅取平均值,典型的频谱分析仪可将带宽设定在30Hz左右来得到最真实的平均信号。 QP与AV相较于峰值,其侦测值必然较低,若一开始的峰值量测已有足够的余度则不用再做单点的QP和AV量测。 现在的IC为了EMI传导的防制,在操作频率上都会做抖频的功能,像是IC主频为65KHz,但在操作时会以65KHz正负6K做变化,借此来将差模倍频的信号打散,不会集中在单一根频率上,如果没有抖频功能,差模干扰在主频的倍频时会呈现单根很扎实的QP与AV,如同图2的157KHz,仪器看到的峰值满高的,但读起来还仍有9dB以上的余度。 03  传导的测试与量测方式 图3为测试传导的参考图示,此为通嘉内部的传导设备图示,待测物接仿真负载后放于桌面上,经由一输入线材(AC cable)连接LISN(线性阻抗稳定网络)与待测物,再将LISN的信号接至接收器,输入线材不得与地面接触,而待测物的负载需与待测物距离10公分,若周边需接电源时,其电源需接独立电源,不得与待测物使用相同电源,若电源为2PIN输入,则输出负载需接地以仿真系统下地。 LISN(线性阻抗稳定网络)内部线路如图4所示,输入电源来源由左边进入LISN后,经由LF与CF来滤除电源的低频噪声,并由耦合电容CC与侦测电阻RSL/RSN来取得高频信号Vsn,再将此信号经接受器或频谱分析仪来得到其振幅的大小(dBuV)。 图3 图4 请记得输入线材不得与地面接触,笔者曾有过输入线材与地面接触与否,读值差了10dB左右的经验;另外,周边仪器的电源需使用干净且与主电源隔离的电源,否则很容易因共地而产生共模干扰,许多测试场地会直接拿一个延长线去使用外接电源给予周边,但此种方式仍有可能因共地而被干扰,若能使其接至另一个LISN是个较好的方式,因LISN内有LF与CF可作信号隔离。 04 对策EMI传导的基本概念 4.1 差模(Differential mode)信号与共模(Common mode)信号 传导量测接法如图5、图6所示,是由接收器量测L/N/GND之间的频率与振幅大小而成,而信号存在于L与N之间的叫差模信号,如图5所示;而信号存在于L与FG或N与FG之间的叫共模信号,如图6所示,也可以说与FG形成回路的就叫共模信号。 一般电源的输入来源皆是取自L与N,因此在电源的电磁干扰设计中,差模成份的抑制极为重要,尤其是前频段150K~1MHz大多是由开关电源的主频与倍频出来的差模干扰。 图5 图6 图7为一未对策前的传导测试结果,前端为IC的操作频率所引起的倍频差模干扰加上本体的共模干扰所形成,由图形可看出每根峰值之间的频率为100KHz,可判断此IC的操作频率为100KHz,而测量的读值是呈现由IC 100KHz的倍频做线性衰减,因此每100KHz就有一根因IC操作频率所造成的差模干扰信号,也可以说在前频段时,共模信号呈线性平面下降,而差模信号则迭加在共模的上方。 图7 图8为相同的机台在对策后测试结果,在对策后最差都还有6dB以上的余度,已可符合多数的客户要求。 一般在测试时,必须测试L与N两项,一般L与N的读值不会差异太大,若差异很大一般都是某项的共模能量较强所致。 测试的输入电压则是看申请的安规来决定,一般是用110V与230V来做高低压量测;另外,产品在确认传导测试时皆需要做长时间的烧机,有时会因烧机后磁性组件过热导致感量异常而让EMI变差。 图8 4.2 电磁干扰,电场干扰与磁场干扰 电磁干扰(EMI, Electrical Magnetic Interference)可分为电场干扰与磁场干扰两种,电场与磁场是两种不同的性质,但两者之间的能量是会互相影响的,随时间变化的电场会产生磁场,而随时间变化的磁场也会产生电场,这些不断同相振荡的电场和磁场共同的形成了电磁干扰(电磁波)。 一般对于电场,我们可以用下面的电荷公式与电容公式来作解释, 简单来说,任何的导体在电场下都可等效成一个带电的电容,其容值随着与周边另一个导体之间的距离/表面积/介质不同而有差异;如图9为两导体之间的电容图示,绿色导体与蓝色导体所等效的电容如图10所示,根据电容公式,容值会因两导体之间的距离愈远而变小,也会因两导体之间的截面积愈大而增大,而两导体之间的介质(介电系数)也会影响容值的大小。 图9 图10 当电容二端的电位在时间之内存在一电压差时,则会根据电荷公式(电压/时间的变化,如图12)而产生一电流,如图11红色箭头所示,而任何产生的电流必需经由另一路径回到自己出发时的位置而形成一电流回路,如棕色虚线箭头所示,此因电压变动造成的电流回路就会引起电场干扰。 图11 图12 因此,改善电场干扰的方式,就是减少其回路电流的方法, 根据上面两个公式,我们可以借由将耦合电容减小,像是减少两个导体之间接触的面积/增加其距离/变更中间的介质等方式来减少电容效应,或是减小电压差或时间变化率来减少电场感应。 而对于磁场,我们可用安培右手/法拉第定律 来解释,当导体有电流流过时,在其周围就会依安培右手定律产生磁力线,如图13所示,因电流不可能单独存在,电流一定存在于回路之中,凡是电流流过的路径都会产生磁力线,而在一般的PCB板设计中(如图14所示),当电容形成一个电流回路时就会产生如虚线的磁力线,而磁力线经过的导体会因此产生感应电势,此即为磁场干扰。 图13 图14 尤其是电流流经的导体在没有闭合回路的铁心时,因磁力线无法经由高导磁材料做回路,磁力线会经由外部空气做回路而让周围产生磁场(漏磁通),图15所示为一般变压器的磁力线,大多数的磁力线皆会经由高导磁材料(铁心)。 但在中间有气隙的地方就会有许多漏磁通产生(如图16虚线所示),而也有少部分漏磁通会经过与变压器垂直的地方,因此若有组件在变压器的正上方或下方,是很容易被此漏磁通干扰的。 图15 图16 因此,改善磁场干扰的方式,包括两部份,一是减少磁力线的能量,包括改变电流振幅/时间变化率等,另一是减少磁力线的影响,包括缩小电流回路,拉开两者之间的距离,导体面积等方法。 电场耦合效应如图17所示,在PCB板上有两导体时会有一等效电容效应,而当左端的布线有一时变电压产生时,其右边的导体会因电场耦合效应而产生一耦合电流,此耦合电流即是因电场效应所产生的电场干扰。 磁场耦合效应如图18所示,在PCB板上有两导体回路时,当左边的回路有一时变电流产生,其右边的回路也会因磁场耦合效应而产生一耦合电压(感应电势),此电压即是因磁场效应所产生的磁场干扰。 图17 图18 产生电场干扰的原因,在于带电体的电荷重新分布,因电荷改变后会让电容两端的电压改变而不断的充放电。产生磁场干扰的原因,在于流过导体的电流在不断改变,即电流产生的磁力线会使周围导体感应出电动势,造成磁场干扰。 电场与磁场的干扰起源于快速的能量(电压/电流)变化;而快速的能量变化可分两部份,一是能量本体的频率(变化率),一是能量本体的振幅(大小),而对策电磁干扰的方式不外两种,一是对策能量本体,像是抑制此能量的振幅或是改变其变化率,像是缓冲器,导通(截止)速度,更换组件的速度,变压器设计等。 另一是截断干扰的耦合路径,将干扰源封闭在电源本体里面,像是用LC滤波器,铜箔,外壳等,不论使用何种方式,目的都是为了达到电磁干扰可以通过法规的需求。 4.3 寄生组件的影响 在实际的电源产品中,到处都充满了寄生组件,包括组件本体的寄生组件与布线组成的寄生成分。当频率到MHz时,nH的电感与pF的电容会对EMI产生非常大的影响。 以一个环形电感来举例,多数的工程师只在意它的Al值,即绕了几圈后可以得到多少的感量,却没有去考虑到他的等效电容(ESC)与等效电阻(ESR),而在电磁干扰的领域,此等效电容与等效电阻却非常重要;理想的磁性组件,其阻抗应与频率成正比(Xl=2*pi*f*L),即频率愈高时其阻抗愈高,但在实际应用里,组件的等效电容却会抑制其阻抗特性。 如图19为一电感的阻抗与频率曲线,在频率低于共振点时,其阻抗会因频率上升而增加,但在过了共振点(Fr)后,阻抗却会因频率上升而变小,而无法达到预期的抑制效果。 图19 笔者在对策电磁干扰时将频段分为二部份, 10M以下的频段与10M以上的频段,在10M以下的频段, 其对策与变压器/滤波器/布线/结构等较相关, 而在10M以上的频段, 其对策与变压器/布线/滤波器/缓冲器(Snubber&Bead)/开关组件与速度/屏敝等较相关, 因布线/滤波器/变压器在高低频皆会影响,因此笔者在此先针对布线/滤波器/变压器等(10M以下)先做介绍。 05 布线(Layout)设计概念 由之前的介绍可知,电场干扰与磁场干扰是电磁干扰里最大的干扰源,不但布线的走线会大大的影响电场与磁场的耦合路径,也会因布线的寄生组件而影响电源的特性,因此良好的布线方式是从事电源设计不可缺少的能力之一,不但多数的电性问题皆因不良的布线导致,电磁干扰的好坏也与布线习习相关,不论是传导或辐射。 多数的布线工程师并不知道怎样的走线方式较好,而只认为每个节点都接到即可,愈资深的工程师则愈会对布线有所要求,以作者的经验, 60%以上的电性不良皆是因布线所致,而在此将布线的基本概念概述如下: 5.1 安规距离与制程要求 此为最基本要求,任何产品皆需要达到安规规范,而不同的产线也会有不同的制程要求,像是组件本体大小,各组件之间的距离,接点大小,白漆…等,一般此规范会由各家布线工程师管控,因此在这里不做多述。 5.2 电源路径与信号路径需分开 在开关电源设计里,信号可分为大电流与小电流的,以 反激式(flyback)架构为例,大电流是由输入电源进来至滤波器,桥式,大电容,变压器,初级侧开关,次级侧二极管,输出电容到输出线材等走大电流的路径称为电源路径(power trace);而走小电流的路径就称为信号路径(signal trace),像是IC周边的组件或回授电路。 电压愈大会有较大电场的产生,而电流愈大则会有愈大磁场的产生,而周边组件,特别是良导体愈靠近此电场或磁场就会耦合愈大的能量,因此在做布线安排时,尽量让电源路径与信号路径分开来走,以免信号路径被干扰产生误动作,也避免干扰源借由其他导体放大其干扰信号,在此将电源路径与信号路径分别说明如下: 5.2.1 电源路径的基本概念 把布线的路径想象成一条水流(即电流),水流自然会往河流愈宽的地方流(走线愈粗的地方),而且也自然会往低处流(往目标,即输出端流),在电源路径上的组件皆应该照顺序流过,否则会大大地衰减其作用。 电容是储存电荷的组件,愈大的电容可储存愈多的电荷,因此在看电源路径时,可视电流由电容正端出发,经由开关组件的回路后再回到电容的负端形成开关回路。 图20为一升压加反激(PFC+Flyback)架构的例子,PFC前端会有一颗小电容,PFC会由此电容形成一导通回路(绿色箭头)经电感,MOSFET,Rsense回小电容,与截止回路(紫色箭头)经电感,二极管,大电容回小电容;即电流由电容的正端出发,经一回路之后再回到电容的负端; 同理,Flyback由大电容的正端开始,经变压器,MOSFET,Rsense后再回到大电容负端;输出则由变压器的正端,经输出二极管,输出电容后回到变压器的负端。 图20 因电源路径有很大的电流与电压变动,因此在布线时要注意,流过大电流的回路会产生磁场辐射,因此大电流的走线要尽量短与粗,尤其是次级侧。 高电压开关的走线则要尽量减少其面积以减少电场效应,并尽量减少其相临的导体面积与之间的距离以减少等效电容,图21与22为量测反激式变压器两端的电压波形,由波形可知在MOSFET的Drain端与Diode的正端有很大的电压变化量,因此在布线时此两点的布线面积要尽可能的小,也尽量远离其他的导体以避免电场效应。 图21 图22 有时因为布线的考虑,无法将回路变的很短,这时我们可以靠高频电容来帮忙,像是在大电解电容同电位上并联一个陶质(高频)电容,因多数的电解电容是低频组件,而并联的高频电容可以提供开关时的高频电流,此电容可放在如图23所示的位置。 在PFC端可在二极管后端并一颗小电容且靠近PFC…

摩登3新闻554258:_PCB大神总结5大设计经验! 真得很受用!

PCB就好比电子电路的骨架和神经脉络,在电子工程项目中起着举足轻重的作用,但很多人对PCB设计并不了解或了解不够。 我在大学那时候,就对电路板设计、硬件电路设计特别感兴趣,也学得比较认真。当时觉得毕业后能找到一份坐在办公室进行计算机绘图的工作是多么好。毕业后,也如愿进入了东莞一家汽车电子公司,从事电子研发的工作,包括制作BOM表、样机调试和PCB绘图工作。当时2002年毕业时,还没有PCB工程师这个工种,基本上就是什么事情都要会一点,包括原理图绘制、器件选型、PCB绘图、样板焊接、调试、BOM制作、作业指导书等,也从此走上了电子研发这条路。 01 原理图 尽管优良的原理图不能保证好的布线,但是好的布线开始于优良的原理图。在绘制原理图时要深思熟虑,并且必须考虑整个电路的信号流向。如果在原理图中从左到右具有正常稳定的信号流,那么在PCB上也应具有同样好的信号流。在原理图上尽可能多给出有用的信息。 因为有时候电路设计工程师不在,客户会要求我们帮助解决电路的问题,从事此工作的设计师、技术员和工程师都会非常感激,也包括我们。除了普通的参考标识符、功耗和误差容限外,原理图中还应该给出哪些信息呢?下面给出一些建议,可以将普通的原理图变成一流的原理图。加入波形、有关外壳的机械信息、印制线长度、空白区;标明哪些元件需要置于PCB上面;给出调整信息、元件取值范围、散热信息、控制阻抗印制线、注释、扼要的电路动作描述……(以及其它)。 02 谁都别信 如果不是你自己设计布线,一定要留出充裕的时间仔细检查布线人的设计。在这点上很小的预防抵得上一百倍的补救。不要指望布线的人能理解你的想法。在布线设计过程的初期你的意见和指导是最重要的。你能提供的信息越多,并且整个布线过程中你介入的越多,结果得到的PCB就会越好。给布线设计工程师设置一个暂定的完成点——按照你想要的布线进展报告快速检查。这种“闭合环路”方法可以防止布线误入歧途,从而将返工的可能性降至最低。 需要给布线工程师的指示包括:电路功能的简短描述,标明输入和输出位置的PCB略图,PCB层叠信息(例如,板子有多厚,有多少层,各信号层和接地平面的详细信息——功耗、地线、模拟信号、数字信号和RF信号);各层需要那些信号;要求重要元件的放置位置;旁路元件的确切位置;哪些印制线很重要;哪些线路需要控制阻抗印制线;哪些线路需要匹配长度;元件的尺寸;哪些印制线需要彼此远离(或靠近);哪些线路需要彼此远离(或靠近);哪些元器件需要彼此远离(或靠近);哪些元器件要放在PCB的上面,哪些放在下面。永远不要抱怨需要给别人的信息太多——太少吗?是;太多吗?不。 分享一条学习经验:大约10年前,我设计一块多层的表面贴电路板——板子的两面都有元件。用很多螺钉将板子固定在一个镀金的铝制外壳中(因为有很严格的防震指标)。提供偏置馈通的引脚穿过板子。该引脚是通过焊接线连接到PCB上的。 这是一个很复杂的装置。板子上的一些元件是用于测试设定(SAT)的。但是我已经明确规定了这些元件的位置。你能猜出这些元件都安装在什么地方吗?对了,在板子的下面。当产品工程师和技术员不得不将整个装置拆开,完成设定后再将它们重新组装的时候,显得很不高兴。从那以后我再也没有犯过这种错误了。 03 位置 正像在PCB中,位置决定一切。将一个电路放在PCB上的什么位置,将其具体的电路元件安装在什么位置,以及其相邻的其它电路是什么,这一切都非常重要。 通常,输入、输出和电源的位置是预先确定好的,但是它们之间的电路就需要“发挥各自的创造性”了。这就是为什么注意布线细节将产生巨大回报的原因。从关键元件的位置入手,根据具体电路和整个PCB来考虑。从一开始就规定关键元件的位置以及信号的路径有助于确保设计达到预期的工作目标。一次就得到正确的设计可以降低成本和压力——也就缩短了开发周期。 另外,说点有意思的,PCB板上那些“特殊焊盘“ 第一个,泪滴焊盘 泪滴是焊盘与导线或者是导线与导孔之间的滴装连接过度,设置泪滴的目的是在电路板受到巨大外力的冲撞时,避免导线与焊盘或者导线与导孔的接触点断开,另外,设置泪滴也可使PCB电路板显得更加美观。 teardrop的作用是避免信号线宽突然变小而造成反射,可使走线与元件焊盘之间的连接趋于平稳过渡化,解决了焊盘与走线之间的连接容易断裂的问题。 1、焊接上,可以保护焊盘,避免多次焊接是焊盘的脱落 2、加强连接的可靠性(生产是可以避免蚀刻不均,过孔偏位出现的裂缝等) 3、平滑阻抗,减少阻抗的急剧跳变 在电路板设计中,为了让焊盘更坚固,防止机械制板时焊盘与导线之间断开,常在焊盘和导线之间用铜膜布置一个过渡区,形状像泪滴,故常称做补泪滴( Teardrops ) 第二个,放电齿 此物被称之为放电齿、放电间隙或者火花间隙。采用放电间隙(Sparkgaps )放电间隙是一对指向彼此相对的锐角的三角形,指尖相距最大10mil 最小6mil 。一个三角形接地,另一个接到信号线。此三角形不是一种元件,而是由在PCB 布线过程中使用铜箔层作出来的。这些三角形需设置在PCB 板的顶层(componentside ),且不能被防焊涂料所笼盖。 1、在开关电源浪涌测试或者ESD测试时共模电感两端将产生高压,出现飞弧。若与周围器件间距较近,可能使周围器件损坏。因此可在其上并联一个放电管或压敏电阻限制其电压,从而起到灭弧的作用。放置防雷器件效果很好但是成本比较高。 2、另一种办法是在PCB设计时,在共模电感两端加入放电齿,使得电感通过两放电尖端放电,避免通过其他路径放电,从而使得对周围和后级器件的影响减到最小。 放电间隙不需要另外的成本,在画pcb板时画上去就可以了,但是需要特别留意的是此种形式的放电间隙为空气形式的放电间隙,只能在偶有ESD 产生的环境中使用。若在经常有ESD 发生的场合中使用,则放电间隙间会因为常常的放电而在两个三角点上产生积碳,并终极在放电间隙上造成短路,并造成信号线的永久对地短路,从而造成系统的故障。 其实,PCB设计的乐趣有很多,只有去实践,才会有深刻体会。看到这篇文章,如果朋友们对PCB设计有任何感触,可以在评论下方留言一起交流。 END 来源:凡亿PCB 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3注册平台官网_并发编程中一种经典的分而治之的思想!!

写在前面 在JDK中,提供了这样一种功能:它能够将复杂的逻辑拆分成一个个简单的逻辑来并行执行,待每个并行执行的逻辑执行完成后,再将各个结果进行汇总,得出最终的结果数据。有点像Hadoop中的MapReduce。 ForkJoin是由JDK1.7之后提供的多线程并发处理框架。ForkJoin框架的基本思想是分而治之。什么是分而治之?分而治之就是将一个复杂的计算,按照设定的阈值分解成多个计算,然后将各个计算结果进行汇总。相应的,ForkJoin将复杂的计算当做一个任务,而分解的多个计算则是当做一个个子任务来并行执行。 注:文章已同步收录到:https://github.com/sunshinelyz/technology-binghe 和  https://gitee.com/binghe001/technology-binghe 。如果文件对你有点帮助,别忘记给个Star哦!如果小伙伴们有任何疑问,都可以加我微信【sun_shine_lyz】进行交流哦! Java并发编程的发展 对于Java语言来说,生来就支持多线程并发编程,在并发编程领域也是在不断发展的。Java在其发展过程中对并发编程的支持越来越完善也正好印证了这一点。 Java 1 支持thread,synchronized。 Java 5 引入了 thread pools, blocking queues, concurrent collections,locks, condition queues。 Java 7 加入了fork-join库。 Java 8 加入了 parallel streams。 并发与并行 并发和并行在本质上还是有所区别的。 并发 并发指的是在同一时刻,只有一个线程能够获取到CPU执行任务,而多个线程被快速的轮换执行,这就使得在宏观上具有多个线程同时执行的效果,并发不是真正的同时执行,并发可以使用下图表示。 并行 并行指的是无论何时,多个线程都是在多个CPU核心上同时执行的,是真正的同时执行。 分治法 基本思想 把一个规模大的问题划分为规模较小的子问题,然后分而治之,最后合并子问题的解得到原问题的解。 步骤 ①分割原问题; ②求解子问题; ③合并子问题的解为原问题的解。 我们可以使用如下伪代码来表示这个步骤。 if(任务很小){    直接计算得到结果}else{    分拆成N个子任务    调用子任务的fork()进行计算    调用子任务的join()合并计算结果} 在分治法中,子问题一般是相互独立的,因此,经常通过递归调用算法来求解子问题。 典型应用 二分搜索 大整数乘法 Strassen矩阵乘法 棋盘覆盖 合并排序 快速排序 线性时间选择 汉诺塔 ForkJoin并行处理框架 ForkJoin框架概述 Java 1.7 引入了一种新的并发框架—— Fork/Join Framework,主要用于实现“分而治之”的算法,特别是分治之后递归调用的函数。 ForkJoin框架的本质是一个用于并行执行任务的框架, 能够把一个大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务的计算结果。在Java中,ForkJoin框架与ThreadPool共存,并不是要替换ThreadPool 其实,在Java 8中引入的并行流计算,内部就是采用的ForkJoinPool来实现的。例如,下面使用并行流实现打印数组元组的程序。 public class SumArray {    public static void main(String[] args){        List  numberList = Arrays.asList( 1, 2, 3, 4, 5, 6, 7, 8, 9);         numberList.parallelStream().forEach(System.out::println);     } } 这段代码的背后就使用到了ForkJoinPool。 说到这里,可能有读者会问:可以使用线程池的ThreadPoolExecutor来实现啊?为什么要使用ForkJoinPool啊?ForkJoinPool是个什么鬼啊?! 接下来,我们就来回答这个问题。 ForkJoin框架原理 ForkJoin框架是从jdk1.7中引入的新特性,它同ThreadPoolExecutor一样,也实现了Executor和ExecutorService接口。它使用了一个无限队列来保存需要执行的任务,而线程的数量则是通过构造函数传入,如果没有向构造函数中传入指定的线程数量,那么当前计算机可用的CPU数量会被设置为线程数量作为默认值。 ForkJoinPool主要使用 分治法(Divide-and-Conquer Algorithm) 来解决问题。典型的应用比如快速排序算法。这里的要点在于,ForkJoinPool能够使用相对较少的线程来处理大量的任务。比如要对1000万个数据进行排序,那么会将这个任务分割成两个500万的排序任务和一个针对这两组500万数据的合并任务。以此类推,对于500万的数据也会做出同样的分割处理,到最后会设置一个阈值来规定当数据规模到多少时,停止这样的分割处理。比如,当元素的数量小于10时,会停止分割,转而使用插入排序对它们进行排序。那么到最后,所有的任务加起来会有大概200万+个。问题的关键在于,对于一个任务而言,只有当它所有的子任务完成之后,它才能够被执行。 所以当使用ThreadPoolExecutor时,使用分治法会存在问题,因为ThreadPoolExecutor中的线程无法向任务队列中再添加一个任务并在等待该任务完成之后再继续执行。而使用ForkJoinPool就能够解决这个问题,它就能够让其中的线程创建新的任务,并挂起当前的任务,此时线程就能够从队列中选择子任务执行。 那么使用ThreadPoolExecutor或者ForkJoinPool,性能上会有什么差异呢? 首先,使用ForkJoinPool能够使用数量有限的线程来完成非常多的具有父子关系的任务,比如使用4个线程来完成超过200万个任务。但是,使用ThreadPoolExecutor时,是不可能完成的,因为ThreadPoolExecutor中的Thread无法选择优先执行子任务,需要完成200万个具有父子关系的任务时,也需要200万个线程,很显然这是不可行的,也是很不合理的!! 工作窃取算法 假如我们需要做一个比较大的任务,我们可以把这个任务分割为若干互不依赖的子任务,为了减少线程间的竞争,于是把这些子任务分别放到不同的队列里,并为每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应,比如A线程负责处理A队列里的任务。但是有的线程会先把自己队列里的任务干完,而其他线程对应的队列里还有任务等待处理。干完活的线程与其等着,不如去帮其他线程干活,于是它就去其他线程的队列里窃取一个任务来执行。而在这时它们会访问同一个队列,所以为了减少窃取任务线程和被窃取任务线程之间的竞争,通常会使用双端队列,被窃取任务线程永远从双端队列的头部拿任务执行,而窃取任务的线程永远从双端队列的尾部拿任务执行。 工作窃取算法的优点:充分利用线程进行并行计算,并减少了线程间的竞争。 工作窃取算法的缺点:在某些情况下还是存在竞争,比如双端队列里只有一个任务时。并且该算法会消耗更多的系统资源,比如创建多个线程和多个双端队列。 Fork/Join框架局限性: 对于Fork/Join框架而言,当一个任务正在等待它使用Join操作创建的子任务结束时,执行这个任务的工作线程查找其他未被执行的任务,并开始执行这些未被执行的任务,通过这种方式,线程充分利用它们的运行时间来提高应用程序的性能。为了实现这个目标,Fork/Join框架执行的任务有一些局限性。 (1)任务只能使用Fork和Join操作来进行同步机制,如果使用了其他同步机制,则在同步操作时,工作线程就不能执行其他任务了。比如,在Fork/Join框架中,使任务进行了睡眠,那么,在睡眠期间内,正在执行这个任务的工作线程将不会执行其他任务了。(2)在Fork/Join框架中,所拆分的任务不应该去执行IO操作,比如:读写数据文件。(3)任务不能抛出检查异常,必须通过必要的代码来出来这些异常。 ForkJoin框架的实现 ForkJoin框架中一些重要的类如下所示。 ForkJoinPool 框架中涉及的主要类如下所示。 1.ForkJoinPool类 实现了ForkJoin框架中的线程池,由类图可以看出,ForkJoinPool类实现了线程池的Executor接口。 我们也可以从下图中看出ForkJoinPool的类图关系。 其中,可以使用Executors.newWorkStealPool()方法创建ForkJoinPool。 ForkJoinPool中提供了如下提交任务的方法。 public void execute(ForkJoinTask  task)public void execute(Runnable task)public   T  invoke (ForkJoinTask  task) public   List >  invokeAll (Collection > tasks)  public   ForkJoinTask…

摩登3登录网站_人生开始成熟的3个标志:承认父母普通,承认自己普通,承认孩子普通

中国有句古话,“龙生龙,凤生凤,老鼠的儿子会打洞”。意思就是说,如果父母牛逼,那么孩子大概率也会躺着牛逼。 真的是这样吗?英国著名生物学家高尔顿,对此提出了质疑。 高尔顿的研究表明:父母身高非常高,孩子的身高大概率会倾向于正常值,小概率还像父母那样高。而到了孙子辈,会更倾向于正常值。 在个人成就方面也是一样的道理。父母成就高,那么孩子成就高的概率是36%,孙子辈是9%,尽管还是比普通成就家庭高一些,但也是呈现回归正常值的态势。 也就是说,这个世界上绝大多数人都是普通人,极少数牛逼的人下一代也会向普通跌落。 承认自己是个普通人,人生开始变好 老K以前总是不愿意承认自己又庸俗又正常,总觉得自己骨骼清奇,是个做大事的人,甚至宁可做个神经病也不愿做个普通人。 后来发现很多身边的朋友也有这个困扰。 科学家研究表明,整个人类社会中的普通人占比68%,比较聪明的占比13.6%。 据我观察,很多人一事无成,就是因为自己对自己的定位有问题。 邓亚萍是乒乓球历史上最伟大的女子选手,她5岁起就随父亲学打球,1988年进入国家队,先后获得14次世界冠军头衔,在乒坛世界排名连续8年保持第一。 你一定以为她是万中无一的运动奇才。恰恰相反,她个子矮,手脚粗短,根本不是个当运动员的料。甚至都不符合体校的要求,体校也将她拒之门外。 幸运的是,邓亚萍和她的父亲很早明白了这个道理:资质普通、身体条件不突出,一样也可以通过合适的训练方法进行提升,达到很高的水平。 邓亚萍在父亲的指导下,开始刻苦练习。她每天在练完体能课后,必须还要做100个发球接球的动作。当时,邓亚萍虽然只有七八岁,但为了能使自己的球技更加熟练,基本功更加扎实,便在自己的腿上绑上了沙袋,而且把木球拍换成了铁球拍。 10岁的她,一鸣惊人,在全国少年乒乓球比赛中获得团体和单打两项冠军。进入了国家队后,她并没有松懈。因为知道自己资质普通,她更加刻苦的练习基础训练,每天比队友多练习4小时以上。 邓亚萍的出色成就,改变了世界乒坛只在高个子中选拔运动员的传统观念。国际奥委会主席萨马兰奇也为邓亚萍的球风和球艺所倾倒,亲自为她颁奖。 老K之前讲过,这辈子最豁然开朗的时刻,就是意识到自己是个普通人。于是那段时间里,静下心来学习和练习,就是在那时,读了这辈子最多的书。当机会来临的时候,才有了抓住机会的能力,实现了职场生涯的跃迁,成为别人眼中的牛人。 因为不会表达,所以抓住任何一次分享表达的机会。 因为智商一般,所以拼命做笔记、思考,将基本理念和方法烂熟于心。 因为阅读不快,所以静下心来慢慢看,日积月累,从量变到质变。 认识到人生唯一可靠的路就是下苦工重复练习,反而踏实了很多。虽然也曾经痛恨自己不是天才,不能过目不忘,不过好在后来发现我并不需要那个技能。 承认普通,就是自我放纵吗? 许多人都误解了承认普通的意义,承认并接受普通,并不意味着放弃自我、破罐破摔。 恰恰相反,。 一个人努力的区域有三个:舒适区、训练区、挑战区。 长按订阅更多精彩▼ 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3娱乐登录地址_“物联网百校公益行”,华清携手阿里云加强物联网人才培养!

随着物联网产业的蓬勃发展,物联网人才需求水涨船高。近日,为帮助高校打造物联网人才教育竞争力,培养高端物联网实战型人才,华清远见携手阿里云联合发起“物联网百校公益行”大型公益活动,将联合上百所重点高校,专门面向高校大学生进行“阿里云物联网行业与技术分享”的专业讲座,预约报名通道即日起全网开启。 阿里云智能loT事业部 熊健 届时,阿里云与华清远见百余位AIoT行业知名专家,资深工程师将带来全新AIoT技术分享及独特视角分析,更有华清远见华东区副总裁带来的最新AIoT行业人才需求分析,为高校AIoT实战人才的培养,提供理论+实训的一体化解决方案。 让高校学生对物联网行业的发展有体系化及全局性认识,增加对业内领先技术的落地运用以及项目实施流程的充分了解。同时阿里云技术老师将在实际行业应用及场景案例中引导学生了解并应用物联网相关技术,让应届毕业生做到离就业更进一步,学以致用。 华清远见教育集团济南中心校长 李鹏 随着第三次人工智能浪潮的爆发以及物联网技术的广泛应用,融合AI技术和IoT技术的AIoT已经成为业界公认的未来技术主流形态。AIoT已经成为开启万物智联时代的新“钥匙”。 随着物联网产业的蓬勃发展,物联网人才需求水涨船高,与之相对应的是我国物联网人才的稀缺,使得加强物联网专业人才的培养工作成为亟待解决的问题。 2018年教育部印发了《高等学院人工智能创新行动计划》,强调了“优化高校人工智能领域科技创新体系,完善人工智能领域人才培养体系”的重点任务。 在此经济、教育背景下,华清远见与阿里云联合策划并发起了此次百校公益演讲行动。目前该活动已有全国近百所重点高校积极响应,并且参与规模仍在继续扩大。 五大演讲主题 全景式解构AIoT技术的前世今生 从2020年12月20日起 ,“物联网人工智能百校公益行”活动将正式在全国启动。此次公益演讲,采用“专家报告+技术课程+项目演示互动”的形式,围绕AIoT技术的前世今生进行深耕。 演讲共涵盖“物联网与人工智能行业分享、一个物联网老兵的成长之路、物联网人才需求分析、HasS积木式智能设备体验、HasS案例互动展示”五大分享主题。 既能高屋建瓴,从宏观技术视角掌握全新AIoT技术剖析AIoT技术在各行各业的发展趋势及应用;也能脚踏实地,从大学生职业发展视角分析AIoT行业发展前景,拆解项目案例,实景体验物联网项目案例。 HasS智能设备演示 产教融合 打通物联网人才最后一公里 End  微信搜一搜 点分享 点点赞 点在看 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3新闻554258:_杭州阿里,海康,网易等组成HR联盟,打工人“裸奔

在杭州滨江区,由30多余家重点企业CHO或者HRD组成的HR智库联盟正式成立。这些企业中有阿里,海康,网易,吉利等。 作为一名地地道道的打工人,看到这消息实则有些懵逼,我再也不敢随便跳槽了? 话说,年轻时谁还没踩过几个求职的坑,被渣hr忽悠,入职后却发现根本不是说的那回事。再或,遇到莫名其妙的老板,三观不合的制度,多的喘不过来气的工作任务,不开森也没钱赚,这种情况,不离职等着过年嘛! 现在HR来一句,我是联盟里的人……细思极恐啊! 虽然后来辟谣说,将不存在交流讨论员工个人情况,不存在共享员工个人信息,表态声明此智库只是为了减少人员流动,提升人力资源管理水平。 不否认求职市场上“混子”存在,智库联盟似乎一定程度上减少了人才的不恰当匹配。 但是打工人还是怕呀,“裸奔”找工作谁不怕,而“裸”到啥程度取决于联盟。 假设再过度一点,全裸后还给涂上颜色可咋整。毕竟打工人和招聘企业属于利益相对体,一招不慎,企业就强势过头了,变成了企业对打工人的单向选择。 有一就有二,假设其他地区,企业纷纷效仿,大部分企业自成一家联盟,打工人将更没指望了。 目前招聘市场上不只有打工人自己的问题,招聘企业,不论是不是头部企业,HR水平也是参差不齐,依然存在入职前和入职后信息不符的现象。 就算HR诚实不欺,但求职者的工作岗位也会随着公司领导的决策变化而改变,更不用说对公司文化制度还需要磨合了! 又或者碰到了一个各种不合的领导,走也不是,不走也不是。更别提有些企业为了招徕优秀的大头兵以管理岗位诱之了! 长按订阅更多精彩▼ 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3测速登陆_一口气说出4种幂等性解决方案,面试官露出了姨母笑~

什么是幂等性? 幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同。 “ 在计算机中编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 幂等函数或幂等方法是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。 什么是接口幂等性? 在HTTP/1.1中,对幂等性进行了定义。它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外),即第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。 这里的副作用是不会对结果产生破坏或者产生不可预料的结果。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。 为什么需要实现幂等性? 在接口调用时一般情况下都能正常返回信息不会重复提交,不过在遇见以下情况时可以就会出现问题,如: 前端重复提交表单:在填写一些表格时候,用户填写完成提交,很多时候会因网络波动没有及时对用户做出提交成功响应,致使用户认为没有成功提交,然后一直点提交按钮,这时就会发生重复提交表单请求。 用户恶意进行刷单:例如在实现用户投票这种功能时,如果用户针对一个用户进行重复提交投票,这样会导致接口接收到用户重复提交的投票信息,这样会使投票结果与事实严重不符。 接口超时重复提交:很多时候 HTTP 客户端工具都默认开启超时重试的机制,尤其是第三方调用接口时候,为了防止网络波动超时等造成的请求失败,都会添加重试机制,导致一个请求提交多次。 消息进行重复消费:当使用 MQ 消息中间件时候,如果发生消息中间件出现错误未及时提交消费信息,导致发生重复消费。 “ 使用幂等性最大的优势在于使接口保证任何幂等性操作,免去因重试等造成系统产生的未知的问题。 引入幂等性后对系统有什么影响? 幂等性是为了简化客户端逻辑处理,能放置重复提交等操作,但却增加了服务端的逻辑复杂性和成本,其主要是: 把并行执行的功能改为串行执行,降低了执行效率。 增加了额外控制幂等的业务逻辑,复杂化了业务功能; 所以在使用时候需要考虑是否引入幂等性的必要性,根据实际业务场景具体分析,除了业务上的特殊要求外,一般情况下不需要引入的接口幂等性。 Restful API 接口幂等性如何? 现在流行的 Restful 推荐的几种 HTTP 接口方法中,分别存在幂等行与不能保证幂等的方法,如下: √满足幂等 x 不满足幂等 - 可能满足也可能不满足幂等,根据实际业务逻辑有关 方案一:数据库唯一主键实现幂等性 数据库唯一主键的实现主要是利用数据库中主键唯一约束的特性,一般来说唯一主键比较适用于“插入”时的幂等性,其能保证一张表中只能存在一条带该唯一主键的记录。 使用数据库唯一主键完成幂等性时需要注意的是,该主键一般来说并不是使用数据库中自增主键,而是使用分布式 ID 充当主键,这样才能能保证在分布式环境下 ID 的全局唯一性。 适用操作 插入操作 删除操作 使用限制 需要生成全局唯一主键 ID; 主要流程 主要流程如下: 客户端执行创建请求,调用服务端接口。 服务端执行业务逻辑,生成一个分布式 ID,将该 ID 充当待插入数据的主键,然 后执数据插入操作,运行对应的 SQL 语句。 服务端将该条数据插入数据库中,如果插入成功则表示没有重复调用接口。如果抛出主键重复异常,则表示数据库中已经存在该条记录,返回错误信息到客户端。 方案二:数据库乐观锁实现幂等性 数据库乐观锁方案一般只能适用于执行更新操作的过程,我们可以提前在对应的数据表中多添加一个字段,充当当前数据的版本标识。 这样每次对该数据库该表的这条数据执行更新时,都会将该版本标识作为一个条件,值为上次待更新数据中的版本标识的值。 适用操作 更新操作 使用限制 需要数据库对应业务表中添加额外字段 描述示例 例如,存在如下的数据表中: 为了每次执行更新时防止重复更新,确定更新的一定是要更新的内容,我们通常都会添加一个 version 字段记录当前的记录版本,这样在更新时候将该值带上,那么只要执行更新操作就能确定一定更新的是某个对应版本下的信息。 这样每次执行更新时候,都要指定要更新的版本号,如下操作就能准确更新 version=5 的信息: UPDATE my_table SET price=price+50,version=version+1 WHERE id=1 AND version=5 上面 WHERE 后面跟着条件 id=1 AND version=5 被执行后,id=1 的 version 被更新为 6,所以如果重复执行该条 SQL 语句将不生效,因为 id=1 AND version=5 的数据已经不存在,这样就能保住更新的幂等,多次更新对结果不会产生影响。 方案三:防重 Token 令牌实现幂等性 针对客户端连续点击或者调用方的超时重试等情况,例如提交订单,此种操作就可以用 Token 的机制实现防止重复提交。 简单的说就是调用方在调用接口的时候先向后端请求一个全局 ID(Token),请求的时候携带这个全局 ID 一起请求(Token 最好将其放到 Headers 中),后端需要对这个 Token 作为 Key,用户信息作为 Value 到 Redis 中进行键值内容校验,如果 Key 存在且 Value 匹配就执行删除命令,然后正常执行后面的业务逻辑。如果不存在对应的 Key 或 Value 不匹配就返回重复执行的错误信息,这样来保证幂等操作。 适用操作 插入操作 更新操作 删除操作 使用限制 需要生成全局唯一  Token 串 需要使用第三方组件  Redis 进行数据效验 主要流程: 服务端提供获取 Token 的接口,该 Token 可以是一个序列号,也可以是一个分布式 ID 或者 UUID 串。 客户端调用接口获取 Token,这时候服务端会生成一个 Token 串。 然后将该串存入 Redis 数据库中,以该 Token 作为 Redis 的键(注意设置过期时间)。 将 Token 返回到客户端,客户端拿到后应存到表单隐藏域中。 客户端在执行提交表单时,把 Token 存入到 Headers 中,执行业务请求带上该 Headers。 服务端接收到请求后从 Headers 中拿到 Token,然后根据 Token 到 Redis 中查找该 key 是否存在。 服务端根据…