精华内容
下载资源
问答
  • 个人觉得的,其实 我们工作到了一定的年纪,有时候不用社会淘汰你,你自己就感觉体力跟上了尤其是互联网公司,做开发的35岁甚至到35岁,很多普遍转行或者是被动离职的。 (PS:这里不卖焦虑) 我们要以正确要以...

    35 岁,真的是职场荣枯线吗?

    前几天看到知乎上的这个帖子:35 岁似乎已成职场荣枯线,失业风险叠加中年危机加剧焦虑,你如何看待「 35 岁危机」?个人觉得的,其实 我们工作到了一定的年纪,有时候不用社会淘汰你,你自己就感觉体力跟不上了尤其是互联网公司,做开发的35岁甚至不到35岁,很多普遍转行或者是被动离职的。
    (PS:这里不卖焦虑)

    我们要以正确要以正确的眼光看待:

    1、有些互联网公司的文化就是这样,比如部分互联网公司,基本不招聘35岁以上的了,对于老员工也会逐渐的减少或淘汰;
    2、技术跟不上,或者技术比较薄弱有没有去努力提高自己的人;
    3、混吃混喝的,不听管教,没有给公司做过实际贡献的人;
    4、公司的财政状况出现危机,不得已要淘汰一些人,保留一些核心人物,其他人尽管技术好或者比较奋进仍然还会被淘汰,这种不是太高,如果出现这种问题趁早做打算我想对于很多公司之所以淘汰35岁的人,大部分都是以上的其中情况吧我想说的是35岁并不可怕,可怕的是你35岁前比较懒散,碌碌无为。

    在这里插入图片描述
    某为19年就爆出来要裁员34岁以上员工的新闻,去年,真的裁了!!!
    在这里插入图片描述
    在某频道上,经常会看到这样的留言:
    在这里插入图片描述
    还有大佬为中年危机火上浇油的:

    突然想到一句话,不能骂二十多岁的小伙子,因为他们随时可以辞职,要骂就骂30多岁的,他们成家了还有各种贷款。

    程序员的35岁,真的如此不堪?

    最关键的是,我也马上35了!!!!

    关于35岁的问题

    35 岁的问题其实是这样的:简单说就是才不配岁!就是这么回事,就是这么简单,从30开始,就开始淘汰那些没长进,一直没干明白,不会学习,空耗岁月的那些人。而不是到了岁数就都不要了,当然像华为这样乱带节奏的公司的确该说。

    国内人多,不缺技术劳动力,所以国内的竞争的确大,新人上来的很快,老人要是学习效率不行,的确会被淘汰。

    其实不只是35,从30岁就开始了,30 以后,结婚,有孩子,身体素质下降,常年作息不规律,让你用来专心工作,学习技术的时间和精力所剩无几,你要是不能平衡好工作,家庭,作息,身体,离开这个行业的确是最终的出路。

    35 的话题就是上面这些了,我、尝试着从另一个方向来写写,希望你帮助大家减轻焦虑,其实有一些文章在辟谣,在客观的看待问题,大家多看看吧。

    最终还是能力,你有匹配你这个岁数的能力有什么可怕的,大公司非常挑剔,难倒那些中小公司也这么变态吗?业务赚的可能少不少,但是你看看周围,放宽心,至少还能活的不错不是,人才这种流动是正常的,谁让中国人多呢。国外 IT 人才那真是有多少要多少的,究其原因,还不是国外人才少嘛。

    再来一点!!!裁掉的是哪些人呢?

    拿Keep来说,之前的裁员计划中,裁掉的大部分是应届毕业生。而其他一些大厂则对中层管理人员进行了优化,还有实行末位淘汰制的公司裁掉了一大批人浮于事、尸位素餐的混子员工,例如京东。一个真正有价值的员工,是任何企业都需要的。

    这就是我说的那些做几年都不入门的那些人,他们真的没学明白,走的大部分都是这种人,大家唉放宽心,想想全中国有多少 coder 从业人员,终究大部分人还是有工作的。努力夯实技术,扩展眼界,全方位提要自己能力,不管怎么说,就算上不去,至少也能站的住。大家共勉吧!

    如何应对互联网行业的「中年危机」

    1、纯技术路线
    2、混圈子、混人脉、靠内推
    3、靠猎头
    4、靠自己

    其实无论走什么捷径进入面试环节,在面试时除了自己,谁也帮不了你,所以,如何把自己能力提升是非常非常重要的部分。另外,需要注意的是,在自己学习时,要有方向,一方面要提升名气,使简历发光,一方面深入学习,要有真本事。

    时刻保持平和得心态

    之前有看到过一篇这样的帖子:什么样的程序员在35岁以后依然被公司抢着要?
    在这里插入图片描述
    至于35岁如何不被淘汰,那么上面的帖子已经给出了答案这里给大家一些建议:

    1、现在的你无论是30岁还是35岁,我希望你能保持一颗奋进的心,时刻保持危机感

    2、做技术的可以在一定的技术方向深入,如果走不通,可以走管理,管理走不通,可以走产品,产品走不通,可以走讲师,讲师走不通可以走自媒体任何事物都不是一层不变的,只要能生存能挣钱,其他行业也照样可以选择

    3、现在退休年龄都延迟了,女生60男生65,现在30左右的你还有大把时间可以选择,哪怕是重新开始一门新行业,虽然前几年可能是低潮期,但个人感觉到了一定的时候也是有必要的最后说一句额外的话:无论你现在是做哪行工作,请一定要保持一个强健的体魄,因为有一个好的身体,真的太重要了!

    关于java方面的技术储备

    现在竞争这么激烈,只有通过不断学习,提高自己,才能保持竞争力。

    对于一些不知道学习什么,没有一个系统路线的程序员,这里给大家提供一个大概的思路:
    在这里插入图片描述
    Java成长笔记大致内容如下:

    在这里插入图片描述
    这些内容均免费分享给大家,需要完整版的朋友,点击这里查看获取方式

    《Java核心知识点合集(283页)》

    内容涵盖:Java基础、JVM、高并发、多线程、分布式、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、数据库、云计算等
    在这里插入图片描述

    《Java中高级核心知识点合集(524页)》

    在这里插入图片描述

    《Java高级架构知识点整理》

    在这里插入图片描述

    《Docker从入门到实践》

    在这里插入图片描述

    《spring could 学习笔记》

    在这里插入图片描述

    《JVM与性能调优知识点整理》

    在这里插入图片描述

    《MySQL性能调优与架构设计解析文档》305页

    在这里插入图片描述

    《Nginx入门到实战》319页

    在这里插入图片描述

    《Java并发编程》385页

    在这里插入图片描述

    《1000道 互联网Java工程师面试题 (485页)》

    在这里插入图片描述
    以上这些内容均免费分享给大家,需要完整版的朋友,点击这里获取,备注“CSDN”一键三连提高通过率

    最后

    对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

    不用多说,相信大家都有一个共识:无论什么行业,最牛逼的人肯定是站在金字塔端的人。所以,想做一个牛逼的程序员,那么就要让自己站的更高,成为技术大牛并不是一朝一夕的事情,需要时间的沉淀和技术的积累。

    要相信是金子都会发光的!!!

    展开全文
  • Altium Designer -- 差分布线阻抗匹配

    万次阅读 多人点赞 2016-03-16 13:28:01
    一、PCB 差分布线操作参看:Altium Designer -- 精心总结PCB 差分布线已经讲的很清楚了,在此做介绍。二、差分布线优缺点参看:实际运用中差分信号线的分析 LAYOUT 参看:差分信号 -- 维基百科(1) 差分信号...

    一、PCB 差分布线操作

    PCB 差分布线已经讲的很清楚了,在此不做介绍。

    二、差分布线优缺点

    参看:实际运用中差分信号线的分析和 LAYOUT

    参看:差分信号 -- 维基百科

    (1) 差分信号

    首先来看一下什么是差分信号吧。

    1、差分信号

    差分传输是一种信号传输的技术,区别于传统的一根信号线一根地线的做法,差分传输在这两根线上都传输信号,这两个信号的振幅相同,相位相反。在这两根线上的传输的信号就是差分信号。信号接收端比较这两个电压的差值来判断发送端发送的是逻辑0还是逻辑1。在电路板上,差分走线必须是等长、等宽、紧密靠近、且在同一层面的两根线。

    一般类型有:USB、以太网、PCIE、SATA、RS485、RS422、HDMI、LVDS

    常用对有:+/-    PM/PN  TXN/TXP 

    2、差分信号与单端走线的比较

    差分信号与传统的一根信号线一根地线(即单端信号)走线的做法相比,其优缺点分别是:
    优点:
    抗干扰能力强。
    干扰噪声一般会等值、同时的被加载到两根信号线上,而其差值为0,即,噪声对信号的逻辑意义不产生影响。
    能有效抑制电磁干扰(EMI)。由于两根线靠得很近且信号幅值相等,这两根线与地线之间的耦合电磁场的幅值也相等,同时他们的信号极性相反,其电磁场将相互抵消。因此对外界的电磁干扰也小。
    时序定位准确。差分信号的接收端是两根线上的信号幅值之差发生正负跳变的点,作为判断逻辑0/1跳变的点的。而普通单端信号以阈值电压作为信号逻辑0/1的跳变点,受阈值电压与信号幅值电压之比的影响较大,不适合低幅度的信号。
    缺点:
    若电路板的面积非常吃紧,单端信号可以只有一根信号线,地线走地平面,而差分信号一定要走两根等长、等宽、紧密靠近、且在同一层面的线。这样的情况常常发生在芯片的管脚间距很小,以至于只能穿过一根走线的情况下。

    (So,差分信号要优先布线)

    (2)关于差分的五个常见误区

    误区一:认为差分信号不需要地平面作为回流路径,或者认为差分走线彼此为对方提供回流途径。造成这种误区的原因是被表面现象迷惑,或者对高速信号传输的机理认识还不够深入。虽然差分电路对于类似地弹以及其它可能存在于电源和地平面上的噪音信号是不敏感的。地平面的部分回流抵消并不代表差分电路就不以参考平面作为信号返回路径,其实在信号回流分析上,差分走线和普通的单端走线的机理是一致的,即高频信号总是沿着电感最小的回路进行回流,最大的区别在于差分线除了有对地的耦合之外,还存在相互之间的耦合,哪一种耦合强,那一种就成为主要的回流通路。

    在PCB 电路设计中,一般差分走线之间的耦合较小,往往只占10~20%的耦合度,更多的还是对地的耦合,所以差分走线的主要回流路径还是存在于地平面。当地平面发生不连续的时候,无参考平面的区域,差分走线之间的耦合才会提供主要的回流通路。尽管参考平面的不连续对差分走线的影响没有对普通的单端走线来的严重,但还是会降低差分信号的质量,增加EMI,要尽量避免。也有些设计人员认为,可以去掉差分走线下方的参考平面,以抑制差分传输中的部分共模信号,但从理论上看这种做法是不可取的,阻抗如何控制?不给共模信号提供地阻抗回路,势必会造成EMI 辐射,这种做法弊大于利。
    所以要保持PCB地线层返回路径宽而短。尽量不要跨岛(跨过相邻电源或地层的分隔区域)。比如主板设计中的USB和SATA及PCI-EXPRESS等最好不要有跨岛的做法。保证这些信号的下面是个完整地平面或电源平面。

    误区二:认为保持等间距比匹配线长更重要。在实际的PCB 布线中,往往不能同时满足差分设计的要求。由于管脚分布,过孔,以及走线空间等因素存在,必须通过适当的绕线才能达到线长匹配的目的,但带来的结果必然是差分对的部分区域无法平行,其实间距不等造成的影响是微乎其微的,相比较而言,线长不匹配对时序的影响要大得多。再从理论分析来看,间距不一致虽然会导致差分阻抗发生变化,但因为差分对之间的耦合本身就不显着,所以阻抗变化范围也是很小的,通常在10%以内,只相当于一个过孔造成的反射,这对信号传输不会造成明显的影响。而线长一旦不匹配,除了时序上会发生偏移,还给差分信号中引入了共模的成分,降低信号的质量,增加了EMI。

    可以这么说,PCB 差分走线的设计中最重要的规则就是匹配线长,其它的规则都可以根据设计要求和实际应用进行灵活处理。同时为了弥补阻抗的匹配可以采用接收端差分线对之间加一匹配电阻。 其值应等于差分阻抗的值。这样信号品质会好些。

    所以建议如下两点:
    (A)使用终端电阻实现对差分传输线的最大匹配,阻值一般在90~130Ω之间,系统也需要此终端电阻来产生正常工作的差分电压;
    (B)最好使用精度1~2%的表面贴电阻跨接在差分线上,必要时也可使用两个阻值各为50Ω的电阻,并在中间通过一个电容接地,以滤去共模噪声。

    通常对于差分信号的CLOCK等要求等长的匹配要求是+/-10mils之内。

    误区三:认为差分走线一定要靠的很近。让差分走线靠近无非是为了增强他们的耦合,既可以提高对噪声的免疫力,还能充分利用磁场的相反极性来抵消对外界的电磁干扰。虽说这种做法在大多数情况下是非常有利的,但不是绝对的,如果能保证让它们得到充分的屏蔽,不受外界干扰,那么我们也就不需要再让通过彼此的强耦合达到抗干扰和抑制EMI 的目的了。如何才能保证差分走线具有良好的隔离和屏蔽呢?增大与其它信号走线的间距是最基本的途径之一,电磁场能量是随着距离呈平方关系递减的,一般线间距超过4 倍线宽时,它们之间的干扰就极其微弱了,基本可以忽略。此外,通过地平面的隔离也可以起到很好的屏蔽作用,这种结构在高频的(10G 以上)IC 封装PCB 设计中经常会用采用,被称为CPW 结构,可以保证严格的差分阻抗控制(2Z0)。
    差分走线也可以走在不同的信号层中,但一般不建议这种走法,因为不同的层产生的诸如阻抗、过孔的差别会破坏差模传输的效果,引入共模噪声。此外,如果相邻两层耦合不够紧密的话,会降低差分走线抵抗噪声的能力,但如果能保持和周围走线适当的间距,串扰就不是个问题。在一般频率(GHz 以下),EMI也不会是很严重的问题,实验表明,相距500Mils 的差分走线,在3 米之外的辐射能量衰减已经达到60dB,足以满足FCC 的电磁辐射标准,所以设计者根本不用过分担心差分线耦合不够而造成电磁不兼容问题。

    误区四:差分曼切斯特编码并不是差分信号的一种,它指的是用在每一位开始时的电平跳变来表示逻辑状态“0”,不跳变来表示逻辑状态“1”。但每一位中间的跳变是用来做同步时钟,没有逻辑意义。

    误区五:双绞线上面走的不一定是差分信号,单端信号在双绞线上的电磁辐射也比平行走线的辐射小。

    三、差分布线的布线要求

    根据上面的误区,总结一下差分布线的布线要求。

    (1)差分走线必须是等长、等宽、紧密靠近、且在同一层面的两根线。

    如果等长和等距不能同时满足,则 PCB 差分走线的设计中最重要的规则就是匹配线长同时为了弥补阻抗的匹配可以采用接收端差分线对之间加一匹配电阻。 其值应等于差分阻抗的值。差分走线也可以走在不同的信号层中,但一般不建议这种走法。因此尽量少跨层和走过孔,尽量少走弯路。

    (2)差分线对之间要有 GND 隔离,或者保持距离,不要太近。

    增大差分信号与其它信号走线的间距,或者通过 GND 隔离。

    (3)差分线要优先布线

    四、举个栗子

    (1)Hi3516A 用户手册上,USB PCB 设计建议

    为了保证良好的信号质量, USB 2.0 端口数据信号线按照差分线方式走线。为了达到USB 2.0 高速 480MHz 的速度要求,建议 PCB 布线设计采用以下原则:

    差分数据线走线尽可能短、直,差分数据线对内走线长度严格等长,走线长度偏差控制在±5mil 以内。
    差分数据线控制 90±10%的均匀差分阻抗。
    差分数据线走线尽可能在临近地平面的布线层走线且不要换层。
    差分数据线走线应有完整的地平面层作为参考平面,不能跨平面分割。
    差分数据线走线应尽量用最少的过孔和拐角,拐角可考虑用圆弧或者 135 度角,避免直角,以减少反射和阻抗变化。
    避免邻近其它高速周期信号和大电流信号,并保证间距大于 50mil,以减小串扰。
    此外,还应远离低速非周期信号,保证至少 20mil 的距离。
    REXT 电阻应该尽可能靠近 Hi3516A 侧。

    (2)图文说明

    参看:USB PCB布线经验教训--“血训”

    USB是一种快速、双向、同步传输、廉价、方便使用的可热拔插的串行接口。由于数据传输快,接口方便,支持热插拔等优点使USB设备得到广泛应用。目前,市场上以USB2.0为接口的产品居多,但很多硬件新手在USB应用中遇到很多困扰,往往PCB装配完之后USB接口出现各种问题
    比如通讯不稳定或是无法通讯,检查原理图和焊接都无问题,或许这个时候就需怀疑PCB设计不合理。绘制满足USB2.0数据传输要求的PCB对产品的性能及可靠性有着极为重要的作用。
    USB协议定义由两根差分信号线(D+、D-)传输数字信号,若要USB设备工作稳定差分信号线就必须严格按照差分信号的规则来布局布线。根据笔者多年USB相关产品设计与调试经验,总结以下注意要点:
    1. 在元件布局时,尽量使差分线路最短,以缩短差分线走线距离(√为合理的方式,×为不合理方式);

    2. 优先绘制差分线,一对差分线上尽量不要超过两对过孔(过孔会增加线路的寄生电感,从而影响线路的信号完整性),且需对称放置(√为合理的方式,×为不合理方式);

    3. 对称平行走线,这样能保证两根线紧耦合,避免90°走线,弧形或45°均是较好的走线方式(√为合理的方式,×为不合理方式);

    4. 差分串接阻容,测试点,上下拉电阻的摆放(√为合理的方式,×为不合理方式);

    5. 由于管脚分布、过孔、以及走线空间等因素存在使得差分线长易不匹配,而线长一旦不匹配,时序会发生偏移,还会引入共模干扰,降低信号质量。所以,相应的要对差分对不匹配的情况作出补偿,使其线长匹配,长度差通常控制在5mil以内,补偿原则是哪里出现长度差补偿哪里;


    五、阻抗匹配

    (1)阻抗计算工具

    上面一直提到,差分阻抗。这个怎么计算呢?推荐一款阻抗计算工具  Polar CITS25

    1、软件下载

    下载:Polar CITS25 阻抗计算工具下载

    举个例子:

    我们用一对 0.006 英寸宽, 1/2 盎司铜厚,间距为 0.01 英寸, FR4 材料作衬底,离地线层 0.005 英寸 (微带方式)的差分信号走线的差分阻抗计算作为例子,铜的厚度 T 为 0.7/1000 英寸。下图显示了各参数。

    (单位换算:1Mil=千分之一英寸,约等于0.0254毫米;1 盎司 = 0.0014 英寸=0.7 mil)


    H:介质厚度(PP片或者板材,不包括铜厚)  (5)
    W:阻抗线下线宽(W2=W1-0.5MIL)  (6)
    W1:阻抗线上线宽(客户要求的线宽)  (6)
    S:阻抗线间距(客户原稿)  (10)
    T:成品铜厚  (0.7)
    Er1:PP片的介电常数(板材为:4.5 P片4.2)  (4.2)


    2、软件各个界面含义

    该软件跟上面软件不同,但是参数差不多,仅供参考。
    如果想下载下面的软件,参看:PCB特征阻抗计算神器Polar SI9000安装及破解指南

    1. 外层单端:Coated Microstrip 1B

    H1:介质厚度(PP片或者板材,不包括铜厚)
    Er1:PP片的介电常数(板材为:4.5 P片4.2)
    W1:阻抗线上线宽(客户要求的线宽)
    W2:阻抗线下线宽(W2=W1-0.5MIL)
    T1:成品铜厚
    C1:基材的绿油厚度(我司按0.8MIL)
    C2:铜皮或走线上的绿油厚度(0.5MIL)
    Cer:绿油的介电常数(我司按3.3MIL)
    Zo:由上面的参数计算出来的理论阻值

    2.外层差分:Edge-Coupled Coated Microstrip 1B(重点)


    H1:介质厚度(PP片或者板材,不包括铜厚)
    Er1:PP片的介电常数(板材为:4.5 P片4.2)
    W1:阻抗线上线宽(客户要求的线宽)
    W2:阻抗线下线宽(W2=W1-0.5MIL)
    S1:阻抗线间距(客户原稿)
    T1:成品铜厚

    C1:基材的绿油厚度(我司按0.8MIL)
    C2:铜皮或走线上的绿油厚度(0.5MIL)
    C3:基材上面的绿油厚度(0.50MIL)
    Cer:绿油的介电常数(我司按3.3MIL)

    3.内层单端:Offset Stripline 1B1A


    H1:介质厚度(PP片或者光板,不包括铜厚)
    Er1:H1厚度PP片的介电常数(P片4.2MIL)
    H2:介质厚度(PP片或者光板,不包括铜厚)
    Er2:H2厚度PP片的介电常数(P片4.2MIL)
    W1:阻抗线上线宽(客户要求的线宽)
    W2:阻抗线下线宽(W2=W1-0.5MIL)
    T1:成品铜厚
    Zo:由上面的参数计算出来的理论阻值

    4.内层差分:Edge-Couled Offset Stripline 1B1A


    H1:介质厚度(PP片或者光板,不包括铜厚)
    Er1:H1厚度PP片的介电常数(P片4.2MIL)
    H2:介质厚度(PP片或者光板,不包括铜厚)
    Er2:H2厚度PP片的介电常数(P片4.2MIL)
    W1:阻抗线上线宽(客户要求的线宽)
    W2:阻抗线下线宽(W2=W1-0.5MIL)
    S1:客户要求的线距
    T1:成品铜厚
    Zo:由上面的参数计算出来的理论阻值

    5.外层单端共面地:Coated Coplanar Waveguide With Ground 1B


    H1:介质厚度(PP片或者板材,不包括铜厚)
    Er1:PP片的介电常数(板材为:4.5 P片4.2)
    W1:阻抗线上线宽(客户要求的线宽)
    W2:阻抗线下线宽(W2=W1-0.5MIL)
    D1:阻抗线到两边铜皮的距离
    T1:成品铜厚
    C1:基材的绿油厚度(我司按0.8MIL)
    C2:铜皮或走线上的绿油厚度(0.5MIL)
    Cer:绿油的介电常数(我司按3.3MIL)
    Zo:由上面的参数计算出来的理论阻值

    6.外层差分共面地:Diff Coated Coplanar Waveguide With Ground 1B


    H1:介质厚度(PP片或者板材,不包括铜厚)
    Er1:PP片的介电常数(板材为:4.5 P片4.2)
    W1:阻抗线上线宽(客户要求的线宽)
    W2:阻抗线下线宽(W2=W1-0.5MIL)
    S1:阻抗线间距(客户原稿)
    D1:阻抗线到铜皮的距离
    T1:成品铜厚
    C1:基材的绿油厚度(我司按0.8MIL)
    C2:铜皮或走线上的绿油厚度(0.5MIL)
    C3:基材上面的绿油厚度(0.50MIL)
    Cer:绿油的介电常数(我司按3.3MIL)
    Zo:由上面的参数计算出来的理论阻值

    (2)阻抗匹配

    参看:PCB阻抗设计参考

    参看:PCB迹线的阻抗控制技术

    参看:PCB阻抗匹配总结

    确实,一开始我也以为阻抗是写到 PCB 制版要求里,然后让制版厂来做的。

    从上面的例子中就可以看到它与 差分线的线宽、线间距、介质厚度、成品铜厚、介电常数、叠层结构 等有关。

    差分线的线宽、线间距,这些都是在 PCB 规则里设置好的。只不过以前不晓得,为什么要设置成线宽 6 mil,间距 8 mil 等等这样的要求,还以为只是与制版价格有关呢。现在看来,它还和阻抗大小有关的!!

    1、线宽、线间距规则设置

    线宽:(最小线宽 5mil)


    差分线间距:(差分线最小间距 10mil)


    其他信号线间距:(最小线宽 7.5mil)


    2、查看板卡厚度和叠层结构

    参看:Altium Designer -- 查看板子厚度

    在 Design--Layer Stack Manager--thickness

    (3)传输线阻抗计算中的有关问题

    上面参看的文档,讲的真好,看了一遍受益匪浅。不过内容较多,不一一分析了,下面只看一部分。
    结合目前我公司 PCB 板加工厂家的工艺能力,在用 polar 公司阻抗计算器 CITS25 计算PCB 板上迹线特性阻抗时,对影响 PCB 板迹线控制阻抗的几个相关参数分述如下:
    

    1、 铜层厚度

    铜层厚度代表了 PCB 迹线的高度 T内层铜箔通常情况下用到 1 OZ(厚度为 35 微米),也有在电源层要流过大电流时用到 2OZ(厚度为 70 微米)。外层铜箔常用 1/2 OZ(18 微米),但由于经过板镀和图形电镀最终成品外层铜厚将达到48 微米(实际计算时用该值),设计成其他铜厚将较难控制铜厚厚度公差。若外层使用 1OZ铜箔,则最终铜厚将达到 65 微米。
    

    2PCB 板迹线的上下线宽

    由于侧蚀的影响, PCB 迹线的截面为一梯形,上下线宽差距以 1mil 来计算,其中下线宽=要求线宽,而上线宽=要求线宽-1mil
    

    3、 阻焊层

    阻焊层厚度按 10um 为准(选择盖阻焊模式),但有机印后将会有所增厚,但其变化将基本不会带来阻抗值的变化。
    

    4、 介质厚度

    常用板材(芯板): (mm OZ/OZ *表示其数值为不包括铜箔厚度的芯板厚度)
    0.13* 1/1 0.21* 1/1 0.25* 1/1 0.36* 1/1
    0.51* 1/1 0.71* 1/1 0.80* 1/1
    1.0 1/1 1.2 1/1 1.6 0.5/0.5 1.6 1/1 1.6 2/2
    2.0 1/1 2.0 2/2 2.4 1/1 3.0 1/1 3.2 1/1 
    芯板在计算控制阻抗时的实际厚度: 

    常用半固化片: (mm/mil) 76280.175/6.9 21160.11/4.3 10800.066/2.6 实际计算厚度时注意半固化片随着两面线路结构不同而有所不同:(mil
    
    
    其中 GND 层包括铜面积占 80%以上的线路层。如果介质在 HOZ 1OZ 铜箔之间,其厚度按 HOZ 情况计算。
    

    5、 介电常数

    Er 的值是线路板材质的绝缘常数(介电常数), 它对于线路的特性阻抗值而言是一个重要的组成部分。设计厂商因此有时会指定迹线阻抗值并依赖于线路板制造商来控制流程,以使迹线阻抗满足设计厂商指定的技术规范。
    迹线的控制阻抗与板材介电常数的平房根成反比。
    通过板材供应商提供的板材阻抗范围为 4.2~5.2,而 POLAR 公司建议单端采用 4.2,而差分若两线间距小会有所影响则建议采用 4.7
    根据一年多来各阻抗实验及生产板,我公司选用 4.2 进行计算能符合要求。
    由于介电常数与板材型号和信号频率有相关性, 请设计人员能充分考虑该影响。如:高频板材有介电常数 2.5 等。 

    (4)传输线阻抗控制典型应用总结

    
    
    我们的制版要求,如果需要差分阻抗,一般会有这几个选项:
    层数:4
    
    板厚1.6mm,整板喷锡工艺。
    
    阻抗匹配 目录中的图片信号需要100欧姆差分阻抗匹配。
    
    严格禁止修改PCB图的任何东西的。
    则 1.6mm 厚度的 4 层 PCB 板加工,建议做阻抗设计的时候按照 1.5mm 厚度进行设计,剩下 0.1mm 厚度留给工厂作为其他工艺要求用(后制诚厚度,绿油、丝印等)。
    
    板厚 1.5mm采用 1.2 35/35 的芯板,其余两个介质层为 2116)。 
    L1/L4 层差分信号(阻抗控制为 100Ω)的线宽/间距可以为 5/55/66/7 6/86/9(mil/mil)
    L1/L4 层差分信号(阻抗控制为 75Ω)的线宽/间距可以为 10/710/611/911/1010/11(mil/mil)①
    计算单端阻抗和差分阻抗的界面分别如下图一和图二: 

    L1 L2 层、 L3 L4 层之间的介质层用 2116,模式为 Copper/Gnd(HOZ), 所以 厚度 H=4.6mil,介电常数为 4.5,外层铜厚为 1OZ(1.9mil)。 实际板厚: 0.01+0.048+0.12+1.2+0.12+0.048+0.01=1.556mm。②
    1:此处差分信号表示方式线宽/间距中的间距指的是两条差分线内侧边到边的距离,在 Allegro 中设置布线规则中也使用内侧边到边的距离, 但在有些参考中用的是两条差分线中心到中心的距离, 在应用时要注意加以区别。 例: 8/8(mil/mil)的差分线如果间距是用内侧边到边的距离表示,则差分线中心到中的间距表示为 8/16(mil/mil)。
    注 2: 实际板厚计算中 0.01 代表的时 PCB 板表面的阻焊层, 阻焊层不会影响控制阻抗,单会影响 PCB 板的整体厚度。 
    
    
    其他层自行查看,不过层结构值得看一下:
    四层板:最常用的信号叠层顺序为 Sig/Gnd/Power/Sig
    六层板:较容易实现阻抗控制的的信号叠层顺序为 Sig/Gnd/Sig/Sig/Power/Sig
    六层板:还有一种结构不对称的叠层顺序经常用道: Sig/Gnd/Sig/Gnd/Power/Sig
    八层板:对称结构Sig/Gnd/Sig/Gnd/Power/Sig/Gnd/Sig
    十层板:信号顺序 Sig/Gnd/Sig/Sig/Gnd/Gnd/Sig/Sig/Gnd/Sig(结构对称)
    十二层板:信号顺序Sig/Gnd/Sig/Gnd/Sig/Gnd/Gnd/Sig/Gnd/Sig/Gnd/Sig
    
    或参看:Altium Designer -- PCB 叠层设计

    (5)总结

    阻抗计算参数与阻抗影响关系:

    1.  H介质层厚度     H与Zo成正比,H值越大,Zo越大; 2.  W1线宽    W1与Zo成反比,W1值越大,Zo越小; 3.  T 铜厚      T与Zo成反比,T值越大,Zo越小; 4.  Er 介电常数      Er与Zo成反比,Er值越大,Zo越小; 5.  S差动阻抗线间距     S与Zo成正比,S值越大,Zo越大;

    主要通过下面的途径对阻抗设计进行微调:

    ◆ 调整阻抗控制线宽、间距; ◆ 调整介质层厚度。

    总结:

    阻抗控制线宽、间距、叠层结构,这些是硬件工程师在 PCB 设计时设置的,一般制版时要求严格禁止修改PCB图的任何东西的。至于介电常数、介质厚度、成品铜厚,这些是与材质有关,这就是PCB 加工厂家的事了。
    展开全文
  • 镜头相机的匹配问题

    万次阅读 热门讨论 2019-05-15 16:50:00
    喵哥是光学工程出身的,但是...镜头的光学性能一般用焦距f、相对孔径D/f(倒数为F数,决定了镜头的分辨率采光能力视场角2w(有的视场角有时用三个参数表示:横向、纵向以及对角的视场角,大概是矩形的?)参数...

    喵哥是光学工程出身的,但是被现在“浮躁的社会”影响,开始转向计算机方向,真是“条条大路通CS”。在“转型”的过程中,喵哥开始迷失自己,忘了老本行了。趁目前需要解决监测系统相机分辨率的问题,好好复习一下应用光学。

    镜头

    镜头的光学性能一般用焦距f、相对孔径D/f(倒数为F数,决定了镜头的分辨率和采光能力)和视场角2w(有的视场角有时用三个参数表示:横向、纵向以及对角的视场角,大概是矩形的?)参数描述。系统使用的时候,性能的描述又有:分辨率、像面照度、摄影范围以及景深和焦深。

    先说一下镜头的分辨率(解像力)。

    镜头分辨率

    镜头的分辨率是对黑白条纹密度的分辨能力,镜头能分辨的最高密度值为该镜头的极限分辨率,用线对/毫米(lp/mm)为单位。

    镜头有理论分辨率和实际分辨率之分。理论分辨率是由瑞利准则和衍射极限理论决定,这个仅仅与相对孔径的数值有关。若以可分辨的两点距离\sigma表示,那么镜头的理论分辨率为:

                                                                                    \sigma =\frac{1.22\lambda }{D/f}                                      

    上式的\lambda是摄影波长。用N1 lp/mm表示理论分辨本领:

                                                                                     N1=\frac{1}{\sigma }

    \lambda=0.55um时,镜头的分辨本领为:

                                                              N1=\frac{1490}{f/D}=\frac{1490}{F}\left ( lp/mm \right )

    可见理论分辨本领和镜头的相对孔径成正比。

    而镜头的实际分辨本领除了与相对孔径有关外,还与镜头的成像质量有关,即像差。由于像差的存在,实际分辨本领要比理论分辨本领低。

    镜头中的百万像素,二百万像素和五百万像素同样是指镜头的空间分辨本领,因为镜头必须配合相机使用,为了方便记忆镜头与相机的匹配关系,人们常采用对应相机的分辨率来命名镜头。这种命名方式其实并不科学,同时给新接触视觉系统的人带来了很多误解,经常会机械的套用百万像素分辨率相机对应百万像素镜头,二百万像素分辨率相机对应二百万像素镜头,而五百万像素分辨本领相机则对应五百万像素镜头。其实镜头与相机对应的并不是相机自身的像素分辨本领(像素数),而是各自的极限空间分辨本领。按目前公开的性能指标来说,百万像素镜头对应的极限空间分辨本领是90线对/mm,二百万像素镜头对应的空间分辨本领是110线对/mm,五百万像素镜头对应的空间分辨本领是160线对/mm,因此百万像素镜头配合相机的极限空间分辨本领必须低于90线对/mm,二百万像素镜头和五百万像素镜头配合相机的原理也相同,而决定相机极限空间分辨率的并不是相机自身的像素分辨率,而是相机的单个像元尺寸大小。

    焦距(f)

    从镜头中心点到胶平面上所形成的清晰影像之间的距离。一般情况下,焦距越大,工作距离(WD)越大,视角越小;焦距越小,工作距离越小,视角越大。SOS为传感器尺寸,FOV为视场大小。

                                                                 f= \frac{WD\times SOS(H or V)}{FOV(H or V)}

    景深(待续)


     

    相机(感光元件CCDorCMOS)

    数码相机的感光元件一般是CCD或者CMOS,关于CCD和CMOS的介绍就不在这讲述了,主要是相机的分辨率。

    首先介绍一下CCD或者CMOS的感光尺寸的描述,用英寸表示。常见的尺寸对应关系如下表所示:

    相机感光元件的尺寸
    1/3英寸(4.27mm x 3.2mm)
    1/2英寸(6.4mm x 4.8mm)
    1/1.8英寸(7.1mm x 5.3mm)
    1英寸(12.8mm x 9.6mm)

     

    用简单的几何学就可以知道,1英寸对应的对角长度是16mm,这个跟我们常说的1英寸=25.4mm是不一样的。

    要说明相机的分辨率就得提到奈奎斯特极限频率:一个图像传感器能够分辨的最高空间分辨率等于它的空间采样频率的一半。

    例如一个相机的像元尺寸为2um,那么其分辨本领就为

                                                                    Nr=1 /(2*2um)=250lp/mm

    假设传感器尺寸为12.8×9.6mm,视场大小是200mm(对角长度),那么相机在物方的分辨本领为:

                                                            n=16\times250\div 200=20lp/mm

    这样知道镜头和相机的分辨本领怎么计算了,匹配镜头和相机的原则是,镜头的分辨本领要大于或者等于相机的分辨本领(课本上说的是:“为了充分利用镜头的性能,镜头的分辨本领要小于等于相机的分辨本领。”个人觉得这个要根据实际情况来作判断,哪个器件贵,哪个器件便于更换,哪个器件能快速拿到手等。)

    另外由分辨本领为N1的镜头和分辨本领为Nr的相机组成的系统的分辨本领N可用以下经验公式计算:

                                                                                     \frac{1}{N} = \frac{1}{N1} + \frac{1}{Nr}

    此时的物方分辨本领为:

                                                                                      n=16\times N\div 200

     

     

     

     

     

     

     

     

     

    展开全文
  • Open vSwitch匹配处理流程拓展性

    千次阅读 2016-03-31 16:04:45
    它们是去年研读OVS源码时候的一些收获心得,今天拿出来大家分享。 由于拓展匹配域更贴近OVS开发实践,难免会提到代码部分。但为了简洁明了,此次分享主要遵循两个目的:讲清楚其大体逻辑、然后点明需要源码添加

    目前群里很多同学做ovs研究,也有很多人来讨论如何自定义OVS匹配域的问题,所以今天的分享主题就围绕OVS匹配处理流程和拓展性展开,这和之前SDNLAB上发的自定义action,可称为姊妹篇。它们是去年研读OVS源码时候的一些收获和心得,今天拿出来和大家分享。
    由于拓展匹配域更贴近OVS开发实践,难免会提到代码部分。但为了简洁明了,此次分享主要遵循两个目的:讲清楚其大体逻辑、然后点明需要源码添加的地方,提高匹配域拓展成功率。

    一、整体思路

    现在进入正题,今天的分享从三个方面进行:

    • 匹配域相关的各个模块简单分析。
    • 安装检验和调试
    • 演示结果。

    相比在ovs源码中添加自定义action,自定义匹配域显得关系更为复杂凌乱一些。为了让和匹配域相关的模块条理更加清楚明了,我尽量将要提到的相关模块关系化,防止漏掉和匹配域相关的部分。这里先给出总体架构图:


    架构图中包含了将要分析的8大模块,每一个里面都有和匹配相关的内容,接下来会按照这个思路逐一分析。其实大家发现,这和流表从控制器下发后,数据包进入交换机的处理流程非常吻合,想必大家多多少少有一些认识。

    二、各个模块分析

    下来进入分享的重点。按照图中给出的思路,各个模块讲解顺序依次为:
    1、匹配域定义
    2、flowmod解析
    3、用户层表项插入
    4、内核层packet解析和匹配处理
    5、Upcall接收和分类
    6、用户层查找匹配处理
    7、表项和packet的下发操作
    8、内核层flow插入和packet执行
    9、其他

    1、匹配域定义

    Ovs匹配域是基于OpenFlow协议的,因此,如果要添加一个新的匹配域,需要延续OF协议定义一个匹配域的逻辑,这样拓展出的新匹配才能较为容易的和其他OF已经定义的匹配域兼容起来,同时保障OVS的匹配处理逻辑不发生改变。

    1)目前OF支持两种定义匹配域的格式,用的较多的是OXM格式,即TLV格式(类型,长度和值)。我们之后的讲解以TLV格式为基础进行。那么要想实现一个新的匹配域,代表类型的T和长度的L比不少,他们定义在枚举类型和宏定义中。

    首先看枚举类型,目前OF在1.3协议中已经定义了40种匹配字段,它们枚举值定义在include\openflow\Openflow-1.2.h中,部分截图如下:

    每一个匹配域有相应ENUM值,从in_port的0到IPV6_EXTHDR的39,因此对于新的匹配域,需要以这种格式进行添加即可,但ENUM值必须是目前还没有定义过的值。

    2)除了要添加枚举值外,还需要添加一个TLV相关的宏定义。TLV头部如下(TL部分,相当于绑定了一个匹配字段的类型和长度):

    对于一个新匹配域,只需要按照上面格式进行添加即可,注意4或是8指的是TLV中的L数值,表示匹配域值的长度。如对于inport则是4字节。之后OVS对flowmod中匹配域解析就全依赖这个枚举值和宏定义了,此外提一句,如果是在控制端也做匹配域添加,需要和这个枚举值和TL格式对应起来。

    2、FlowMod消息解析

    完成之前的新字段的TLV定义还远远不够,即将等待我们的是,OVS如何能够从Flowmod消息中准确提取出匹配域,并且能无排斥的插入原生的OVS流表中。接下来分析一下flowmod消息解析模块。

    先上图:

    图体现了大体思路: Flowmod消息的匹配域部分,最终是要按照TLV格式逐一解析出来,然后经过一系列依赖性和重复性检测等,最后才能将匹配域部分完整的解析放置在match结构体中。

    Match是什么?是用来装载从flowmod消息中解析出来的匹配域。先来看看match结构体:

    Match包含了flow和wc,前者装载字段值,后者标记字段掩码(深入会发现wc也是用flow结构体存储掩码)。Flow结构体包含了匹配域所有字段类型,因此对于新的字段,需要在此结构体中添加。

    需要注意的是,匹配字段在flow中添加的前后位置要固定,因为后面添加相应源码时需要和这个位置一致。

    2)说完了match,那如何从flowmod的匹配域中逐一解析出每一个字段呢?(其主要思想体现在函数nx_pull_raw()中)
    大体是这样的,匹配域由多个TLV组成,每一个TLV是一个匹配字段。则OVS先会从flowmod匹配域中按照TLV中的L将每个OXM(TLV格式)切割出来。这样是不是就解析完了呢,显然不是,因为切割后的合法性无法保障(如长度是否符合定义,各个字段依赖是否正确等)。

    这里就需要后面的工作了,通过分割出来的OXM的header(即TL部分),在匹配域哈希表mf_field(Hmap)中做哈希查找,然后查找到这个TL应该对应的mf_field结构体。mf_field是OVS已经声明定义好的匹配域信息集合,包含依赖性,名字,长度等信息,这些可以对分割出来的该字段进行检验。Ok,清楚了这些,下面给出匹配域字段解析的示意图:

    刚才提到字段信息的集合mf_field,其以数组形式定义在mf_fields中,我们需要在此处写入新字段的信息:

    如上面这个是inport字段信息集合,可以看到它包含了名字,字段长度和最开始提到的匹配域定义的enum OXM_OF_IN_PORT。这里注意,包含的第一个属性是mf_field的id号,一个mf_field有一个id,其定义在mf_field_id枚举类型中(对于新字段也需要在这里添加一个id,注意相对位置)。这个id号算是OVS自身识别匹配域类型的方式,之后匹配域合法性检测会都会用到这个id号。

    3)接下来,会根据字段mf_field信息对分割的每个字段做依赖性检测、重复性检测和匹配域值的有效性检测等。

    A、依赖性检测:如当设置ipv4匹配字段时,会检测match->flow的“二层协议匹配字段”是否已经是ip协议。如果新添加匹配字段有依赖性限制,则需要在函数mf_are_prereqs_ok中添加case进行检测。

    B、重复性检测:因为匹配域字段是逐个解析的,为了防止当前字段类型已经在之前存在过,则需要进行重复性检测,对于新的字段,需要在函数mf_is_all_wild()添加代码进行检测。

    C、匹配域值的有效性检测:对于一些匹配字段值是有规定的,如inport号是否大于最大范围等,对于新字段也需要在函数mf_is_value_valid()中完成检测。

    检测完就可以安安心心的将解析的每个字段值赋给match结构体了,赋值时会分有掩码和无掩码情况,也需要添加相应新字段源码。

    其实,令人欣慰的是,对于一个新字段需要在各处添加源码,看似繁杂,也基本就是照别的字段源码格式多写一个case的事情,照猫画虎也算是是个好方法。

    3、流表项插入

    完成flowmod的匹配域解析,那么剩下的就是依照flowmod要求进行流表项删除、添加等操作,这里对于一个新字段无需源码改动。

    OVS有很多保障性能的方法,这里就有一处,简答提一下:Ovs定义了一个重要结构体cls_rule,其与匹配域信息、priority信息等相关,且cls_rule关联一个相应的流表项。当ovs向流表中插入新表项时,不是以表项全部内容进行重复性检测,而是通过cls_rule在分类器cls_calssifier中进行查找,这种对流表项分类查找方法可以大大提高工作效率,完成新表项的添加或是更新。

    4、内核层packet解析和匹配处理

    用户层表项解析与插入告一段落,下来就是当数据包进入交换机时,如何完成packet解析与匹配处理。(核心代码位于datapath文件夹下,数据包头解析和匹配旅程从ovs_vport_receive()开始)

    我们知道,ovs为了提高效率,数据包会先在内核层datapath进行流表项匹配处理,对于匹配失败,或者是匹配到表项的action为发向用户层时,才会去用户层继续查找匹配。对于在用户层匹配成功的数据包会按照表项action相应处理,并向内核层下发一条匹配到的表项,方便以后类似数据包直接在内核层完成匹配转发。

    这个过程将是要一一解释的关键点,无不和匹配域息息相关。先来说说数据包进入ovs内核层的处理过程。

    1)当一个OVS端口接收到一个数据包,不是将整个数据包在内核层的流表中匹配查找,这样效率低下,而是需要对此数据包头字段进行解析,将解析出来的各个匹配字段值和端口号一起构造成查询key,然后用key在流表中进行匹配查找。

    查询key,它是一个sw_flow_key结构体,如下,包含了各个匹配字段的类型,对于新字段也需要在这里进行添加。

    此外,需要调用函数key_extract()依次从包头中提取各个字段放入key中。如果你构造了一个数据包新协议字段,就需要在这个函数中提取相应包头字段赋值给key即可,包头提取都是对linux的结构体操作,很方便快捷。

    2)有了key,那就是内核层流表项匹配查找的事情了。由于此次分享围绕匹配域展开,内核中流表匹配查找阶段,不涉及具体的匹配字段,也无需做修改添加,因此不具体分析匹配查找流表项的具体过程。

    查找结果无非两种,查找成功和查找失败。查找失败则构造upcall上交用户层继续查找处理,但这里需要注意,即使查找到也可能面临上交处理。因为有一些action无法在内核层执行,这种action在下发到内核层时已经标记为OVS_ACTION_ATTR_USERSPACE类型,此时也需要上交用户层进一步匹配处理。

    上交用户层时(主要体现在queue_userspace_packet函数中),会构造上交的数据包user_skb(skb_buf结构体),然后通过generic netlink通信机制上交给用户层。

    结构体skb_buf可以简单理解为这样的结构:Netlink头部+Attr+Attr+...,Attr是type+len+data结构。Attr主要分为三个类型信息:

    • key:即由包头等构造的查询key,必不可少,数据类型type为OVS_PACKET_ATTR_KEY
    • userdata:用于匹配成功却仍要走slow-path的数据包,标记了action参数(如原因),数据类型type为OVS_PACKET_ATTR_USERDATA
    • packet:顾名思义,原始数据包。类型type为OVS_PACKET_ATTR_PACKET。

    注意,在这里,有两部分内容和匹配域相关,添加新匹配域时候就需要在此处修改源码:

    A是对于待上交key中含有的各个字段计算总长度(key_attr_size())
    B上传数据user_skb中的key包含很多匹配字段。因此新字段也要从key中提取出来加入到待传输到用户层的数据体中(函数ovs_nla_put_flow()),提取时会用到各个匹配域数据的类型(enum ovs_key_attr枚举类型中定义)。

    5、Upcall接收和分类

    到这里,已经完成和匹配域相关的多大半内容,思路已经比较清晰,后面将加快进度。

    上面说到,内核层会封装含有key、packet和action参数等内容的upcall消息上交用户层。那么用户层接收到upcall之后直接匹配表项即可,为什么还要分类呢?(其主要体现在函数read_upcalls()(ofproto-dpif-upcalls.c))。
    先给一张图:

    可以看到,用户层的upcall结构体有dupcall和miss两个成员,这就和ovs性能提升密切相关了。OVS将具有相同key的upcall归为一类,管理映射到同一个miss中。这样就完成了相似packet的分类工作,便于后期统一匹配处理,提高效率。
    在上面这个过程中,需要从key提取出flow进行哈希查找和分类。Flow就是前面讲解到的用户层用于表示匹配域的结构体,OVS调用函数flow_extract()函数从packet与md(metadata元数据)中解析并构造flow赋值给miss->flow,在这里别忘了添加相应解析函数。

    其实,分类还包括了对slow path原因的分类处理,因和匹配域无关,就不详述了

    6、用户层查找匹配处理

    完成upcall前期接收和分类工作,下来就是匹配处理了(主要体现在函数handle_upcalls()(ofproto-dpif-upcall.c))。

    这里只有一处和新匹配域添加相关(odp_flow_key_from_flow__()函数),因此主要强调其工作原理。OVS会先分批(之前提到的,划分为同一个miss的数据包)完成用户层流表匹配查找,然后得到流表项action,并将用户层action翻译为内核层odp_action,并对属于slow_path的action数据包做特殊标记处理(miss.xout->slow),尤其对部分slow_path中slow_action的做help标记。之后就可以下发查找到的表项到内核层了,并将数据包发到内核层去执行流表项的action。
    这个过程很合情合理,但标记做什么用呢?因为数据包匹配到的流表项,其action执行只能通过慢通道处理(最典型的就是Controller action,甚至是因为action过多或是数据量太大),因此标记后,就会将这些含有slow_path action的表项和packet 直接在用户层完成特殊处理,这基本和内核层关系就不大了,效率自然也不会高。

    7、表项和Packet的下发操作

    接下来的工作,就是将表项下发到内核层,并将packet通过netlink机制下发到内核层去执行action(主要体现在函数dpif_operate()中)。

    由于之前提到的slow-path原因,OVS会采用两种形式下发,一种是和slow-path无关的统一处理下发,一种是和slow-path相关的单独特殊处理。

    1)统一下发处理较为简单,就是批量以广播形式通过netlink机制下发到内核层,完成流表项在内核层的安装和packet在内核层action的执行。这里需要注意的是,如果自定义的新匹配域属于metadata类型,如inport这种,那么需要在odp_key_from_pkt_metadata()函数中,实现将元数据内容的取出放入request缓存后等待下发的功能。

    2)特殊处理:对于一个需要slow-path处理的packet,其所有动作actions本应在用户层执行(即在odp_execute_actions__()函数),但是执行到OVS_ACTION_ATTR_OUTPUT类型action时,不言而喻其最后需要发送到内核层完成转发。那么这种含有slow_path的流表项是否需要下发到内核层?还记得之前的action翻译吗,这种表项会将action翻译为OVS_ACTION_ATTR_USERSPACE下发到内核层中。如下,用户层表项到内核层表项:

    请注意,特殊处理中如果牵扯到set_field action,就需要在odp_execute_set_actio()添加新匹配域的set函数。

    8、内核层flow插入和packet执行

    转了一圈,又回到了内核层。在内核层完成flow的插入和packet action执行工作基本就大功告成了。这里面的原理比较简单,因此只提及在表项插入过程中与匹配域相关的地方。

    OVS主要在用户层下发的表项数据中,对含有的匹配字段值进行解析和字段有效性检验,完成表项插入。匹配字段解析中包含字段长度解析(ovs_key_lens()函数)和字段掩码解析(ovs_key_from_nlattrs()函数),有效性检验(match_validate()函数)主要完成了匹配字段是否全初始化检验、掩码和值的一致性检验等,对于新匹配域,以上几个函数需要修改。

    9、其他

    围绕着OVS匹配域有关的处理流程,终于分析完了从表项解析、插入、匹配,执行等一系列过程。当然,新的匹配域可能还不能很好的运作,因为还差打印显示和手动插入等功能。这部分比较独立,简单提及函数即可。

    打印密切相关:
    miniflow_extract()
    flow_format()
    odp_flow_key_attr_len()
    ovs_key_attr_to_string()
    format_odp_key_attr()

    其他一些:
    mf_set_flow_value()(lib/meta-flow.c)
     mf_get_value()(lib/meta-flow.c)
    nx_put_raw()(nx-match.c)
    parse_odp_key_mask_attr函数()(lib\odp-util.c)
    序号数FLOW_WC_SEQ

    二、安装检验和调试

    对于添加一个自定义匹配域,源码修改就算完成了,虽然比较繁琐,但是每一处改动不大,基本照猫画虎即可。安装过程简单,采用常规安装OVS的方法即可。

    如果安装后,采用ovs-ofctl命令可以正常添加一条带有自定义匹配域的流表项,并且数据包可以成功如愿以偿的匹配到这条表项,那基本就大功告成了。

    如果安装失败或是匹配不能按照预想的效果,需要进行调试。调试一般采用两种方法,查看log信息和gdb工具调试:

    1)log信息:匹配域的添加涉及用户层和内核层,ovs在用户层提供了相应log函数VLOG_WARN、VLOG_INFO、VLOG_DBG等,直接使用即可,用户层log信息一般位于/usr/local/var/log/openvswitch/ovs-vswitchd.log中查看;
    内核层可以使用printk等函数添加log,并在/var/log/kern.log中查看即可。

    2)采用dbg方式,比较准确高级的。

    三、演示结果

    说了这么多,没有实验结果都是不可靠的。因此,我下发了一条流表项,包含了一个新的匹配域,并且成功匹配到了数据包,达到预期效果。可以用ofctl查看用户层表项,用dpctl查看内核层表项。

    为了能够正确添加自定义匹配域,上文对于ovs匹配字段的执行流程和基本原理做了分析说明,全部下来,也算是劳力劳神,辛苦大家了。不过,希望此次分享能有助于群友在OVS上的二次开发。

    技术有限,讲解有误的地方欢迎指正,拍砖~,最后,再次感谢SDNLAB和大家的支持。

    Q&A

    Q1:如何保证压力下的性能
    A1:ovs本身在查找匹配上下了功夫,现在ovs也支持dpdk,性能会有所提升。不过这和硬件交换机比起来,还是有较大的提升空间。

    Q2:对于新增匹配类型,只需要在用户态修改,内核态不用修改?
    A2:需要修改的,第四点中讲到了内核层数据包头解析和key修改等,都是内核态需要修改完成的。

    Q3:请问你们现在ovs用在哪个方面的产品上?
    A3:我们目前FNL实验室利用OVS和CNVP等搭建了SDN实验平台,提供给学生切虚网做实验。

    Q4:内核态里面是精准匹配,用户态模糊匹配?
    A4:内核态可以理解为“精确表项”。举个例子,比如用户层写某条表项action是Flood,那么给内核层下发的表项Action就是Output1,2,3..等等端口,内核层的action是用户层翻译过的。内核态具有提升性能等作用,这里就是之前提到的数据包匹配处理的slow-path和fast-path问题了。

    Q5:你的意思是完全没有内核态应该也行吧?
    A5:恩,记得安装时候,可以不构建安装内核态,即只跑用户态,但功能上会有缺失~,也其实是很少这么干的。

    Q6:一个网络包第一次进入这个交换机后,要么被drop,要么被转发到控制器,内核是怎么判断的? 是转发到控制器还是drop?
    A6:内核的判断全来自于用户层曾经的判断:一个网络包如果在内核层被匹配到,那就按照action执行,没有匹配到,就上传用户层进行用户层的匹配。用户层会将匹配结果和相应表项下发到内核层,便于以后类似数据包在内核层匹配可以直接匹配成功,提高效率。至于是否转发给控制器,这要看是否匹配到的表项action为Controller(of1.3)。

    Q7:如果用户层没有匹配成功,用户层会下发流表为drop?
    A7:在of1.3中会的,不过内核层表项生存时间很短的哦,防止后来用户向用户态插入新表项导致匹配可以成功了。当然,生存时间短也是一种节约资源的方式。

    Q8:你的意思是,内核没有匹配成功,一定会发到用户态,用户态没有匹配成功会有两个动作1)转发到控制器,2)直接drop?
    A8:在of1.3中,用户态如果匹配没有成功,数据包会drop,且给内核层发一个精确表项(action为drop),在of1.3之前,用户层没有匹配到,才会默认发给控制器的。

    Q9:如果你做出去这么一套东西给客户,然后跑起来了,用户说断了或者网速慢,但是用户不会编程,怎么排除故障?
    A9:个人觉得,SDN中对于故障解决问题还不成熟,当然对于控制器端故障,可以通过集群等方式解决,如果是数据层面,可以通过控制器端写业务应用来检测切换。

    -----------------------------------------------------------------------------------------------------

    展开全文
  • 通过构建该系统,机器人可以快速找到与用户问题相匹配的答案并自动回答,从而大大减少企业的人力成本;除了提供专业领域的问答功能外,还可实现闲聊、私人助手等问答服务。 尽管业界在智能问答领域已经取得了令人...
  • 特征匹配

    千次阅读 2017-04-10 14:37:54
    特征提取是计算机视觉图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征。特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者...
  • 阻抗匹配基础

    万次阅读 多人点赞 2009-08-11 21:17:00
    一件器材的输出阻抗所连接的负载阻抗之间所应满足的某种关系,以免接上负载后对器材本身的工作状态产生明显的影响。对电子设备互连来说,例如信号源连放大器,前级连后级,只要后一级的输入阻抗大于前一级的输出...
  • STM32 外部晶振电路设计和匹配

    万次阅读 多人点赞 2019-06-20 18:35:38
    看数据手册,内部的HSI是由ST出厂时校准过的,但是精度并高,在0到70℃下误差范围达到 -1.3%到2%,即便是在标准的25℃下,也有 -1.1%到1.8% 的误差(如下图)。 对于高波特率的异步串口通讯,或者需要高精度定时的...
  • 内存CPU匹配方法详解

    万次阅读 2013-05-02 10:46:47
    1.内存CPU的有关数据 2.内存跟CPU搭配的基本原则 3.在Intel平台实现频率同步的方法 4.在Intel平台实现带宽相等的计算方法 5.在Intel平台用主板调控内存运行参数的方法 6.在Intel 平台没有FSB了,怎么配内存 ...
  • 关于阻抗、阻抗匹配和电容的作用

    千次阅读 2009-08-19 15:36:00
    1. 阻抗的概念在具有电阻、电感电容的电路里,对交流电所起的阻碍作用叫做阻抗。常用Z来表示,它的值由交流电的频率、电阻R、电感L、电容C相互作用来决定。由此可见,一个具体的电路,其阻抗是随时变化的,它会...
  • 从大量数据中通过字符串的匹配查找数据的关键是索引,对字符串的精确相等匹配,前缀匹配(like 'x%')后缀匹配(like '%x')可以使用btree索引,对中缀匹配(like '%x%')正则表达式匹配就可以用pg_trgm的索引了。...
  • 我 10 年前在一家外企做 Java 实习生的时候,就差不多这个水平((月薪 3k-5k),10 多年过去了,可以稍微把目标放得大一点,比如说 8k-10k,我觉得也不是可能! 在一线城市找一份靠谱的实习工作我觉得还是难的...
  • 什么是阻抗匹配以及为什么要阻抗匹配... 阻抗匹配在高频设计中是一个常用的概念,这篇文章对这个“阻抗匹配”进行了比较好的解析。回答了什么是阻抗匹配。 阻抗匹配(Impedance matching)是微波电子学里的一...
  • 到合适的工作怎么办

    千次阅读 多人点赞 2017-01-02 07:01:14
    究竟什么是合适的工作?长时间找到合适的工作时怎么办?
  • 【PCB布局布线】之差分布线阻抗匹配(转) 一、PCB差分布线操作 参看:Altium Designer -- 精心总结 PCB 差分布线已经讲的很清楚了,在此做介绍。 二、差分布线优缺点 参看:实际运用中差分信号线的分析...
  • 阻抗匹配及其作用

    千次阅读 2009-04-20 21:46:00
    终端电阻是为了消除在通信电缆中的信号反射在通信过程中,有两种信号因导致信号反射:阻抗连续阻抗不匹配。 阻抗连续,信号在传输线末端突然遇到电缆阻抗很小甚至没有,信号在这个地方就会引起反射。这种信号...
  • (转载)STM32 外部晶振电路设计和匹配

    千次阅读 2020-02-02 12:05:23
    STM32的时钟源 STM32F103有两种主时钟方案,一个是依靠内部RC振荡器的HSI(内部高速时钟),另一个是HSE(外部高速时钟)。... 看数据手册,内部的HSI是由ST出厂时校准过的,但是精度并高,在...
  • 多关键词匹配个人解决方案

    千次阅读 2017-11-05 16:15:52
    本文章是对于多关键词匹配的两种个人解决方案的介绍,只是想记录一下自己的想法而已,喜勿喷! ^_^ 最简单也是对于我们来说最方便的解决多关键词匹配的方法就是:从数据库中把关键词列表取出,然后对待检索文章...
  • 阻抗匹配及电路设计

    千次阅读 2011-04-25 16:57:00
    <br />阻抗匹配在高频设计中是一个常用的概念,这篇文章对这个“阻抗匹配”进行了比较好的解析。回答了什么是阻抗匹配。 阻抗匹配(Impedance matching)是微波电子学里的一部分,主要用于传输线上,来达...
  • 裸辞2个月找工作,我慌了

    万次阅读 多人点赞 2019-05-20 16:33:38
    工作时候压力很大,有人说自信会很受打击,还有人说会很绝望,是人生的低谷……尽管很多时候我们自己知道,我不是找工作,只是找到理想中的好工作。但这也能改变你的空白期正在一天一天变长,...
  • 射频基础之阻抗匹配与Smith图

    万次阅读 多人点赞 2017-09-06 10:57:09
    一件器材的输出阻抗所连接的负载阻抗之间所应满足的某种关系,以免接上负载后对器材本身的工作状态产生明显的影响。对电子设备互连来说,例如信号源连放大器,前级连后级,只要后一级的输入阻抗大于前一级的输出...
  • 来源-作者@聚优致成&amp;:https://blog.csdn.net/qq_29350001/article/details/50904312建议读者阅读原文,确保获得...二、差分布线优缺点参看:实际运用中差分信号线的分析 LAYOUT 参看:差分信号 -- 维...
  • Nginx工作原理优化总结。

    万次阅读 多人点赞 2013-05-16 11:04:53
    在大多数场景下,默认的 NGINX Linux 设置可以很好的工作,但要达到最佳性能,有些时候必须做些调整。首先我们先了解其工作原理。 1. Nginx的模块与工作原理 Nginx由内核模块组成,其中,内核的设计非常...
  • 什么是阻抗匹配?以及为什么要阻抗匹配?  一、什么是阻抗 具有电阻、电感电容的电路里,对交流电所起的阻碍作用叫做阻抗。阻抗常用Z表示。阻抗由电阻、感抗容抗三者组成,但不是三者简单相加。如果三者是...
  • 关于 USB 通信阻抗匹配的问题

    千次阅读 2015-11-05 17:04:30
    都是需要加终端电阻进行阻抗匹配的,许多工程师对终端电阻的理解不是很清楚,甚至因为程序上能正常通讯,所以就索性省去了终端电阻。这样带来很大的隐患,通讯时好时坏,通常是去检查时没有问题,而回到家一睡觉,...
  • 开源软件是提高生产力软件质量的关键因素,正确的使用开源软件,可以提高产品的竞争力,但是在产品功能不断更新、开发周期不断缩短的压力下,很多公司难以有效的对代码中的开源软件进行有效的识别管理。...
  • Perl匹配中文

    千次阅读 2009-11-13 19:05:00
    最后由于在输出的时候不能直接使用utf8编码的字符串,还需要将切割后的字符用encode函数编码 为 gb2312格式的字节流,再用print输出。 Encode模块的初步应用大概就是这样,详细情况还是要参阅模块的文档。实际上...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 157,373
精华内容 62,949
关键字:

当能力和工作不匹配的时候