• 单点接地、多点接地、混合接地:既有高频信号又有低频信号,如何解决阻抗问题?

    玩转嵌入式 数字信号 阻抗

  • 程序员的悲哀

    程序员最大的悲哀,就是年轻时一心扑在技术上,到头来却发现,技术是最不值钱的东西。 为什么这么说呢?看现在的应届生校招,就会有这样一个感受: 现在的毕业生越来越优秀,看着他们分享的面经,自己经常觉得惭愧,觉得自己那么多年技术都白学了。 程序员这一行业有门槛,不是谁都可以做的,但是程序员门槛又很低,貌似是个人都能做。 这句话,看似矛盾,其实不矛盾。只要理工科学生,上过大学,或者高中也行,对编程有兴趣,自学也好,培训也好,都能来做编程。 从身边一些经历能深刻体会到这一点,现在编程培训越来越多,进一步降低了程序员的入门门槛,很多人跨专业,跨行业来搞编程,进入计算机行业。 但是这仅仅是个入门门槛,进了门槛,却不容易提升,想要提升,就要不断的学习新技术,提高自己的能力,要不就是要有个高学历,有比较强的科研能力。 像我同学,最近都在忙着笔试,面试,参加校招,面试一个java后端开发,都能卷到系统底层锁机制,系统内核线程调度问题,各种Hash底层实现,还有各种并发原理。 面试造火箭,工作造轮子的问题似乎成了普遍现象。 好不容易拼进努力进入了大厂,但是35岁退休的说法就像悬在头上的一把剑。 996的生活已经让人感到焦虑。加班无休止使得身体越来越吃不消。越来越比不上年轻人。 当你对这种生活感到不满意,试图通过自己的代码或技术来赚钱时,真正的绝望才是开始。 因为你会发现,生活的琐事和成年人的烦恼,在牵绊着你,你根本没法像年轻人那样不管不顾,一心闷头在技术的钻研上,你有自己操蛋的生活,有老婆孩子需要照顾,有父母需要赡养,似乎成年人的责任和义务都压在你头上。 想着靠接外包项目来赚点外快的话,实际上,当你真的接过几个之后,就会深有感触:需求一大堆,客户又不懂技术,给你提一些天马行空的想法,需求总是不够明细,频繁变化,关键还不认同你的技术价值,开的价格高了人直接不干了。异想天开,几千块钱就想让你做个抖音,京东之类的App。 一个人支撑起一个项目实在太难了,需要你会太多东西了,曾经你看不上的美工,UI,设计,甚至运营岗位,这时候你会深刻感受到,很多,并不是技术能解决的事情。 好不容易接个能做的,累死累活加班加点搞差不多,给雇主看的时候,要么各种挑刺,说你的功能没有做好,要么有些直接跟你玩消失,有些人跟你玩马虎眼,跟你说一大堆感谢的话,但是却绝对不谈尾款的事情。 很多程序员都有类似这样的经历吧?? 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    玩转嵌入式 程序员 技术员

  • 电路板的抗干扰设计该如何进行?

    今天EDA365电子论坛给大家汇总了一些电路抗干扰设计原则,希望能在知识层面给到大家一些帮助。 电源线的设计 地线的设计 3 1) 不要有过长的平行信号线; 2) 保证pcb的时钟发生器、晶振和cpu的时钟输入端尽量靠近,同时远离其他低频器件; 3) 元器件应围绕器件进行配置,尽量减少引线长度; 4) 对pcb板进行分区布局; 5) 考虑pcb板在机箱中的位置和方向; 6) 缩短高频元器件之间的引线。 去耦电容的配置 5 1) 尽量采用45°折线而不是90°折线(尽量减少高频信号对外的发射与耦合); 2)  用串联电阻的方法来降低电路信号边沿的跳变速率; 3) 石英晶振外壳要接地; 4) 闲置不用的们电路不要悬空; 5) 时钟垂直于IO线时干扰小; 6) 尽量让时钟周围电动势趋于零; 7) IO驱动电路尽量靠近pcb的边缘; 8) 任何信号不要形成回路; 9) 对高频板,电容的分布电感不能忽略,电感的分布电容也不能忽略; 10) 通常功率线、交流线尽量在和信号线不同的板子上。 6 1)CMOS的未使用引脚要通过电阻接地或电源; 2)用RC电路来吸收继电器等原件的放电电流; 3)总线上加10k左右上拉电阻有助于抗干扰; 4)采用全译码有更好的抗干扰性; 5)元器件不用引脚通过10k电阻接电源; 6)总线尽量短,尽量保持一样长度; 7)两层之间的布线尽量垂直; 8)发热元器件避开敏感元件; 9)正面横向走线,反面纵向走线,只要空间允许,走线越粗越好(仅限地线和电源线); 10)要有良好的地层线,应当尽量从正面走线,反面用作地层线; 11)保持足够的距离,如滤波器的输入输出、光耦的输入输出、交流电源线和弱信号线等; 12)长线加低通滤波器。走线尽量短截,不得已走的长线应当在合理的位置插入C、RC、或LC低通滤波器; 13)除了地线,能用细线的不要用粗线。 7 1)一般宽度不宜小于0.2.mm(8mil); 2)在高密度高精度的pcb上,间距和线宽一般0.3mm(12mil); 3)当铜箔的厚度在50um左右时,导线宽度1——1.5mm(60mil) = 2A; 4)公共地一般80mil,对于有微处理器的应用更要注意。 8 电源线尽量短,走直线,走树形,不要走环形。 9 首先,EDA365电子论坛提醒大家要考虑PCB尺寸大小。PCB尺寸过大时,印制线条长,阻抗增加,抗噪声能力下降,成本也增加;过小,则散热不好,且邻近线条易受干扰。 在确定PCB尺寸后,再确定特殊元件的位置。根据电路的功能单元,对电路的全部元器件进行布局。 在确定特殊元件的位置时要遵守以下原则: a. 尽可能缩短高频元器件之间的连线,设法减少它们的分布参数和相互间的电磁干扰。易受干扰的元器件不能相互挨得太近,输入和输出元件应尽量远离。 b. 某些元器件或导线之间可能有较高的电位差,应加大它们之间的距离,以免放电引出意外短路。带高电压的元器件应尽量布置在调试时手不易触及的地方。 c. 重量超过15g的元器件、应当用支架加以固定,然后焊接。那些又大又重、发热量多的元器件,不宜装在印制板上,而应装在整机的机箱底板上,且应考虑散热问题。热敏元件应远离发热元件。 d. 对于电位器、可调电感线圈、可变电容器、微动开关等可调元件的布局应考虑整机的结构要求。若是机内调节,应放在印制板上方便于调节的地方;若是机外调节,其位置要与调节旋钮在机箱面板上的位置相适应。 e.应留出印制扳定位孔及固定支架所占用的位置。 根据电路的功能单元对电路的全部元器件进行布局时,要符合以下原则: a. 按照电路的流程安排各个功能电路单元的位置,使布局便于信号流通,并使信号尽可能保持一致的方向。 b. 以每个功能电路的元件为中心,围绕它来进行布局。元器件应均匀、整齐、紧凑地排列在PCB上。尽量减少和缩短各元器件之间的引线和连接。 c. 在高频下工作的电路,要考虑元器件之间的分布参数。一般电路应尽可能使元器件平行排列。这样,不但美观。而且装焊容易。易于批量生产。 d. 位于电路板边缘的元器件,离电路板边缘一般不小于2mm。电路板的形状为矩形。长宽比为3:2成4:3。电路板面尺寸大于200x150mm时。应考虑电路板所受的机械强度。 10 布线的原则如下: a. 输入输出端用的导线应尽量避免相邻平行。加线间地线,以免发生反馈藕合。 b. 印制摄导线的宽度主要由导线与绝缘基扳间的粘附强度和流过它们的电流值决定。当铜箔厚度为0.05mm、宽度为 1 —— 15mm 时。通过 2A的电流,温度不会高于3℃,因此。导线宽度为1.5mm可满足要求。 对于集成电路,尤其是数字电路,通常选0.02——0.3mm导线宽度。当然,只要允许,还是尽可能用宽线。 尤其是电源线和地线。导线的间距主要由坏情况下的线间绝缘电阻和击穿电压决定。对于集成电路,尤其是数字电路,只要工艺允许,可使间距小至5——8mm。 c.印制导线拐弯处一般取圆弧形,而直角或夹角在高频电路中会影响电气性能。此外,尽量避免使用大面积铜箔。 否则,长时间受热时,易发生铜箔膨胀和脱落现象。必须用大面积铜箔时,用栅格状。这样有利于排除铜箔与基板间粘合剂受热产生的挥发性气体。 11 焊盘中心孔要比器件引线直径稍大一些。焊盘太大易形成虚焊。焊盘外径D一般不小于(d+1.2)mm,其中d为引线孔径。对高密度的数字电路,焊盘直径可取(d+1.0)mm。 PCB及电路抗干扰措施 电源线设计 电源线的设计 退藕电容配置 来自:EDA365电子论坛

    玩转嵌入式 电路板 PCB 抗干扰设计

  • 2020年2月全国程序员工资统计

    各主要程序员城市工资变化 # 职能 架构工程师的各地工资: 好吧,工资的差异还是地域造成的,你拖后腿了吗? CSDN 作者:有数可据 原文链接:https://blog.csdn.net/juwikuang/article/details/104162025 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    玩转嵌入式 程序员

  • 运放选型的15个常见技术指标

    定义:在运放开环使用时, 加载在两个输入端之间的直流电压使得放大器直流输出电压为 0。 优劣范围:1µV 以下,属于极优秀的。100µV 以下的属于较好的。最大的有几十mV。 对策: 选择 VOS远小于被测直流量的放大器, 过运放的调零措施消除这个影响 如果你仅关心被测信号中的交变成分,你可以在输入端和输出端增加交流耦合电路,将其消除。 如果 IB1=IB2,那么选择 R1=R2//RF,可以使电流形成的失调电压会消失,但实际中IB1=IB2很难满足。 2 失调电压漂移 定义: 当温度变化(µV/°C)、时间持续(µV/MO)、供电电压(µV/V)等自变量变化时, 输入失调电压会发生变化。 后果:很严重。因为它不能被调零端调零,即便调零完成,它还会带来新的失调。 对策: 第一, 就是选择高稳定性,也就是上述漂移系数较小的运放。 第二,有些运放具有自归零技术,它能不断地测量失调并在处理信号过程中把当前失调电压减掉。 第一,当用放大器接成跨阻放大测量外部微小电流时,过大的输入偏置电流会分掉被测电流,使测量失准。 第二,当放大器输入端通过一个电阻接地时,这个电流将在电阻上产生不期望的输入电压。 对策:为避免输入偏置电流对放大电路的影响,最主要的措施是选择 IB较小的放大器。 6 输入电压范围 定义:保证运算放大器正常工作的最大输入电压范围。也称为共模输入电压范围。 运算放大器在单端输入使用时,不存在这个概念。只有把运放接成类似于减法器形式,使得运放电路具备两个可变的输入端时,此指标才会发挥作用。 影响因素:一是运放本身的共模抑制比,二是对称电路中各个电阻的一致性。 开环电压增益是指放大器在闭环工作时,实际输出除以运放正负输入端之间的压差,类似于运放开环工作——其实运放是不能开环工作的。AVO 随频率升高而降低。 11 带宽指标 与带宽相关的指标主要有四项: 单位增益带宽(Unity Gain-bandwidth, UGBW) 定义:增益带宽积(Gain Bandwidth Product, GBP 或者 GBW) -3dB 带宽 满功率带宽(Full Power Bandwidth) 12 全谐波失真 衡量一个时域波形与标准正弦波的差异程度的量。也被用于衡量一个放大器的保真程度。谐波是有规律的,在频域中仅出现在指定频点。放大器的失真度指标,有时也用 HD2、 HD3 表征。 放大器的失真度指标,与很多因素相关,最为显著的有五个:第一是输入信号频率,第二是输出信号幅度,第三是放大电路闭环增益,第四是输出带载大小,第五是供电电压。 一般来说, SR 越大的,建立时间更小。 15 热阻 定义:是导热体阻止热量散失程度的描述。有以下常用的两种: θJA,是指芯片热源结(Junction)与芯片周围环境(Ambient)(一般为空气)的热阻。 θJC,是指芯片热源结(Junction)与芯片管壳(Case)的热阻。 输入阻抗为∞,开环放大倍数为∞,共模抑制比为∞,带宽为∞,压摆率为∞,输出阻抗为无穷小,差模输入电压为0,输入电流为0,失调电压,失调电流均为0。 两个重要特性: 虚短:正负输入端电压相等 虚短:正负输入端电流为0 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    玩转嵌入式 运算放大器

  • C语言中的“悬空指针”和“野指针”是什么意思?

    提起C语言大部分开发者很自然就会想到指针二字,没错,作为C的核心和灵魂,它的地位咱们就不再赘述了,今天我们想跟大家讲的是指针中的两个特有名词:“悬空指针”和“野指针”。 C语言中的指针可以指向一块内存,如果这块内存稍后被操作系统回收(被释放),但是指针仍然指向这块内存,那么,此时该指针就是“悬空指针”。下面这段C语言代码是一个例子,请看: void *p = malloc(size);assert(p);free(p); // 现在 p 是“悬空指针” C语言中的“悬空指针”会引发不可预知的错误,而且这种错误一旦发生,很难定位。这是因为在 free(p) 之后,p 指针仍然指向之前分配的内存,如果这块内存暂时可以被程序访问并且不会造成冲突,那么之后使用 p 并不会引发错误。 最难调试的 bug 总是不能轻易复现的 bug,对不? 所以在实际的C语言程序开发中,为了避免出现“悬空指针”引发不可预知的错误,在释放内存之后,常常会将指针 p 赋值为 NULL: void *p = malloc(size);assert(p);free(p); // 避免“悬空指针”p = NULL; 这么做的好处是一旦再次使用被释放的指针 p,就会立刻引发“段错误”,程序员也就能立刻知道应该修改C语言代码了。 2 野指针 这两点内容,是C语言比较重要的内容,希望大家在编码的时候一定要注意。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    玩转嵌入式 C语言

  • 10大经典错误

    10、DOS的Abort,Retry, Fail?错误 85年以后出生的人可能不知道DOS是什么了。我还记得当时的我对于Abort和Fail这两个选择还是比较清楚的,不过,今天完全忘记了Abort和Fail的差别是什么?这个出是DOS下的经常出现,也相当的经典,以至于在Wikepedia上都有专门的业面 Abort, Retry, Fail?。简称为ARF。当然,ARI – Abort, Retry, Ignore? 9、Windwos Vista的红屏错误 红屏错误(RSoD – Red Screen of Death)不单单只是Windows Vista引入的(也许是蓝屏太有名了,突然变成红屏,大家觉得这个是比蓝屏更NB的错,所以也就引人关注了),PlayStation的也喜欢使用红屏。 Windows Vista 的 RSoD PSP的红屏 8、PC机的开机报警 攒过PC的朋友都知道如果你的内存条有问题,PC开机时会长鸣报警,一长一短则是显卡有问题,等等。你可以上Wikipedia上看看相关的词条——Power On Self-Test Beep。 第一代的AMI BIOS 7、Twitter的大鲸鱼 Twitter的服务器负载一吃紧,下面的这个页面就会显现出来了,大家把它叫做Fail Whale ,这个情况在今年4月份以前的2到3年是非常频繁发生的,现在看似好很多了,看来Twitter工程师们克服了这个负载问题。你千万不要以为这个图是Twitter自己设计的,这个图是一个叫Yiying Lu的人设计的。不过由Twitter引发出来的文化影响力是比较深远的,甚至还出现了相要把这个事发扬光大的Fail Whale project (@FailWhale, failwhale.com)以及相关的T恤衫。 Twitter Fail Whale 6、Kernel Panic Kernel Panic相关于Windows 的蓝屏错误,其发生在Mac OS X和Linux下,在Mac OS X v10.6 Snow Leopard中,当进入内核错误后,会在画面上出现一个有英语、法语、德语、西班牙语及日语的当机画面,被多数用户称为“五国语言当机”,简称“五国”。在Linux上则是Linux Kernel oops。当内核检测到问题时,它会打印一个oops信息然后杀死全部相关进程。oops信息可以帮助Linux内核工程师调试,检测oops出现的条件,并修复导致oops的程序错误。 Mac OS X 10.6的内核错误警告,俗称“五国” PA-RISC上发生的Linux内核oops,用ASCII显示一头死牛 5、Windows的非法操作 这个错误信息主要是操作系统用来保护自己的错误,也就是Windows下的程序crash。通常来说,是内存访问错误引发的。不过,这个东西在windows下太多了,这是Win95和Win98中的大量的问题,包括微软自己的软件也经常出现这个问题,最为典型的就是IE6的crash。 该程序执行了非法操作 4、Windows RPC Error 这个错误之所以很牛,是因为在2003年的8月份,很多使用Windows的用户都看到了这个错误,其系统被强行重启,重启了以后又收到这个错误,然后又被重启。这个事看上去就像一个正常的Windows的错误(相当正常,因为这样的红叉叉在Windows上看到了N多次了,用户都习惯了),但其实,这个事是有人故意的,这就是那个著名的Blaster worm蠕虫病毒,其利用了Windows DCOM的一个漏洞。 Windows RPC Error 3、Xbox 360 三红错误Windows RPC Error 这个错误又叫RRoD – Red Ring of Death,在中国地区叫“三红”。微软在推出的游戏主机Xbox360后,众多用户曾向微软方面投诉游戏主机经常出现不同程度的故障,而且概率偏高,有调查显示,早期版本Xbox360返修率高达68% ,而最近的报告指出故障机率还是有33%。过热是游戏配件产品制造商Nyko认为Xbox360主机发生三红灯警告的主要原因,也有人指出因为Xbox 360机能不足所以长期开机超频引致过热。有报告指出微软花费了超过11.5亿美元在回收及修理出现问题的XBOX 360。 XBox 360 Red Ring of Death 2、Web上的404错误 HTTP 404或Not Found错误讯息是HTTP的其中一种“标准回应讯息”(HTTP状态码),此讯息代表客户端在浏览网页时,服务器无法打到用户要请求的资源,所以报错。404是一个你无法避免的错误,因为可能是因为用户或你的开发人员编码里打错连接。所以,很多公司借用这个机会来美化404页面,这里还有一个404的一首诗: four oh four by mind21_98 oh what a wonderful tizzy which was in a fizzy he couldn’t find the file which was hiding in the bushes push the back button oh traveller contact the owner of the last tavern find out how to get to where you’re going and be on your way 1、Windows 蓝屏错误 Blue Screen of Death,缩写为:BSoD。这是这个世界最著名的错误了,和Kernel Panic 一样,基本上就是说,内核死翘翘了。在各种场合上我们都能看到这个错误。 北京2008奥林匹克 飞机场航班显示 商场显示屏 本来文章到这里就可以结束了,不过,我觉得还有一个错误必然会载入史册。这就是下面的“该页无法显示错误” 0、该页无法显示错误 这个错误对于中国用户不会陌生。这个错误以前更多的是Connection Reset,N年前你访问很多国外的网站者会遇到Connection Reset错,今天呢,更多的是“Time Out”,因为,关键词匹配太耗性能了,图片和视频的无法使用关键词过滤,所以,还不如直接封了IP,简单而粗暴,今天的Connection Reset更多的是出现在使用Google的搜索,当你搜某些关键词时就出这个错了。 该页无法显示 Connection Reset  免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    玩转嵌入式 代码 程序员

  • 使用STM32、WIFI模组,亲手打造一款智能宠物喂食器

    1 前言 我从小就喜欢小动物,工作了之后养了一只可爱的小泰迪,取名叫COCO。白天,我上班把COCO独自锁在家中;晚上回家,COCO热情相迎,这种感觉很治愈。 有时候出短差,就把COCO自己锁在家中,也正是这个原因,很想自己做一个宠物喂食器,可以实现远程喂食和定时喂食的功能,无奈,不懂Android/IOS编程无法实现云端和客户端的功能,一直在搁浅。 幸好,最近我参与了一个调查问卷,以开发者的身份参与了涂鸦智能的开源项目,获得的了涂鸦智能所提供的开发套件,今天就和大家分享一下这个开源项目,并介绍一下参与开发的流程,有兴趣或者有时间想玩的朋友们可以扫描以下二维码报名参与,本次活动免费为你准备了模组以及元器件,还有直播培训教程,手把手教你开发一款宠物喂食器,还是相当不错的。 依托涂鸦的智能模组,可以“轻代码”编程,轻松实现客户端的配置,打通了云端、MCU端的“轻代码”甚至“零代码”开发。所用到的硬件资源和平台如下: STM32F103C8T6最小系统板; 涂鸦wifi语音模组VWXR2; 涂鸦H-Bridge电机驱动板; 5V直流减速电机; 涂鸦IOT平台; keil5编程环境; 所采用的模组为涂鸦VWXR2,可以轻松实现配网,还具有语音功能。该wifi语音模组的链接如下: https://developer.tuya.com/cn/docs/iot/device-development/module/wifi-module/vwxr-series-module/vwxr2?id=K9eipxhzap92z 2 模组配网 对于WiFi模组而言,最重要的就是配网,所谓配网,就是让模组接入路由器,实现云端和模组的数据交互。通过USB/TTL将电脑和wifi模组连接。模组上用到的串口为TXD1和RXD1,需要和USB/TTL的串口交叉连接。 在配网的时候接上喇叭,可以发出相应的语音提示,非常的方便。 云串口助手的配网流程如链接所示: https://developer.tuya.com/cn/docs/iot/device-development/embedded-software-development/mcu-development-access/access-mode-simmulator/module-debugging-assistant-instruction?id=K9hs0cj3lf0au 涂鸦提供了云串口调试助手,技能实现云端的模拟,又能实现MCU的模拟。配网时,选择MCU模拟,联网协议选择Wi-Fi通用协议。 功能点调试文件,需要选择IOT平台所生产的json文件,这一点在后面的IOT平台会说到。json文件加载成功后,会显示16为的PID字符串,点击“开始调试”后会交互数据流,数据流都在左侧,这些数据流可以帮助开发者很快的了解“串口通讯协议”。在界面下方的操作-基础功能中,点击重置,会开始配网流程。这时候,打开手机“涂鸦智能”APP。 注意,目前只支持2.4G的路由器,如果路由器是5G的,需要根据提示设置一下。 3 IOT平台搭建 涂鸦智能可以做到“轻代码”设置“零代码”开发,因为在涂鸦的IOT平台上都给开发者配置好了,平台可以根据所用的IOT模组生成代码,开发者只需要移植代码就可以了。下面介绍详细的开发步骤。 首先注册IOT平台,之后选择右上角的“IOT平台”,如下图所示。 选择“创建产品”: 选择“小家电”,拉到底部选择“宠物喂食器”: 填写产品名称、产品型号等信息,通讯协议选择WI-Fi 之后,可以根据平台提供的功能裁剪自己所需要的功能,如喂食计划、开关、小夜灯等。 之后配置APP的界面,IOT平台提供了很多公版面板可供用户选择 之后,可以打开“涂鸦智能”APP扫面二维码,就可以在手机端生成界面。 手机端生成的界面如下图所示。 4 硬件配置&下载固件 在“硬件开发”界面,选择硬件,这里的硬件指的就是所使用的IOT模组,我所选用的模组是VWXR2模组,带语音功能。 硬件选择好之后,平台会自动生成基于该硬件的资料文档和SDK代码,需要开发者下载 下载开发资料,里面包含需要移植的mcu_sdk代码、json配置文件、串口通讯协议文件、云串口调试助手等文件。 其中json文件,就是《2-模组配网》中云串口助手索要加载的“功能点调试文件”。 5 mcu_sdk移植 在移植之前,我们需要一套代码,该代码能跑通串口程序。我上手有STM8和STM32的最小系统板,刚开始用STM8移植的,移植完后代码的大小为9K,而我的STM8只有8K的空间。所以,最后换成了STM32,开发环境为Keil5。 首先,把mcu_sdk文件复制到keil的工程目录下; 在左侧新建MCU_SDK工作组,并把mcu_sdk中的mcu_api.c、protocol.c以及system.c加载进去; 在keil中,右键属性或者点击菜单栏的魔法棒,在C/C++下添加mcu_sdk的路径。 之后按照开发者文档中MCU_SDK移植的操作流程进行移植,链接如下: https://developer.tuya.com/cn/docs/iot/device-development/embedded-software-development/mcu-development-access/wifi-mcu-sdk-solution/overview-of-migrating-tuyas-mcu-sdk?id=K9hhi0xr5vll9 通过研究protocol.c中的代码可以知道,IOT平台把功能都做成了单独的函数,函数的命名方式为: dp_download_xxx_handle(),xxx是不同的功能,如小夜灯为light,开关为switch。只需要在相应的函数下面添加操作就可以了,比如我的STM32最小系统板上有一个LED指示灯。我写的LED点亮函数为LED_Turn_ON(),LED熄灭函数为LED_Turn_OFF(),只需要把语句填上即可。 这时候,通过涂鸦智能APP就可以控制板子上灯的亮灭状态。 要实现宠物喂食器,还需要一个减速电机,减速电机还在购买中,没有到货。到货后继续。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    玩转嵌入式 单片机 AI 智能宠物喂食器

  • 工程师的姓氏很尴尬

    “高工,你设计图通过了么?” “王工,你真是越来越漂亮了!” “周公,Schedule 该更新了” “杨工,你这个数据分析还没提交啊” 很正常对不对。 你的内心一定是崩溃的。 #来来来,晒姓了# 来源:智慧汽车供应链(ID:IASC-CN) 编辑:Red K 转载:如需转载,注明出处 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    玩转嵌入式 工程师

  • 教你如何写出无法维护的代码

    三月离职季 对的,不要怀疑你的眼睛,你没有看错,本文就是教你写出让其他人无法维护的代码,又是三月离职季,谁还没有一个啥都不懂的领导?都憋屈了这么久了,难道还不允许我搞搞小动作吗?代码我都正常移交了,能不能看懂,难道要怪我吗? 下面我来给大家支个招。 变量/函数的命名 容易输入的名字。比如:Fred,asdf 单字母的变量名。比如:a,b,c, x,y,z(陈皓注:如果不够用,可以考虑a1,a2,a3,a4,….) 有创意地拼写错误。比如:SetPintleOpening, SetPintalClosing。这样可以让人很难搜索代码。 抽象。比如:ProcessData, DoIt, GetData… 抽象到就跟什么都没说一样。 缩写。比如:WTF,RTFSC …… (陈皓注:使用拼音缩写也同样给力,比如:BT,TMD,TJJTDS) 随机大写字母。比如:gEtnuMbER.. 重用命名。在内嵌的语句块中使用相同的变量名有奇效。 使用重音字母。比如:int  ínt(注:第二个 ínt不是int) 使用下划线。比如:_, __, ___。 使用不同的语言。比如混用英语,德语,或是中文拼音。 使用字符命名。比如:slash, asterix, comma… 使用无关的单词。比如:god, superman, iloveu…. 混淆l和1。字母l和数字1有时候是看不出来的。 伪装欺诈 把注释和代码交织在一起。 for(j=0; j<array_len; j+ =8) { total += array[j+0 ]; total += array[j+1 ]; total += array[j+2 ]; /* Main body of total += array[j+3]; * loop is unrolled total += array[j+4]; * for greater speed. total += array[j+5]; */ total += array[j+6 ]; total += array[j+7 ]; } 隐藏宏定义。如:#define a=b a=0-b,当人们看到a=b时,谁也想不到那是一个宏。 换行。如下所示,下面的示例使用搜索xy_z变得困难。 #define local_var xy\ _z // local_var OK 代码和显示不一致。比如,你的界面显示叫postal code,但是代码里确叫 zipcode. 隐藏全局变量。把使用全局变量以函数参数的方式传递给函数,这样可以让人觉得那个变量不是全局变量。 使用同意词。如: #define xxx global_var // in file std.h  #define xy_z xxx // in file ..\other\substd.h  #define local_var xy_z // in file ..\codestd\inst.h 使用相似的变量名。如:单词相似,swimmer 和 swimner,字母相似:ilI1| 或 oO08。parselnt 和 parseInt, D0Calc 和 DOCalc。还有这一组:xy_Z, xy__z, _xy_z, _xyz, XY_Z, xY_z, Xy_z。 重载函数。使用相同的函数名,但是其功能和具体实现完全没有关系。 操作符重载。重载操作符可以让你的代码变得诡异,感谢CCTV,感谢C++。这个东西是可以把混乱代码提高到一种艺术的形式。比如:重载一个类的 ! 操作符,但实际功能并不是取反,让其返回一个整数。于是,如果你使用 ! ! 操作符,那么,有意思的事就发生了—— 先是调用类的重载 ! 操作符,然后把其返回的整数给 ! 成了 布尔变量,如果是 !!! 呢?呵呵。 #define。看过本站那些混乱代码的文章,你都会知道宏定义和预编译对于写出不可读的代码的重大意义。不过,一个具有想像力的东西是——在头文件中使用预编译来查看这个头文件被include了几次,而被include不同的次数时,其中的函数定义完全不一样。 #ifndef DONE #ifdef TWICE // put stuff here to declare 3rd time around voidg(char* str); #define DONE #else // TWICE #ifdef ONCE // put stuff here to declare 2nd time around< voidg(void* str); #define TWICE #else // ONCE // put stuff here to declare 1st time around voidg(std::string str); #define ONCE #endif // ONCE #endif // TWICE #endif // DONE 文档何注释 在注释中撒谎。你不用真的去撒谎,只需在改代码的时候不要更新注释就可以了。 注释明显的东西。比如:/* add 1 to i */。 只注释是什么,而不是为什么。 不要注释秘密。如果你开发一个航班系统,请你一定要保证每有一个新的航班被加入,就得要修改25个以上的位置的程序。千万别把这个事写在文档中。 注重细节。当你设计一个很复杂的算法的时候,你一定要把所有的详细细设计都写下来,没有100页不能罢休,段落要有5级以上,段落编号要有500个以上,例如:1.2.4.6.3.13 – Display all impacts for activity where selected mitigations can apply (short pseudocode omitted). 这样,当你写代码的时候,你就可以让你的代码和文档一致,如:Act1_2_4_6_3_13() 千万不要注释度衡单位。比如时间用的是秒还是毫秒,尺寸用的是像素还是英寸,大小是MB还是KB。等等。另外,在你的代码里,你可以混用不同的度衡单位,但也不要注释。 Gotchas。陷阱,千万不要注释代码中的陷阱。 在注释和文档中发泄不满。 程序设计 Java Casts。Java的类型转型是天赐之物。每一次当你从Collection里取到一个object的时候,你都需要把其转回原来的类型。因些,这些转型操作会出现在N多的地方。如果你改变了类型,那么你不一定能改变所有的地方。而编译器可能能检查到,也可能检查不到。 利用Java的冗余。比如:Bubblegum b = new Bubblegom(); 和 swimmer = swimner + 1; 注意变量间的细微差别。 从不验证。从不验证输入的数据,从不验证函数的返回值。这样做可以向大家展示你是多么的信任公司的设备和其它程序员。 不要封装。调用者需要知道被调用的所有的细节。 克隆和拷贝。为了效率,你要学会使用copy + paste。你几乎都不用理解别人的代码,你就可以高效地编程了。(陈皓注:Copy + Paste出来的代码bug多得不能再多) 巨大的listener。写一个listener,然后让你的所有的button类都使用这个listener,这样你可以在这个listener中整出一大堆if…else…语句,相当的刺激。 使用三维数组。如果你觉得三维还不足够,你可以试试四维。 混用。同时使用类的get/set方法和直接访问那个public变量。这样做的好处是可以极大的挫败维护人员。 包装,包装,包装。把你所有的API都包装上6到8遍,包装深度多达4层以上。然后包装出相似的功能。 没有秘密。把所有的成员都声明成public的。这样,你以后就很难限制其被人使用,而且这样可以和别的代码造成更多的耦合度,可以让你的代码存活得更久。 排列和阻碍。把drawRectangle(height, width) 改成 drawRectangle(width, height),等release了几个版本后,再把其改回去。这样维护程序的程序员们将不能很快地明白哪一个是对的。 把变量改在名字上。例如,把setAlignment(int alignment)改成,setLeftAlignment, setRightAlignment, setCenterAlignment。 Packratting。保留你所有的没有使用的和陈旧的变量,方法和代码。 That’s Final。Final你所有的子结点的类,这样,当你做完这个项目后,没有人可以通过继承来扩展你的类。java.lang.String不也是这样吗? 避免使用接口。在java中,BS接口,在C++中BS使用虚函数。 避免使用layout。这样就使得我们只能使用绝对坐标。如果你的老大强制你使用layout,你可以考虑使用GridBagLayout,然后把grid坐标hard code. 环境变量。如果你的代码需要使用环境变量。(getenv() – C++ / System.getProperty() – Java ),那么,你应该把你的类的成员的初始化使用环境变量,而不是构造函数。 使用Magic number。参看《 Linux一个插曲 》。 使用全局变量。1)把全局变量的初始化放在不同的函数中,就算这个函数和这个变量没有任何关系,这样能够让我们的维护人员就像做侦探工作一样。2)使用全局变量可以让你的函数的参数变得少一些。 配置文件。配置文件主要用于一些参数的初始化。在编程中,我们可以让配置文件中的参数名和实际程序中的名字不一样。 膨胀你的类。让你的类尽可能地拥有各种臃肿和晦涩的方法。比如,你的类只实现一种可能性,但是你要提供所有可能性的方法。不要定义其它的类,把所有的功能都放在一个类中。 使用子类。面向对象是写出无法维护代码的天赐之物。如果你有一个类有十个成为(变量和方法)你可以考虑写10个层次的继承,然后把这十个属性分别放在这十个层次中。如果可能的话,把这十个类分别放在十个不同的文件中。 混乱你的代码 使用XML。XML的强大是无人能及的。使用XML你可以把本来只要10行的代码变成100行。而且,还要逼着别人也有XML。 使用不同的进制。比如:10 和010不是一样的。再比如:array = new int[]{   111,   120,   013,   121,}; 尽量使用void*。然后把其转成各种类型 使用隐式的转型。C++的构造函数可以让你神不知鬼不觉得完成转型。 分解条件表达式。如:把 a==100分解成,a>99 && a<101 学会利用分号。如:if ( a );else;{   int d;   d = c;} 间接转型。如:把double转string,写成new Double(d).toString() 而不是 Double.toString(d) 大量使用嵌套。一个NB的程序员可以在一行代码上使用超过10层的小括号(),或是在一个函数里使用超过20层的语句嵌套{},把嵌套的if else 转成 [? :] 也是一件很NB的事。 使用C的变种数组。myArray[i] 可以变成*(myArray + i) 也可以变成 *(i + myArray) 其等价于 i[myArray]。再看一个函数调用的示例,函数声明:int myfunc(int q, int p) { return p%q; } 函数调用myfunc(6291, 8)[Array]; 长代码行。一行的代码越长越好。这样别人阅读时就需要来来回回的 不要较早的return。不要使用goto,不要使用break,这样,你就需要至少5层以上的if-else来处理错误。 不要使用{}。不要在if else使用{},尤其是在你重量地使用if-else嵌套时,你甚至可以在其中乱缩进代码,这样一来,就算是最有经验的程序员也会踩上陷阱。 使用宏定义。宏定义绝对是混乱C/C++代码的最佳利器。 琐碎的封装。比较封装一个bool类,类里面什么都做,就是一个bool. 循环。千万不可用for(int i=0; i

    玩转嵌入式 代码 程序员

  • 字节跳动张一鸣:大学四年收获及工作感悟

    玩转嵌入式 互联网 张一鸣 字节跳动

  • 硬件工程师常用的5V转3.3V的方法

    今天为大家分享19个5V转3.3V的多种方法。 1 使用LDO稳压器 标准三端线性稳压器的压差通常是 2.0-3.0V。要把 5V 可靠地转换为 3.3V,就不能使用它们。压差为几百个毫伏的低压降 (Low Dropout, LDO)稳压器,是此类应用的理想选择。图 1-1 是基本LDO 系统的框图,标注了相应的电流。 从图中可以看出, LDO 由四个主要部分组成: 3.3V输出的 VOH 大于 5V 输入的 VIH 3.3V输出的 VOL 小于 5V 输入的 VIL 能够使用这种方法的例子之一是将 3.3V LVCMOS输出连接到 5V TTL 输入。从表 4-1 中所给出的值可以清楚地看到上述要求均满足。 3.3V LVCMOS 的 VOH (3.0V)大于5V TTL 的VIH (2.0V) 3.3V LVCMOS 的 VOL (0.5V)小于 5V TTL 的VIL (0.8V)。 如果这两个要求得不到满足,连接两个部分时就需要额外的电路。可能的解决方案请参阅技巧 6、7、 8 和 13。 6 使用MOSFET转换器 如果 5V 输入的 VIH 比 3.3V CMOS 器件的 VOH 要高,则驱动任何这样的 5V 输入就需要额外的电路。图 6-1 所示为低成本的双元件解决方案。 在选择 R1 的阻值时,需要考虑两个参数,即:输入的开关速度和 R1 上的电流消耗。当把输入从 0切换到 1 时,需要计入因 R1 形成的 RC 时间常数而导致的输入上升时间、 5V 输入的输入容抗以及电路板上任何的杂散电容。输入开关速度可通过下式计算: 由于输入容抗和电路板上的杂散电容是固定的,提高输入开关速度的惟一途径是降低 R1 的阻值。而降低 R1 阻值以获取更短的开关时间,却是以增大5V 输入为低电平时的电流消耗为代价的。通常,切换到 0 要比切换到 1 的速度快得多,因为 N 沟道 MOSFET 的导通电阻要远小于 R1。另外,在选择 N 沟道 FET 时,所选 FET 的VGS 应低于3.3V 输出的 VOH。 7 使用二极管补偿 表 7-1 列出了 5V CMOS 的输入电压阈值、 3.3VLVTTL 和 LVCMOS 的输出驱动电压。 5V CMOS 输入的高、低输入电压阈值均比 3.3V 输出的阈值高约一伏。因此,即使来自 3.3V 系统的输出能够被补偿,留给噪声或元件容差的余地也很小或者没有。我们需要的是能够补偿输出并加大高低输出电压差的电路。 输出电压规范确定后,就已经假定:高输出驱动的是输出和地之间的负载,而低输出驱动的是 3.3V和输出之间的负载。如果高电压阈值的负载实际上是在输出和 3.3V 之间的话,那么输出电压实际上要高得多,因为拉高输出的机制是负载电阻,而不是输出三极管。 如果我们设计一个二极管补偿电路 (见图 7-1),二极管 D1 的正向电压 (典型值 0.7V)将会使输出低电压上升,在 5V CMOS 输入得到 1.1V 至1.2V 的低电压。它安全地处于 5V CMOS 输入的低输入电压阈值之下。输出高电压由上拉电阻和连至3.3V 电源的二极管 D2 确定。这使得输出高电压大约比 3.3V 电源高 0.7V,也就是 4.0 到 4.1V,很安全地在 5V CMOS 输入阈值 (3.5V)之上。 注:为了使电路工作正常,上拉电阻必须显著小于 5V CMOS 输入的输入电阻,从而避免由于输入端电阻分压器效应而导致的输出电压下降。上拉电阻还必须足够大,从而确保加载在 3.3V 输出上的电流在器件规范之内。 8 使用电压比较器 比较器的基本工作如下: 杂散电容 = 30 pF 负载电容 = 5 pF 从 0.3V 至 3V 的最大上升时间 ≤ 1 μs 外加源电压 Vs = 5V 13 电平转换器 尽管电平转换可以分立地进行,但通常使用集成解决方案较受欢迎。电平转换器的使用范围比较广泛:有单向和双向配置、不同的电压转换和不同的速度,供用户选择最佳的解决方案。 器件之间的板级通讯 (例如, MCU 至外设)通过 SPI 或 I2C™ 来进行,这是最常见的。对于SPI,使用单向电平转换器比较合适;对于 I2C,就需要使用双向解决方案。下面的图 13-1 显示了这两种解决方案。 ▶ 模拟 3.3V 至 5V 接口的最后一项挑战是如何转换模拟信号,使之跨越电源障碍。低电平信号可能不需要外部电路,但在 3.3V 与 5V 之间传送信号的系统则会受到电源变化的影响。例如,在 3.3V 系统中,ADC转换1V峰值的模拟信号,其分辨率要比5V系统中 ADC 转换的高,这是因为在 3.3V ADC 中,ADC 量程中更多的部分用于转换。但另一方面,3.3V 系统中相对较高的信号幅值,与系统较低的共模电压限制可能会发生冲突。 因此,为了补偿上述差异,可能需要某种接口电路。本节将讨论接口电路,以帮助缓和信号在不同电源之间转换的问题。 14 模拟增益模块 从 3.3V 电源连接至 5V 时,需要提升模拟电压。33 kΩ 和 17kΩ 电阻设定了运放的增益,从而在两端均使用满量程。11 kΩ 电阻限制了流回 3.3V 电路的电流。 15 模拟补偿模块 该模块用于补偿 3.3V 转换到 5V 的模拟电压。下面是将 3.3V 电源供电的模拟电压转换为由 5V电源供电。右上方的 147 kΩ、 30.1 kΩ 电阻以及+5V 电源,等效于串联了 25 kΩ 电阻的 0.85V 电压源。 这个等效的 25 kΩ 电阻、三个 25 kΩ 电阻以及运放构成了增益为 1 V/V 的差动放大器。0.85V等效电压源将出现在输入端的任何信号向上平移相同的幅度;以 3.3V/2 = 1.65V 为中心的信号将同时以 5.0V/2 = 2.50V 为中心。左上方的电阻限制了来自 5V 电路的电流。 16 有源模拟衰减器 此技巧使用运算放大器衰减从 5V 至 3.3V 系统的信号幅值。 要将 5V 模拟信号转换为 3.3V 模拟信号,最简单的方法是使用 R1:R2 比值为 1.7:3.3 的电阻分压器。 然而,这种方法存在一些问题:

    玩转嵌入式 稳压器

  • 问题整理,十问EMC

    学习接触一门新的技术,总会遇到各种各样的问题,学习EMC也不例外。EMC(电磁兼容)包括EMS(电磁敏感度)和EMI(电磁干扰)两部分,通常我们所说的解决EMC问题,其实就是解决电子设备对外辐射干扰,或者如何防止设备、电子元件被外界电磁波干扰的问题。学习EMC要重视基础知识,像电磁波、电磁场等入门理论,有迫切学会的愿望,在实践中与别人多人交流,几个人的学习交流效果要远比一个人学习问题效果要好得多。 下面整理了EMC工程师常见的兼容性问题、具体解决方法,以供大家做学习笔记。

    玩转嵌入式 EMC

  • 多层板如何分层?PCB如何设计才能发挥EMC最优效果?

    PCB的EMC设计考虑中,首先涉及的便是层的设置;单板的层数由电源、地的层数和信号层数组成;在产品的EMC设计中,除了元器件的选择和电路设计之外,良好的PCB设计也是一个非常重要的因素。 PCB的EMC设计的关键,是尽可能减小回流面积,让回流路径按照我们设计的方向流动。而层的设计是PCB的基础,如何做好PCB层设计才能让PCB的EMC效果最优呢? 1 PCB层的设计思路 PCB叠层EMC规划与设计思路的核心就是合理规划信号回流路径,尽可能减小信号从单板镜像层的回流面积,使得磁通对消或最小化。 单板镜像层 镜像层是PCB内部临近信号层的一层完整的敷铜平面层(电源层、接地层)。主要有以下作用: (1)降低回流噪声:镜像层可以为信号层回流提供低阻抗路径,尤其在电源分布系统中有大电流流动时,镜像层的作用更加明显。 (2)降低EMI:镜像层的存在减少了信号和回流形成的闭合环的面积,降低了EMI; (3)降低串扰:有助于控制高速数字电路中信号走线之间的串扰问题,改变信号线距镜像层的高度,就可以控制信号线间串扰,高度越小,串扰越小; (4)阻抗控制,防止信号反射。 镜像层的选择 (1)电源、地平面都能用作参考平面,且对内部走线有一定的屏蔽作用; (2)相对而言,电源平面具有较高的特性阻抗,与参考电平存在较大的电势差,同时电源平面上的高频干扰相对比较大; (3)从屏蔽的角度,地平面一般均作了接地的处理,并作为基准电平参考点,其屏蔽效果远远优于电源平面; (4)选择参考平面时,应优选地平面,次选电源平面 2 磁通对消原理 根据麦克斯韦方程,分立的带电体或电流,它们之间的一切电及磁作用都是通过它们之间的中间区域传递的,不论中间区域是真空还是实体物质。在PCB中磁通总是在传输线中传播的,如果射频回流路径平行靠近其相应的信号路径,则回流路径上的磁通与信号路径上的磁通是方向相反的,这时它们相互叠加,则得到了通量对消的效果。 3 磁通对消的本质 磁通对消的本质就是信号回流路径的控制。 4 右手定则解释磁通对消效果 如何用右手定则来解释信号层与地层相邻时磁通对消效果,解释如下: (1)当导线上有电流流过时,导线周围便会产生磁场,磁场的方向以右手定则来确定。 (2)当有两条彼此靠近且平行的导线,如下图所示,其中一个导体的电流向外流出,另一个导体的电流向内流入,如果流过这两根导线的电流分别是信号电流和它的回流电流,那么这两个电流是大小相等方向相反的,所以它们的磁场也是大小相等,而方向是相反的,因此能相互抵消。     5 六层板设计实例 对于六层板,优先考虑方案3 分析:  (1)由于信号层与回流参考平面相邻,S1、S2、S3相邻地平面,有最佳的磁通抵消效果,优选布线层S2,其次S3、S1。  (2)电源平面与GND平面相邻,平面间距离很小,有最佳的磁通抵消效果和低的电源平面阻抗。  (3)主电源及其对应的地布在4、5层,层厚设置时,增大S2-P之间的间距,缩小P-G2之间的间(相应缩小G1-S2层之间的间距),以减小电源平面的阻抗,减少电源对S2的影响。 对于六层板,备选方案4 分析: 对于局部、少量信号要求较高的场合,方案4比方案3更适合,它能提供极佳的布线层S2。 最差EMC效果,方案2   分析: 此种结构,S1和S2相邻,S3与S4相邻,同时S3与S4不与地平面相邻,磁通抵消效果差。 6 总结 PCB层设计具体原则:  (1)元件面、焊接面下面为完整的地平面(屏蔽); (2)尽量避免两信号层直接相邻; (3)所有信号层尽可能与地平面相邻; (4)高频、高速、时钟等关键信号布线层要有一相邻地平面。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    玩转嵌入式 PCB EMC

  • Arm推出Arm®v9架构:面向人工智能、安全和专用计算的未来

    新闻重点: ◆ 全新的Armv9架构将会成为未来3,000亿颗基于Arm架构芯片的先驱; ◆ 基于通用计算具备的经济性、设计自由度和可及性的优势,Arm v9架构进一步推进专用计算处理; ◆ 提供更高的性能、增强的安全性以及数字信号处理和机器学习功能。 2021年3月31日,Arm宣布推出Arm®v9架构,以满足全球对功能日益强大的安全、人工智能(AI)和无处不在的专用处理的需求。Armv9立足于Armv8的成功基础,是这十年来最新的Arm架构。Armv8正在当今需要计算的领域中驱动最佳的每瓦性能表现。 Arm首席执行官Simon Segars表示,“在展望由AI定义的未来时,我们必须夯实先进的计算基础,以应对未来的独特挑战。Armv9就是我们给出的答案。在通用计算所具备的经济性、设计自由度和可及性的基础上,市场需要普适专用、安全而强大的处理能力,这将驱动下一个3,000亿个基于Arm架构的芯片发展,而Armv9就是这些芯片的技术先驱。” 基于Arm架构的芯片出货量在持续加速,过去五年基于Arm架构的设备出货量超过1,000亿。按照目前的速度,无论是在终端、数据网络还是云端,全球100%的共享数据很快将会通过Arm技术进行处理。如此广泛的应用让Arm肩负更多的责任和使命,为此,Arm在Armv9中提供更多的安全性和性能,顺应AI、物联网和5G在全球范围内的强劲发展,加速每个产业应用从通用计算转向专用计算。 安全:计算的最大挑战 为了解决当今最大的技术挑战——保护全球数据安全,Armv9架构路线图引入了Arm机密计算架构(Confidential Compute Architecture, CCA)。机密计算通过打造基于硬件的安全运行环境来执行计算,保护部分代码和数据,免于被存取或修改,甚至不受特权软件的影响。 Arm CCA将引入动态创建机密领域(Realms)的概念,机密领域面向所有应用,运行在独立于安全或非安全环境之外的环境中,以实现保护数据安全的目的。例如,在商业应用中,机密领域可以保护系统中商用机密数据和代码,无论它们正被使用、闲置或正在传输中。事实上,在最近一项针对企业高管的Pulse调查中,超过九成的受访者相信,机密计算可以帮助降低企业在安全方面投入的成本,如此一来,他们可以转而大量的投入工程创新。 微软Azure Edge和平台部门企业副总裁兼首席技术官Henry Sanders表示,“随着从边缘到云的用例越来越复杂,我们已经不能用一个放之四海而皆准的方案来解决所有用例。因此,异构计算正变得越来越普遍,这需要硬件和软件开发商之间加强协同。Arm与微软密切合作开发的Armv9机密计算功能就是硬件和软件之间协同的一个很好的范例。Arm处于独一无二的位置,可以在生态系统的核心加速异构计算,在驱动数十亿设备的计算架构上促进开放创新。” 无处不在的AI:呼唤专用、可扩展的解决方案 AI工作负载的普遍性和广泛性需要更多样化和专用的解决方案。据估计,到21世纪20年代中期,全球将有超过80亿台搭载AI语音辅助的设备。且90%或更多设备上的应用程序将包含AI元素以及基于AI的界面,如视觉或语音。 为了满足这一需求,Arm与富士通合作开发了可伸缩矢量扩展(Scalable Vector Extension, SVE)技术,并驱动了世界上最快的超级计算机“富岳”。在此基础上,Arm为Armv9开发了SVE2,以便在更广泛的应用中实现增强的机器学习和数字信号处理能力。 SVE2增强了对在CPU上本地运行的5G系统、虚拟和增强现实以及ML工作负载的处理能力,例如图像处理和智能家居应用。在未来几年,Arm将进一步扩展其技术的AI能力,除了在其Mali™ GPU和Ethos™ NPU中持续进行AI创新外,还将大幅增强CPU内的矩阵乘法。 通过系统设计实现性能最大化 在过去的五年,Arm技术每年都以超过业界的速度提升CPU性能。Arm在新一代架构Armv9上将保持这个速度,预计未来两代移动和基础设施CPU的性能提升将超过30%。 然而,随着行业从通用计算向普遍的专用处理发展,每年两位数的CPU性能提升是不够的。除了增强专用处理能力,Arm的全面计算(Total Compute)设计方法将通过集中的系统级硬件和软件优化以及用例性能的提高,加速总体计算性能。 通过将全面计算的设计原则应用在包含汽车、客户端、基础设施和物联网解决方案的整个IP组合中,Armv9系统级技术将遍及整个IP解决方案,并改善个别IP。此外,Arm还在开发多项技术以提高频率、带宽、缓存,并降低内存延迟,从而最大限度地提升基于Armv9的CPU性能。 下一个计算十年的愿景 Arm高级副总裁、首席架构师兼技术院士Richard Grisenthwaite表示,“更复杂的基于AI的工作负载需求,正在推动更安全和专用处理的发展,这将是打开新市场、抓住新机遇的关键。Armv9将赋能开发者通过弥合软硬件之间的关键差距,构建和编程未来的可信计算平台,同时实现标准化,帮助我们的合作伙伴在更快的上市时间和成本控制之间取得平衡,同时能够创建自己独特的解决方案。”

    Arm 芯片 ARM 人工智能 AI

发布文章