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

摩登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平台开户_编程入门到进大厂,你需要这套学习架构

我相信大多数学习编程的同学都有着对大公司的憧憬。技术、声望、薪资、福利,这些都足以成为吸引你进入大厂的理由。 但是,如何进入大厂呢? 对于很多同学来说,通往大厂的道路并不明朗,不知道是否有希望,也不知道怎么努力,感觉遥不可及。 其实,我身边有很多成功拿到大厂 offer 的同学,他们并不都是大家想象中的 985 名校硕士、竞赛金牌、开源大佬、编程神童。相反,我看到了很多背景一般却凭实力冲进大厂的同学,而且他们在工作中的表现非常出彩! 通过和这些同学的交流,我发现他们在编程学习和求职方法上有一些共性,再结合自己的真实经历,我总结了一套 较通用的编程学习和求职架构。 无论你现在处于编程学习的哪个阶段,又或者只是对编程有兴趣,下面的内容都会对你有一定帮助。让你看到更清晰的未来,并为之而努力。 首先,要明确一点,编程学习没有捷径!必须明晰目标、拉长战线、掌握技巧、持续学习、做足准备,才能立于不败之地。 下图是我总结的编程学习架构: 编程学习架构 如图,我将编程学习分为 7 个部分。为什么叫做 “学习架构” 而不是 “学习路线” 呢?因为在编程学习中,有些事情不是严格按照顺序去做,而是在我们整个学习过程中都要长期坚持的。 下面详细解释一下这套编程学习架构的 7 个部分。 1. 初入茅庐,海纳百川 刚开始学习编程时,难免会感到迷茫,如果你初入大学,会发现身边大多数的同学选择加入了学生会、各种社团来丰富校园生活,而不是一门心思去学习。其实这个阶段,并不需要太过关心和考虑以后找工作的问题,要做的事情就是学好大学的一些通识课程,保证成绩不能太差。不要提成绩无用论,除了学校之外,高的绩点也是简历的牌面,如果能取得前几名的好成绩,是绝对的加分项! 对于计算机专业的同学,刚开始并不会接触到很深入的知识,也很少有机会去开发一个完整的作品。基本都是学习 C、 C++ 等编程语言,因为涉及和能够学习到的知识相对丰富。但是,想要学好编程,课本上的知识是远远不够的,一定要 自学! 自学什么呢? 其实刚开始的时候大家并不知道自己擅长什么、真正喜欢什么、以后想做什么、从事哪方面的工作,因此,可以 “海纳百川”,多了解和尝试各种编程语言、技术框架、专业知识等。比如在课堂教的编程语言之外,去自主学习下 Web 网站开发或者 Python。 怎么自主学习呢?看书? 过去几十年,我们的学习几乎一直依赖书本。但是如今,互联网上资源非常丰富,为我们自学编程提供了很大的方便。可以选择看纸质书、电子书,但是一定不要直接去啃那些很复杂的理论书籍,而是选择一些轻松有趣、相对简单、案例丰富的书籍。除了看书之外,可以选择 W3Cschool、实验楼、 FreeCodeCamp 等在线学习网站,边学边敲代码练习。还可以去 B 站上搜索一些视频教程,可能要比啃书学习要轻松得多! W3Cschool 在线编程入门实战 但是,无论你选择何种方式去学习, 一定要边学边练习,不必局限于一些习题或书中的代码片段,可以试着发挥自己的创意,去编写一些简单的网站或者实用的小工具,相信你会收获成就感,逐渐对编程产生兴趣。 这个阶段,除非你有非常明确的学习方向,否则没有必要对某一门技术过于执着,毕竟计算机领域很多技术和知识点是相通的,前期先多学习一些简单易懂的知识,会让编程学习轻松有趣一些。 2. 兴趣使然,纵横交贯 上一个阶段重在培养我们对编程学习的兴趣,当你学习了一些编程知识和编程语言后,你已经对很多零碎的知识产生了印象,后面学习新知识也会比之前更加容易和迅速。 这个阶段是你编程能力开始突飞猛进的时候。由于时间和精力有限,你要做的是从你已经学到的知识库中挑选出相对感兴趣的部分,比如某一门编程语言(比如 Java),或者是某一个领域(比如 NLP)。然后对这部分知识进行相对深层次的学习,可以去读一本经典的书籍,了解这门技术的特性,甚至是阅读相关源码。 在重点深入学习一门技术的同时,还需要继续保持开放,接触更多的新知识,而不是深陷其中、无法自拔。计算机的很多知识是相互关联的,如果多学习一些不同方面的知识,我们更容易将那些零碎的知识点串联成网,从而开拓思维,得到更大的收益。 但是,算法、数据结构、计算机网络等知识点比较特殊,即使没有兴趣,也要认真地去学习!因为它们可以培养你的思维,提升你的程序设计能力,对于程序员来说太重要了。毕竟大多编程语言都是相通的, 语言只是工具,思想才是武器。 听起来可能比较抽象,但在实际面试和工作中往往这些零碎的小知识会发挥巨大的作用。比如,面试互联网大公司时,基本每一轮面试都会考察几道算法题目;面试后台开发岗位,也一定会问到计算机网络、操作系统的知识。在工作中,我们也经常会用到一些算法的思想来解决问题,比如滑动窗口、时间轮、布隆过滤器等。 这个阶段,我推荐大家选择主流的技术和框架进行深层次的学习,比如 Java 语言的 SSM 和 SpringBoot 框架。主流的技术教程多、文档多、遇到问题更容易解决,而且通常容易上手,能做出一些个人作品,增加兴趣和成就感。 3. 有的放矢,十年磨剑 如果你已经对某个编程语言或知识领域产生了浓厚的兴趣,或者已经能够得心应手地开发个人作品,那么恭喜你进入到下一个阶段。 本阶段要做的是 确定自己的职业方向,做到有的放矢。 为什么没有在一开始就让大家明确目标呢?**因为确定目标的时机很重要,过早或过晚都不好。**很多人在上大学前可能对某一个职业特别憧憬,整天嚷嚷着自己一定要成为自己想成为的人,但是直到你真正接触这个职业或者其相关的知识一段时间,你可能才意识到自己并不适合。比如我小时候想当律师,整天看 CCTV 12,也啃了几本法律书籍,但是后来自己记性差了,而且发现自己对编程的兴趣更大,因此也放弃了之前的目标。庆幸的是,我不是在大学期间才放弃律师这个职业,没有耽误到我学习编程知识。大学时间短暂,没有太多的时间给我们去迷茫和折返。 既然已经有了喜欢的编程技术和领域,确定职业目标就相对简单了。每个人有不同的选择,建议先从自己的兴趣出发,选择和自己的兴趣和所学技能相匹配的岗位。同时,也要考虑到目前的市场需求,最好看一些数据和调研,不要选择冷门职业。还有一些其他纳入考虑的点,比如薪资、工作时长、地点等等。确定职业后,还可以进一步地去选择公司。建议给自己定一个最高的目标,比如进入互联网大厂,要相信自己,只有饥饿的狼才能吃到美味的饭。 确定好职业目标后,就要根据职业,堆积打磨自己的技术栈。 这是一个十年磨剑的过程,重在坚持。 首先要确认你的目标岗位需要哪些相关的技术,推荐直接到大互联网公司的招聘官网来看对某岗位的技术要求,比如 Java 开发可以看阿里和美团官网、 C++ 看腾讯官网、 Golang 或 PHP 看字节跳动官网。 腾讯招聘全栈开发方向的岗位要求 知道要重点学习哪些技术后,要制定一个明确的计划,将大的目标拆解为依次去学习每项小的技术,可以参考网上的一些 学习路线,按照主次对技术知识进行排序,并规定好学习每个技术花费的时间,从而有一个整体预期,少走弯路。而不是杂乱无章地去学习,主次不分。 制定学习计划 比如 Java 后台开发岗位一般会要求 Java 基础编程、 Java 并发编程、数据库、计算机网络、操作系统、设计模式等,相应的技术栈可以是: Java、 MySQL、 SSM 框架、 Redis、 Linux 等等。确定技术栈后,要按照计划,对每一项技术进行全面且系统的学习,推荐阅读一些经典书籍,比如 Java 可以看《 Java 核心技术卷 1 》、《 Java 编程思想 》等。 如果要进大公司,编程学习就不能仅仅止步于 “会用”,而是要懂得 “巧用”、“精用”,甚至能够对知识点进行复刻和创造。比如学习 MySQL 要去了解其底层的数据结构和调优策略,学习 Spring…

摩登3平台登录_安森美半导体:工业机器视觉细分领域的隐形冠军

文章来源:中国工控网 众多周知,在汽车半导体领域,安森美半导体堪称大牛,你或许不知道的是,在工业细分领域,安森美半导体亦为翘楚。 在2020年9月25日举行的安森美半导体智能感知策略及方案在线媒体交流会上,中国工控网获悉,据欧洲第三方调研公司Yole Development数据显示,安森美半导体在工业机器视觉领域的市场份额排名第一。 致力于推动高能效电子的创新,安森美半导体提供全面的高能效联接、感知、电源管理、模拟、逻辑、时序、分立及定制器件阵容,使客户能够减少全球的能源使用。安森美半导体市场范围非常广泛,核心市场主要是在汽车、工业、通信、消费类和计算。 “我们最大的市场份额集中在汽车、工业和通信。”说,“这些行业有几个非常重要的共同点,一是对产品性能要求非常高;二是对产品质量和可靠性要求非常高;三是对产品长期供货的持续性要求非常高。而这正是安森美半导体的优势所在。” 智能感知部(ISG)关注三大市场 安森美半导体主要分为三个产品部门,分别是电源方案部(PSG)、先进方案部(ASG)和智能感知部(ISG)。设立于2014年的智能感知部(ISG)年轻且活跃,是安森美半导体目前成长速度最快的部门。 “汽车、机器视觉和边缘人工智能是智能感知部主攻的三个市场方向。”易继辉说,汽车行业虽属传统行业,但近年来得益于电力化、智能化,汽车行业焕发新生。 为了打造更加安全、舒适的智能汽车,各类感知产品应用需求激增。“安森美半导体在汽车智能感知方面成长速度远比汽车行业本身发展速度快得多,就是因为汽车采用新技术的速度非常快。” 同样,在工业4.0时代,历史悠久的机器视觉在自动化、人工智能等技术的加持下不断产生新的发展动力和活力。 特别是在中国市场,越来越多的制造企业考虑采用机器视觉帮助生产线实现检查、测量和自动识别等功能,以提高效率并降低成本,从而实现生产效益最大化。 机器视觉作为新兴技术被寄予厚望,被认为是自动化行业一个具备光明前景的细分市场。 从全球范围看,由于下游消费电子、汽车、半导体、医药等行业规模持续扩大,全球机器视觉市场规模呈快速增长趋势,2017年已突破80亿美元,并预计到2020年全球市场规模将达到125亿美元,2025年将超过192亿美元。 相较于前两者,边缘人工智能属于行业“新兵”,但潜力无限。“边缘人工智能主要是由人工智能、5G、IoT等新技术导入后开发出新的应用,发展非常迅速,经常隔几天、隔几个礼拜,就会有新客户打电话来说他们有新的想法和应用,希望得到帮助。”易继辉举例道。 在上述核心市场,安森美半导体智能感知部都做了长时间的投入和布局,包括图像感知,多光谱、高光谱的感知,激光雷达感知、毫米波雷达感知、传感器融合此类深度感知。这些都在推动人工智能和第四次工业革命的进步。 工业人工智能应用,图像传感器是关键 随着智能制造的逐步深入推进,工业机器视觉、机器人、人工智能技术发展迅速,图像传感器是助其发展的关键技术。 工业人工智能应用的发展给图像传感器带来了更高的挑战,包括推动了后者在全局快门性能、高速拍摄、大分辨率、使用不可见光谱区域和三维体积深度提供的信息进行关键推断,以及神经网络处理的发展。 易继辉举例说,平板检测是整个工业机器视觉行业中,对图像传感器最有挑战性的应用,从1K、2K、4K一直到8K,像素要求逐渐提高。 具体来讲,平板检测过程分两步: 第一步是暗检测,上电前主要检测一些指纹、划痕和其他物理上的问题; 第二步是上电以后,检测发光源。 LED有一个亮板在后面作为发光源,而OLED,特别是AMOLED(Active Matrix OLED)的每个像素都是一个单独发光源,像素和像素之间发光的强度和色彩的均匀度,都要能够很准确地侦测出来,这就对图像传感器的要求非常高。 “过去检测LED面板上的1颗像素,对应需要9颗像素(3×3),OLED则对应需要16颗(4×4),甚至25颗(5×5)像素。平板检测对图像传感器的像素要求越来越高,从4,500万到1.5亿像素,甚至超过2亿像素。”易继辉说。 易继辉以为例,阐述图像传感器技术发展路线图。 首先,图像传感器的分辨率在逐年提升,从过去的200万像素、500万像素、800万像素、1200万像素,逐步升级到现在超过2000万像素。 其次,噪声导数相当于图像质量,在同样大小的尺寸下的图像传感器逐年随着像素的增大,图像质量也在不断提高。 此外,带宽也是逐年提高。比如,一个29×29mm2标准的工业用摄像头,十年前可能只是200万像素,后来逐渐增加到300万、500万、1200万,今年已经能够用到1600万像素。 全局快门,在高速运动下使图像不会有拖影;内校正,像素内的校正,以前都是在系统里通过软件校正,现在直接做到硬件里,像素内部去做图像校正; 工艺节点,从110纳米到65纳米,再到45纳米,甚至更小,充分利用了摩尔定律的优势,即成本、尺寸、耗电量都在逐年下降; 背照式,在同样尺寸下分辨率越来越高,像素尺寸可能越来越小,感光量、感光度,特别是暗光下,性能可能就会降低,背照式就是用来提高感光能力; 堆栈架构,以后就不光是两维空间了,而是三维、堆栈式、两次堆栈、三次堆栈都有可能实现。 以后不光把模拟和数字信号放在第二层,甚至于人工智能一些算法放在第三层里,整个图像传感器就是高智能化的图像传感器。 可以预见,图像传感器的开发正在从仅提供RGB和二维坐标信息转移到新的更丰富的形式。图像传感器可提供更多类型的数据,无论是深度数据,还是增加的光谱信息,以及人工智能合并这些数据集并实现高级决策,从而使系统能够通过新的测量和决策机会提供更快、更准确的结果。 作为工业机器视觉的领导厂商,安森美半导体会以,应对工业人工智能应用挑战并推进智能制造的创新。   免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3娱乐怎么样?_硬件工程师太难了

来源 | 网络 一个硬件工程师在公司要接触多少人,有多少锅要背,你知道吗? 总体 vs. 硬件 PCB:“尼玛,你又要改方案?兄弟我才把器件布局好。” 总体:“原来的方案真的要变,考虑到散热,需要改封装。你现在的布局需要修改啊!” PCB:“这板子根本布局放不下去!” 总体:“我自己放过了,可以的。” PCB:“你考虑过走线吗?这么布线需要多层板,要埋盲孔。” 总体:“不能使用多层板,要考虑到成本。现在做板子的钱还不能够报销。” PCB:“You Can You Up, No Can No BB.” 总体:“你不服,咋地?” 机械结构 vs. 硬件 结构:”如果车模上的结构可以随意变大,我难道不会给你搞个足够大的吗?” PCB:”如果电路元器件都像搭积木一样随便积极,我不会给你搞个足够小的吗?” 结构:”听说你们PCB设计,跟那乳沟一样,挤挤就有了。你克服一下。” PCB:“你…..我…….” 软件 vs. 硬件 软件:“你这电路板有问题,调不通!” 硬件:“毛?你最好重查你的代码,绝逼有错!” 软件:“屁!就那么点代码还能出错?” 硬件:“扯!这条线路总共就几条线,我都查过了好几遍,有错我能不知道?” 软件:“别和老子扯犊子。就是你电路有问题。” 硬件内心:“滚!我送你离开,千里之外。” 总体 vs. 硬件 总体:“你选的这个电源方案怎么样?” 硬件:“性能没问题,面包板上测试过了。” 总体:“好!把它布局在30×15mm的电路板内!” 硬件:“布不下,需要考虑到器件散热和干扰问题。” 总体:“别瞎BB。如果布不下,就把你布进去!快点。” 硬件:“It is up to you!” 热设计 vs. 硬件 硬件:“我们刚刚出了一个新方案,你帮助再热仿真一下吧。” 热设计:“过不了!” 硬件:“你仿过了吗?” 热设计:“我用脑袋仿过了。你过不了,需要降规格!” 硬件:“你是不是非要哥哥我用热风枪给你脑袋加热你才能仿那?” 热设计:“你这个散热过不了。” 硬件:“你就加一个散热器呀。” 热设计:“你这个尺寸,散热器标准库中没有合适的呀。” 硬件:“加个铜皮不就可以吗?” 热设计:“铜皮?库里面更没有了,我怎仿那?” 采购 vs. 硬件 PCB:“终于盼到器件买回来了。我把器件的封装建好,刚刚布完了线。” 采购:“商家说原来封装的器件没了,我就买回来另一个封装同型号的。” PCB:“大哥,换封装,你就不能早告诉我一声?” … vs. X vs. Y vs. Z vs. … 领队:“你这个EMC措施太复杂!这么多防护和步骤,现场比赛很容易出问题。” EMC:“没办法。不搞这么多,干扰无法解决。这主要是PCB结构设计有问题,器件拥挤,方位错乱。” PCB:“如果我能够有足够空间布板的话,我才不会费劲将这些器件拥挤在一起呢。这主要是机械结构给我留的空间太小了!” 结构:“车模就那么大,还需要放那么多的传感器。哪有空间留给你布电路板那?这主要是设计传感器的问题,非要安装这么多传感器及其支架,少一点不行吗?” 传感器:“就这些传感器,搞控制算法的还嫌不够呢!本来还可以通过选择小的传感器减低体积,但搞算法的嫌弃小的传感器精度不够啊!” 算法:“没有这么多高精度传感器,车模就是瞎子。我们编算法的再灵巧,也难为无米之炊呀。这主要是队长要求车模要跑得快。如果车模慢慢的跑,只要几个低精度的传感器也就可以了。” 领队:“说来说去,最终是埋怨要求车模跑得快。我跟你们有仇啊?如果车模跑得慢,我可没脸去参加比赛。” 免责声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。 ———— END ———— 推荐阅读: 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3注册网站_“2020年嵌入式软件秋招经验和对嵌入式软件未来的一点思考”

乐鑫科技(提前批) 选择填空60/编程40,基础题不难,编程题两道算法。 联发科(提前批) 嵌入式软件岗。台企做射频芯片,wifi/蓝牙这种,台湾第一,给的不高但有加班费,且大陆接触不到核心技术。笔试C基础选择填空简答翻译/两道编程。编程题是分割字符串,双向链表查找非0节点并打印,现在看很简单,C基础我刷的《王道程序员面试宝典》。 一面纯聊项目,并适当引申问一些基础知识,引申了:arm工作模式/静动态链接的区别,最后一个项目我做的机器学习,单纯为发论文那种,没说清楚,估计扣分了。又问非技术问题,和同学如何分工合作,与导师意见不一致怎么办,第一次被问,答的很一般,但也不是说的差。整体感觉聊的还行,可是挂了,群里好多人都是这样,可能是掐尖吧。 汇顶(提前批) BSP/驱动岗。先问点iic,spi基础知识,速率,工作模式。然后手撕memcpy,哪搞过这种纯c编程,写的漏洞百出,我自己都看不下去……又问我信号量组织方式,就让你简述,语言没组织好,本身也不熟。果断挂了。BSP方向最喜欢问单片机知识。 OPPO(提前批) c/c++芯片方向。问哪些课学的不好,急中生智答中特……问哪些学的好,答ARM体系结构。然后被逮住问:7种异常是什么(没答全),中断触发到返回的具体行为(CM3权威指南里有),中断嵌套如何实现(NVIC相关),中断机制的具体实现(还在答中断具体行为,他问的应该是两级向量表如何查找),中断部分结束。 问单片机与嵌入式系统的最大区别在哪里,答嵌入式系统可以跑多任务,然后逮住OS开始问。任务在内存中的组织方式(TCB-用户栈-用户代码),上下文切换时任务在内存中是如何变动,任务调度点,优先级反转如何解决,任务抢占如何发生,通信机制。 问Linux开发驱动的流程,懵逼。又问c知识指针与引用的区别。然后让我自己挑些会的说一说,答了点单指令多数据流,感觉不感兴趣,又说了流水线冲突与解决,反问cache-miss什么情况,分支预测什么原理(高级计算机结构课上内容)。看来芯片方向看重体系结构的知识,课上学的终于有用了。 诺瓦科技(提前批) 做LED屏解决方案,感觉用的知识不深。笔试考了DMA与中断传输的比较,矩阵键盘检测,计算算法的复杂度,甚至还有稳压电路的知识,做的不好。 面试让画项目框图,画乱了。硬是把我自己独立完成全部软件硬件的四轴飞行器项目说的好像是个假的一样,我特么自己都服我自己。然后问C基础,我答的还行,但已经无法补救。这次面试之后我开始把所有项目叙述和重点问题全部写纸上,每天背一遍。 是的,你没有看错,我提前批5连挂,群里大佬都在讨论去联发科还是汇顶了,我一个菜鸡什么话都插不上,心情和自信都已跌入谷底,真的就已经卑微求offer了…… 中兴(正式批) 然后我就迎来了第一个正式批,清水河现场面。此时被鞭打多了也知道点引导话题了。专业面就问项目,问些概念和项目里的知识:什么叫软硬实时,m4内核双堆栈机制,顺便答了arm模式切换和上下文切换,bootloader,链接原理,说我是做了些东西的。一面当天正好成都暴雨,路上积水连车都不敢走,到现场裤子鞋湿透,面试之后正好雨停。回想着专业面被肯定,我有一种感觉,从今日开始我要拨云见日。 二面英文自我介绍,崩,然后问我有offer吗,投华为了吗,然后就反复问我:为啥没投华为,我还是不明白你为什么不投华为。问的我贼气,我不投怎么了。后来在职学姐告诉我,应该答不喜欢华为的文化,两家是竞争关系。 洽谈还是职业规划等老生常谈,他们南京的嵌入式主要是做设备驱动,机顶盒。没有自研芯片,也就是说没多少芯片的核心技术。我还是打算去芯片原厂的。谈薪资就看获奖经历什么的,本科的奖倒是不少,然并卵。说让我考虑,后来拒了。 虽然中兴拒了,但是在刚刚5连挂的时间节点上给了我宝贵的肯定,非常雪中送炭。 大华股份(提前批) 算法工程化岗。提前准备了一些ucos移植,arm指令集流水线和静态链接的知识,事实证明,准备的方向很对,他很感兴趣。 电话一面,问了ucos移植的细节,提到了一种并发的指令集(没用过),聊聊项目,又聊行业认知,最后问我的优势劣势分别是什么,答优势是对底层原理的理解和对编译器的了解,劣势是不懂Linux。他表示赞同,说我基础不错。信心终于提升一点。 电话二面。上来直接进入正题,自我介绍什么的都没搞,直接问:信号量实现的底层原理,可不可以用一个全局变量代替信号量的计数值,答不可以信号量是临界资源要进临界区,问怎么进临界区,答关中断保存cpsr,他比较满意。 然后问中断机制,大概有多少中断,可修改向量表吗(通常不可,有例外),又问m4内核的双堆栈机制。BL指令的跳转范围(32MB)。 最后问静态链接,深挖强弱符号的东西,最后说我对底层还是比较了解。 hr面就常规,觉得契合与否,1246大小周能不能接受。杭州,6险1金有食堂,后来知道我有其他offer要给我提薪,没让提拒了(因为后来拿到了更合适的)。 大疆 笔试编程题依然空白,选择填空基本拿满。 一面就问项目,反复问上系统的必要性,估计是个搞os的根本不懂四轴,以前栽过,这次答圆了,又主动答了中断机制,看他不是很感兴趣。最后问我懂不懂os的内存管理,答不懂,之后就是笔试编程为啥不做,答嵌入式对算法只是了解,项目里没用到。 二面感觉和一面没什么区别,还是自我介绍&&项目介绍,把四轴的控制流程说了一遍,他对四轴还是懂一点,但飞控算法没问,难道大疆不该很看重这一块吗,把所有项目大概都问了一遍,无异常。然后问,你的劣势在哪,答不会Linux,又问我图像处理的算法,靠本科上课学的还没忘干净的知识答一点,中位数滤波,边缘滤波,想深问,我说我只是了解。感觉他不很满意。 二面挂了,挂的很不甘心,我的cpu原理知识还没吐出来呢,静态链接也没问,arm这块就问了个中断机制。回来反思为什么引不出自己的优势,感觉自己所答还是很零散,中断就中断,os就os,指令集就指令集,串不起来。后来我找到一种组织的方式,能从中断入手把arm架构,上下文模切换,指令流水和程序优化串起来讲,形成一个模板,只要问到其中某一个知识我就能把全部一串说出来,他感兴趣自然再深问。涨了一波经验,挂的不亏。 寒武纪 上海系统软件工程师。大疆挂面总结来的那套“模板”第一次实战。 一面还是项目,挨个问简历里些写的。IIC与SPI的不同(片选方式,异步同步),IIC读写方向如何区分(地址位最后一位的高或低)看我答出了比较满意,说没几个答对的,驱动确实是我写过的。然后问9轴数据的意义,答了姿态解算中队数据的融合。然后就是双堆栈机制与模式切换,任务调度点与任务在内存中的组织方式(TCB-用户栈-用户代码),优先级反转与解决,死锁的原因,然后makefile语法一个。其他单片机小项目根本没问。看得出对我的回答很满意。然后手撕代码环节,特意找了个最简单的给我,牛客原题链表表示的两数相加,撕半小时,通过率0%……他说会综合考虑。 二面疯狂问CPU知识,“模板”用上了。先问m4 的双堆栈与上下文切换,17个寄存器的功能,LR的作用。顺势答为何中断返回要LR中的值减4,然后指令流水、CPU知识就跟着出来了。又问分支预测发生在指令处理的哪个阶段,cache的作用,回写与写透的区别,为什么设计三级缓存。 然后问信号量,进入临界区的操作,为什么关中断可以保护临界区,cpsr如何保存。 最后问静态链接,预处理是什么编译选项,-g是什么意思,如何使用ar生成库文件,这块不熟,会不会gdb(不会)。那就说说makefile一条指令的格式,.c生成.o什么选项,.o生成.elf什么选项,.o与.elf的区别联系,举个区别的例子。 然后开始讨论行业认知。为什么从事芯片行业,美国制裁华为你怎么看,制程对芯片的影响,为什么中国制造业跟不上。感觉他很感兴趣,当场表示通过。 hr面就个人介绍挖了一下个人学习方法,社团经历,期望薪资等等,我问寒武纪是否加班,是不是1246大小周,她很震惊,不知道1246为何物,并说寒武纪不加班,干完就能走。 寒武纪两位面试官的肯定给了我极大的自信,我也一度很想去,毕竟是国家队的AI四小龙之一,技术实力毋庸置疑,关于为什么没去,在芯原之行之后说。 矽力杰 南京嵌入式软件岗。做电源模拟IC国内第一,最近几年开始做物联网SoC,在南京计划1年左右上市,使用M0内核和开源协议栈,做解决方案,技术难度倒不特别深,现在射频SoC厂商如雨后春笋一般冒出来,物联网这块看来市场很大,但是我本人不喜欢做物联网。 我的流程非正常,笔试都没写电话聊完直接告诉我很合适很想让我去,态度那叫一个好,hr面也是态度很好,没有丝毫套路。最后问了我目前offer,我说大华的20k和寒武纪还没谈,她说会给我定一个有竞争力的薪资。 最后的薪资真的很有诚意,干的好1-2年给股票,另外还有很高的签字费,承诺绝对不加班,不得已加班给加班费,算下来一年能拿很多对于南京嵌入式来说,还有股票签字费不加班,我心动了。 最后夸一下这个厂,对待人才很有诚意,不像有的公司承诺给一个让你“无法拒绝”的薪资然后白菜的一批,而且真不怎么加班,喜欢物联网的同学可以考虑。 芯原微电子 成都算法工程化岗。笔试题量超大,是一个半小时的量但是只给你一小时,各种智力题和基础知识,涵盖c、os、编译器和cpu知识,很多都是4选1答,只要你在一个方面有深入理解就行。我觉得很基础但是实在写不完。 专业面,npu的人面的也算是缘分。先说项目,直接画个框图给他,说的熟的不能再熟了。然后提问中断机制,这就进入了我的“模板”,然后重点问了流水线效率问题,为什么中断返回PC要减4,拿出试卷让我答没写完的题。然后让结合项目代码分析如何避免流水线冲突(调整指令执行顺序,分支预测,增加部件),还好我顶住了,他们也开始感兴趣了。 然后问静态链接,也是熟的不能再熟的东西。其中一个面试官问我是否想去做编译器,我说只做编译器一个点有点狭窄我还是想着眼于整个系统,后来知道他原来是编译器组的leader。 然后和技术主管聊,当时不知道是npu部门的leader(也是我现在的leader),聊些技术方向,未来期许,职业规划,聊了比较久,他说不错很优秀。 然后英语面,爆炸。问我团队工作中什么最重要,喜欢哪个城市为什么,说了啥不重要,重要看你会不会说英语,显然我不会,估计是C。 hr面套路,优缺点,已有什么offer什么岗位。 CEO面,我宣讲时提了一个比较有深度的问题,他记得我。问为什么芯原做芯片定制而不是直接生产出来再卖,答案是减少积压风险,答错。他宣讲时就说今天要问,还是答错了。 openday,搞了一整天,各条产品线负责人上来宣讲,好困,芯原自研IP核有核心技术,还是不错,npu是前沿技术,部门老大对我也比较看好,于是去了。就是薪资一般,一年涨薪至少10%看绩效,不加班法定节假日3倍工资,周末和晚上加班没有加班费(7点人都走光了)。 回来和我的老师讨论offer问题,芯片行业老师还是最看好华为,可以说是业界第一。中策就是寒武纪、芯原、龙芯中科这种有技术实力但是盈利情况并不很好的国家队公司,下策就是解决方案供提供商,他们的芯片技术自主权十分有限,拿大华来说,他们的图像IP核都是买的华为的,芯原的,寒武纪的,芯原的异构并行npu可以决定哪部分算法调度在哪个核上去跑,怎么从结构上优化网络,但是大华就只能根据我们的文档去应用,我们的嵌入式工程师还要去杭州总部指导他们的工程师,原厂工程师在下游方案提供商那里很吃香的。 在这些IP原厂中,我的老师觉得寒武纪定位不清晰,又做IP又产芯片又做云,现在还搞校企联合,有些浮躁,财报也是大起大落的,目前特别依赖输血。芯原就好一些,只对标企业用户,虽然也在亏损,但是定位清晰,有自己很多市场接受的产品,目前亏损主要是成本太大。但是在这个时间节点上国家肯定会拉高芯片行业,寒武纪还没倒呢芯原怕什么。决定之后寒武纪、大华、矽力杰就都拒了。 我所从事的是内核移植和算法工程化岗,只做设备和驱动前途有限,这方面最后细说。 欢迎学弟学妹来我司从事自主IP核的研发。我司妹子多而且质量高哦。 龙芯中科 北京嵌入式软件岗。龙芯是国产CPU的巅峰,中科院计算所背景,技术是有但是盈利模式没做成熟。介绍项目,老生常谈,叙述中断机制,bootloader,模板开启引出流水线,他竟然没深问。问我会不会gdb,答不会。又问了一个机器学习项目,看我叙述清晰也没再问了(他不懂这块)。问我对工作什么期许,聊聊岗位,已有什么offer什么岗位。看他不怎么问我技术问题我有点急,我直接说我基础很好,所有简历里提到的您随便问,他笑,看你这么自信我就不问了,等二面吧。后来24号签了,也不准备继续了。 最后说一些我对嵌入式技术的见解:嵌入式系统本身就是微小的计算机系统,只要二进制计算机不过时,嵌入式技术就不会消失。 我的老师经常给我们强调“程序员的自我修养”和对底层原理的理解,现在技术更新换代非常快,新框架新风口,但是只要它跑在二进制计算机上,有些东西就是不会变的。所以理解计算机工作的本质,掌握“以不变应万变”的能力在嵌入式编程中尤为重要,“好的程序员对自己程序的每一个比特都了如指掌”。不仅是嵌入式方向,其他技术方向也是如此,着眼于系统才能立于金字塔顶部,在35岁之后避免职业瓶颈。 吹了一波嵌入式的重要,再谈一点我个人对嵌入式未来的理解。传统嵌入式MCU、os应用编程、驱动开发其实已经很成熟,比如linux驱动就已经有成熟的框架,完全不需要你懂源代码。 未来应是ai的时代,云计算已经比较成熟。 对于端级的ai,集成度基本已经到了尽头,目前最先进的制程是5nm,而在1nm的量级将会产生量子效应,也就是说,集成度的极限要到了。集成度上不去直接影响芯片的大小,端级ai不可能像服务器一样搞好大一个主板,目前基本是用异构多核的方式提升计算性能。 但是并行计算也有性能的瓶颈,算法中很多情况是下一步计算需要用到上一步的结果,有相关性的,没法并行。这个计算的瓶颈,牵扯到流水线阻塞,cache命中率,IO操作等等,一定是底层架构方面的问题,有我们嵌入式程序员广阔的发展空间。 第二个热点我觉得是5G相关,这块我不太了解,大致说说。首先是低功耗问题,商用对功耗非常敏感,这肯定和底层系统有关,要裁剪硬件软件。其次就是协议栈了,美国就怕这个才封了华为,由此可见重要程度。 -END- | 整理文章为传播相关技术,版权归原作者所有 | | 如有侵权,请联系删除 | 往期好文合集 嵌入式就业去哪?中国10大军工央企,1000+单位!史上最全!  美国再下黑手!除了中芯国际,这些企业也被制裁了  华为 “鸿蒙” 操作系统关键特性解读 最 后 若觉得文章不错,转发分享,也是我们继续更新的动力。 5T资源大放送!包括但不限于:   免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3咨询:_搞一个短信验证码登录,难吗?四步搞定!

来源:blog.csdn.net/classabcd/java/article/details/82464582 一、首先添加一个jar包,工具类会用到 二、编写http请求工具类 三、生成四位数的方法 四、执行方法execute(),便会发送成功 1、构造手机验证码:使用random对象生成要求的随机数作为验证码,例如4位验证码:1000~9999之间随机数; 2、使用接口向短信平台发送手机号和验证码数据,然后短信平台再把验证码发送到制定手机号上,接口参数一般包括:目标手机号,随机验证码(或包含失效时间),平台接口地址,平台口令; 3、保存接口返回的信息(一般为json文本数据,然后需转换为json对象格式); 4、将手机号–验证码、操作时间存入Session中,作为后面验证使用; 5、接收用户填写的验证码及其他数据; 6、对比提交的验证码与Session中的验证码是否一致,同时判断提交动作是否在有效期内; 7、验证码正确且在有效期内,请求通过,处理相应的业务。 一、首先添加一个jar包,工具类会用到 <dependency>  <groupId>commons-codec groupId>  <artifactId>commons-codec artifactId>  <version>1.11 version> dependency> 我这里只是编写一个简单的短信验证功能,要是用其他的语音验证。。。。等等需要去秒滴云官方下载文档,下面是编写的一个config文档,专门存放一些参数 二、编写http请求工具类 public class HttpUtil{   /**    * 构造通用参数timestamp、sig和respDataType    *    * @return    */   public static String createCommonParam()   {      // 时间戳      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");      String timestamp = sdf.format(new Date());      // 签名      String sig = DigestUtils.md5Hex(Config.ACCOUNT_SID + Config.AUTH_TOKEN + timestamp);      return "×tamp=" + timestamp + "&sig=" + sig + "&respDataType=" + Config.RESP_DATA_TYPE;   }   /**    * post请求    *    * @param url    * 功能和操作    * @param body    * 要post的数据    * @return    * @throws IOException    */   public static String post(String url, String body)   {      System.out.println("url:" + System.lineSeparator() + url);      System.out.println("body:" + System.lineSeparator() + body);      String result = "";      try      {         OutputStreamWriter out = null;         BufferedReader in = null;         URL realUrl = new URL(url);         URLConnection conn = realUrl.openConnection();         // 设置连接参数         conn.setDoOutput(true);         conn.setDoInput(true);         conn.setConnectTimeout(5000);         conn.setReadTimeout(20000);         conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");         // 提交数据         out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");         out.write(body);         out.flush();         // 读取返回数据         in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));         String line = "";         boolean firstLine = true; // 读第一行不加换行符         while ((line = in.readLine()) != null)         {            if (firstLine)            {               firstLine = false;            } else            {               result += System.lineSeparator();            }            result += line;         }      } catch (Exception e)      {         e.printStackTrace();      }      return result;   }   /**    * 回调测试工具方法    *    * @param url    * @param reqStr    * @return    */   public static String postHuiDiao(String url, String body)   {      String result = "";      try      {         OutputStreamWriter out = null;         BufferedReader in = null;         URL realUrl = new URL(url);         URLConnection conn = realUrl.openConnection();         // 设置连接参数         conn.setDoOutput(true);         conn.setDoInput(true);         conn.setConnectTimeout(5000);         conn.setReadTimeout(20000);         // 提交数据         out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");         out.write(body);         out.flush();         // 读取返回数据         in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));         String line = "";         boolean firstLine = true; // 读第一行不加换行符         while ((line = in.readLine()) != null)         {            if (firstLine)            {               firstLine = false;            } else            {               result += System.lineSeparator();            }            result += line;         }      } catch (Exception e)      {         e.printStackTrace();      }      return result;   }} 三、生成四位数的方法 public static String runNumber() {   String str="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";   StringBuilder sb=new StringBuilder(4);   for(int i=0;i<4;i++)   {      char ch=str.charAt(new Random().nextInt(str.length()));      sb.append(ch);   }   System.out.println(sb.toString());   String code = sb.toString();   return code;} public class IndustrySMS{   private static String operation = "/industrySMS/sendSMS";   private static String accountSid = Config.ACCOUNT_SID;   private static String to = "15342349382";  private static String smsContent = "【小陶科技】登录验证码:{"+runNumber().toString()+"},如非本人操作,请忽略此短信。";   /**    * 验证码通知短信    */   public static void execute()   {      String tmpSmsContent = null;       try{         tmpSmsContent = URLEncoder.encode(smsContent, "UTF-8");       }catch(Exception e){       }       String url = Config.BASE_URL + operation;       String body = "accountSid=" + accountSid + "&to=" + to +  + tmpSmsContent           + HttpUtil.createCommonParam();              String result = HttpUtil.post(url, body);       System.out.println( + System.lineSeparator() + result);} 长按订阅更多精彩▼ 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!