标签目录:侗族娱乐怎么样

摩登3注册网站_科技企业估值猛增,美股再迎IPO狂热潮,投资者疯了吗?

随着送餐应用DoorDash和民宿短租平台Airbnb上市,IPO变得更狂热,硅谷的创业狂潮冲得更高。 实时在线活动平台Hopin是一家位于英国伦敦的创业公司,它只有7名员工,但年初时公司的估值达到3800万美元。Hopin CEO Johnny Boufarhat本来无意融入更多资金,但大流行扩散,越来越多的人参与虚拟活动,Hopin的业务也随着扩张。投资者开始主动接触Hopin,想加入进来。Boufarhat说:“他们纷至沓来,就像鼓点一样密集。投资者以新方式引诱创始人。” 6月份 Hopin又融资4000万美元,Accel、IVP参与投资。上个月,Hopin甚至还没有正式宣讲又融资1.25亿美元,估值达到21亿美元,比一年前增长77倍。Boufarhat坦言:“投资者几乎每天都会找我们。” 当大流行开始时,有人说创业大萧条将会来临。但是当新冠走过初步阶段,渐渐恶化,这种担忧却消失了。人们以新的方式生活,工作、学习、购物、社交都以远程方式进行,科技产品和服务受到追捧,市场情绪改变,交易变得疯狂起来。 VC你争我夺 Discord、Robinhood都以很高的估值融入资金,然后又被新资金淹没。VC你争我夺,都想投资。随着送餐应用DoorDash和民宿短租平台Airbnb上市,IPO变得更狂热,硅谷的创业狂潮冲得更高。 投资公司Menlo Ventures的高管Matt Murphy说:“几乎现在所有热门公司都成为积极追求的对象。与以往不同的是,大家似乎不惜任何代价都想夺得资产。” 数字产品和服务的需求增长是一大原因,但并非唯一原因。因为美国的利率很低,投资者为了追求回报,愿意向高风险资产下注。VC公司的融资已经创下新高。股市大涨导致更多公司IPO。大型科技公司正在疯狂收购,甚至连比特币也创下新高。 CB Insights在报告中指出,在多种因素的助推下,今年三季度创业公司融资365亿美元,同比增长30%。Pitchbook的数据显示,到目前为止今年创业公司完成223宗大交易(融资1亿美元或者更多),数量已经超越去年的总和。 VC公司Founder Collective的高管Eric Paley指出:“过去20多年我都没有看到这样的现象。宴会很热闹,美酒不断,就像当年的网络泡沫一样,只是这一次我们在家里单独畅饮。” 大流行期间的确有一些创业公司削减开支,但在“盛宴或饥荒”两大阵营中,许多创业公司被划到盛宴的一边。在新冠的冲击下,有些技术本来要几年才能普及,现在却压缩到几个月,一些不知名的软件公司突然成为明星,比如云计算公司、金融科技公司、协作软件公司。华尔街最近比较热情,欢迎快速增长的软件公司上市,比如Snowflake、Asana、JFrog、Sumo Logic、Unity。 来自Renegade Partners的投资者Roseanne Wincek说,科技产业已经很庞大,但世界还是低估了它的庞大程度,她说:“越来越多的人现在看清了。” 估值创新高 周三时DoorDash上市,公司估值最高达到353亿美元,比之前的估值高一倍。最开始DoorDash的IPO发行价区间是75-85美元,后来上调到90-95美元。Airbnb随后也上市,之前它设定的发行价区间是44-50美元,后来上调到56-60美元。如此一来,Airbnb的估值最高可达420亿元,比新冠爆发前增长32%。 一般来说,私营创业公司每隔12-18个月就要融资,不过由于投资者十分热情,现在时间已经缩短到3-6个月。一些创业公司以更高的估值完成一轮又一轮融资。 一位移知情人士称,6月份社交媒体平台Discord融资,估值35亿美元,没多久投资者又说要给它更多钱。另两位知情者称,现在Discord正在洽谈,准备融入更多资金,估值达到70亿美元。 食品杂货配送公司Instacart今年融了两批资金,估值翻了一倍多,达到177亿美元。股票交易App Robinhood今年融资4次,总金额12.5亿美元,估值达到117亿美元。 在大流行期间,投资者发现用奢华的晚宴或名流云集的派对无法吸引企业家,他们如果想占据投资优势,只能跑得更快。 Rahul Vohra是一位企业家,他也向年轻创业公司投资,他说最近老是在同一天听创业公司做Pitch、做尽职调查、签约、打钱过去。Rahul Vohra还说:“连坐的时间都没有。”如果等一周,意味着价格会更贵,争夺的投资者会更多,可能还会失去投资机会。 今年夏末时,Addition接触安全软件创业公司Snyk,想向它投资。48小时内Snyk签下投资协议,这笔投资离上一次Snyk融资只有8个月,公司估值达到26亿美元,它的年营收只有3000万美元。 Snyk CEO Peter McKay说:“投资者将速度作为优势。如果投资者等着企业家上门,那就有些晚了。” Brex为其它创业公司提供信用卡,公司CEO Henrique Dubugras说有许多投资者主动给他们打电话。在大流行初期,Brex裁员62人,不过6月时业务却开始反弹。之后VC就打电话给公司,说它们想投资。 Dubugras表示:“我从来没有见过如此狂热的现象。”他说Brex现在正在做计划,准备融入更多资金。 一些投资者开始不安,他们担心会有泡沫。Paley说,在Founder Collective投资的企业中,有些企业融入让人震惊的资金,风险非常高。他还说:“当大家向我们祝贺时,我们有些羞怯,不知道令人流鼻血的估值对我们或者创始人而言到底是好事还是坏事。” 也有投资者认为,现在说什么“天要塌了”没有意义。谁愿意听呢?十多年来,一些著名的投资人一直在警告,说创业公司开支太高、估值太高,有泡沫。但在这段时间内科技产业越变越大,越来越富,越来越强。 3月份,红杉曾经发出备忘录,说“黑天鹅”将要飞出,企业要为困难年做好准备。 DoorDash和Airbnb上市让红杉受益,红杉还是Zoom的投资方,Zoom在不到两年的时间里估值从10亿美元增至1160亿美元。 来自QED Investors的投资人Frank Rotman今年8月曾说,创业公司一次又一次融资,这是“我见过的最令人不安的趋势”。他还说:“如果一家公司的银行账户里藏着很多便宜的钱,公司可能更容易脱轨。”一些顶级VC回应称,他们也有相似的想法。 不久前QED刚完成一笔投资,另一家VC公司跑出来说它们也愿意投钱,估值增加1-2倍,就在QED汇钱的同一天这家公司想签署协议。Rotman说:“真是有些疯狂。” 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3注册登录网_使用标准稳压器产生极低电压

问题: 有什么好的解决方案可以产生只有几百毫伏的微型直流电源电压? 只需将一个干净的外加正电压连接至DC-DC转换器的反馈电阻即可。 在过去的几年里,由于微控制器、CPU、DSP等数字电路的几何结构尺寸不断缩小,电子元器件的电源电压一直持续下降。在测量领域也有一些需要低电源电压的应用。 多年以来,线性稳压器和开关稳压器一直采用约1.2 V的反馈电压。此电压由DC-DC转换器IC中的带隙电路产生,它确定了使用外部电阻分压器可以设置的最低电压。到目前为止,大多数现代稳压器IC都可以产生0.8 V、0.6 V甚至0.5 V的输出电压。内部基准电压源也按这种方式设计,所以能够获得更低的电压。图1所示为这种类型的开关稳压器 LTC3822,它以0.6 V的基准电压产生0.6 V的反馈电压。 图1.可产生0.6 V或更高低输出电压的LTC3822 DC-DC转换器 但是,如果需要低于0.6 V的电源电压,则需要对图1所示的电路进行调整,否则无法使用。 利用一些技巧,您也可以使开关或线性稳压器产生低于反馈电压的电压。可以通过使用图2所示的电路实现。将电阻分压器与一个外加的偏置正电压连接,用于调节输出电压。该电压可以由低压降稳压器(LDO)或基准电压源产生。这样,电阻分压器构成了一个电压分压器,电流IFB 的流动方向与图1中的常规情况相反。在图2中,电流从外部基准电压源经由电阻分压器流向输出电压。 公式1显示了IC的反馈电压(VFB)、所需的输出电压(VOUT)、外加正极直流偏置电压(VOFFSET),以及电阻分压器的电阻R1和R2之间关系。 对于电阻分压器的阻值选择,建议R1、R2的总和介于100 kΩ和500 kΩ之间。这使得偏置电流在功率效率方面足够低,但又高到可以防止过多的噪声耦合到敏感的反馈路径。 图2.对图1电路进行调整,可以产生低于0.6 V的输出电压 这一设计理念通常适用于产生低于开关稳压器或线性稳压器的额定最低电压的电压。但是,应注意几点:外加的基准电压源应在DC-DC转换器开启之前启动和运行。如果该辅助电压为0 V或具有高电阻,DC-DC转换器可能会产生过高的电压并损坏负载电路。 在最糟糕的情况下,即当开关稳压器尚未开启但辅助电压已经施加时,流经电阻分压器的电流IFB将为输出电容充电,使其电压高于设置电压。当负载具有极高阻抗时,就会发生这种情况。所以设置一个最小负载以避免这种情况可能是必要的。 电阻分压器的辅助电压(在图2中为1 V)精度会直接影响所产生的电源电压精度。因此,应使用特别干净的低纹波电压。 此外,并非所有电压转换器都适合进行此类操作。例如,DC-DC转换器中电流检测放大器的测量范围也许只能提供较高电压下的工作范围。还应该注意的是,在较高输入电压下产生极低电压,还需要低占空比。这里,选择一个具有较短最小导通时间的开关稳压器IC,并在低开关频率下工作可能是非常有帮助的。 图3.可以使用仿真工具(例如ADI的LTspice®)对电路实施初始测试 如果要以低于IC制造商指定的输出电压运行线性稳压器或开关稳压器,使用仿真工具(例如ADI的LTspice)进行初始检查是非常有用的。图3显示了一个LTC3822构成的电路,使用额外的电压源作为反馈路径的偏置。在这个电路中,产生一个200 mV输出电压。根据数据手册,LTC3822适用于产生最低0.6 V的输出电压。在电路中,辅助电压源(图3中的电压源V2)可以通过LDO稳压器或基准电压源实现。利用本文所述的技巧,对电路进行完全测试,甚至可能产生更低的输出电压。

摩登3平台注册登录_小型固态电池开启物联网新纪元

作为传统锂离子电池的替代品,固态电池的开发工作目前正在全球范围内展开。这种新一代的电池采用性质稳定且不易燃的固体电解质材料来代替液体,消除了泄漏和着火的风险,具有优秀的安全性、高可靠性和更长的使用寿命。TDK成功地实现了全球首款全陶瓷固态SMD *1电池CeraCharge™的商业化,并有望搭载于各种IoT设备中。(照片由CookPerfect提供) 解决传统锂离子电池局限性的下一代解决方案 毫不夸张地说,随着我们进入物联网时代,几乎所有事物都连接到了互联网,要想提高各种智能设备的普及率,除了紧凑的外形和更强的通信功能之外,高电池性能也是必不可少的。具有高能量密度的锂离子电池如今被广泛用于各种电子设备,例如笔记本电脑、智能手机和无线耳塞等,并且越来越多地运用于无人机、电动自行车和EV(电动汽车)中。然而,由于锂离子电池是使用易燃的有机溶剂电解质制成,存在泄漏和着火的风险,因此物联网设备制造商对开发更安全、更可靠的含有稳定电解质材料的固态电池的需求也与日俱增。预计将来EV等设备中的大容量电池也将被固态电池取代,其市场规模将进一步扩大。 小型全固态锂离子薄型电池的全球市场规模和预测 来源:以全球下一代电池市场为基础:日本矢野经济研究所2019年主要调查研究结果。 固态电池市场在未来10年内预计将呈指数增长。 常规锂离子电池与固态锂离子电池的对比 固态电池采用固态电解质材料代替传统锂离子电池中的液态电解质,可提供较高水平的安全性和更长的使用寿命。 由TDK率先推出的固态SMD电池CeraCharge的功能 随着全球各公司不断致力于固态电池的开发,TDK成功地实现了全球首款固态SMD(表面贴装器件)电池CeraCharge的商业化。CeraCharge是基于TDK先进的积层陶瓷技术打造的,具有适合量产的优势。其固体陶瓷电解质消除了泄漏和着火的风险,同时具备其他实用特性,包括:1.5V的标称电压,100μAh的容量,-20˚C至80˚C的工作温度范围。此外,其SMD型设计便于放置电池,从而有助于降低组装成本。由于具有尺寸小、安全性高和使用寿命长的优势,它很适合搭载在各种环境下使用的IoT设备中。 CeraCharge™固态电池的横截面(示意图) CeraCharge是利用TDK的先进积层陶瓷技术打造的。 芯片大小的安全固态电池CeraCharge正在逐步应用到各种IoT产品中。其中一种应用就是2020年12月推出的烹饪温度计产品。这款新产品是一个15cm的金属温度计探头,由丹麦一家生产烹饪温度计系列产品的CookPerfect公司出品,配备有五个温度传感器,一个BLE(蓝牙低能耗)*2通信模块以及TDK的CeraCharge。只需插入此探头,即可通过智能手机实时监测烤箱内烤肉的内部温度。借助这一突破性的产品,人们能够在理想的温度下烹饪圣诞节烤肉等各种肉类。 CookPerfect的联合创始人兼董事总经理Martin Kloster表示:“当我们在2016年开始设计CookPerfect时,根本没有哪一种电池技术可以支持在5个点进行测量,运行复杂的算法,并且可以内置到相应装置中。但是借助CeraCharge,我们得以打造首个“真正的无线”温度计。”Kloster提到,可靠性和安全性非常重要,因为这些温度计将直接插入到食物中并用于高温烤箱和烤架。“绝对不能有任何化学泄漏。我们还需要较高的工作温度范围,可以承受在烤箱内部使用。固态的CeraCharge没有泄漏的风险,其体积小到可以安装到3.7mm直径的装置中,并且可以承受高达85˚C温度,这就是我们选择将它用在产品中的主要决定因素。” CookPerfect的无线肉类温度计 15cm的金属探头内含五个温度传感器,一个通信模块和固态CeraCharge电池,可在烹饪时对肉类进行实时温度监测。(照片由CookPerfect提供) 例如此类将温度传感器与通信功能结合在一起的烹饪温度计,随着配备各种传感器的设备的不断普及,一个全面的物联网社会即将来临。随着市场对各种尺寸和规格电池的需求不断增长,目前正在考虑将CeraCharge集成到各种设备中,包括用于智能仪表、可穿戴设备和智能传感器的实时时钟(RTC)*3。 作为全球率先将固态电池商业化的公司,TDK将继续致力于扩大其产品系列,同时提高其微型化程度和容量,以覆盖更广泛的应用领域。CeraCharge将一如既往地为快速扩张的物联网市场提供有力支持。 CeraCharge™固态电池 从简单的小工具到规格复杂的设备,各种工业和消费类IoT设备日益需要紧凑、安全且可靠的电源。为了满足这些需求,TDK开发了全球首款可充电固态SMD电池CeraCharge。有关更多信息,请访问TDK产品中心页面。

摩登3测速登录地址_mybatis日志功能是如何设计的?

引言 我们在使用mybatis时,如果出现sql问题,一般会把mybatis配置文件中的logging.level参数改成debug,这样就能在日志中看到某个mapper最终执行sql、入参和影响数据行数。我们拿到sql和入参,手动拼接成完整的sql,然后将该sql在数据库中执行一下,就基本能定位到问题原因。mybatis的日志功能使用起来还是非常方便的,大家有没有想过它是如何设计的呢? 从logging目录开始 我们先看一下mybatis的logging目录,该目录的功能决定了mybatis使用什么日志工具打印日志。 logging目录结构如下: 它里面除了jdbc目录,还包含了7个子目录,每一个子目录代表一种日志打印工具,目前支持6种日志打印工具和1种非日志打印工具。我们用一张图来总结一下 除了上面的8种日志工具之外,它还抽象出一个Log接口,所有的日志打印工具必须实现该接口,后面可以面向接口编程。定义了LogException异常,该异常是日志功能的专属异常,如果你有看过mybatis其他源码的话,不难发现,其他功能也定义专属异常,比如:DataSourceException等,这是mybatis的惯用手法,主要是为了将异常细粒度的划分,以便更快定位问题。此外,它还定义了LogFactory日志工厂,以便于屏蔽日志工具实例的创建细节,让用户使用起来更简单。 如果是你该如何设计这个功能? 我们按照上面目录结构的介绍其实已经有一些思路: 定义一个 Log接口,以便于统一抽象日志功能,这8种日志功能都实现 Log接口,并且重写日志打印方法。 定义一个 LogFactory日志工厂,它会根据我们项目中引入的某个日志打印工具jar包,创建一个具体的日志打印工具实例。 看起来,不错。但是,再仔细想想,LogFactory中如何判断项目中引入了某个日志打印工具jar包才创建相应的实例呢?我们第一个想到的可能是用if...else判断不就行了,再想想感觉用if...else不好,7种条件判断太多了,并非优雅的编程。这时候,你会想一些避免太长if...else判断的方法,当然如果你看过我之前写的文章《实战|如何消除又臭又长的if…else判断更优雅的编程?》,可能已经学到了几招,但是mybatis却用了一个新的办法。 mybatis是如何设计这个功能的? 从 Log接口开始 它里面抽象了日志打印的5种方法和2种判断方法。 再分析 LogFactory的代码 它里面定义了一个静态的构造器logConstructor,没有用if...else判断,在static代码块中调用了6个tryImplementation方法,该方法会启动一个执行任务去调用了useXXXLogging方法,创建日志打印工具实例。 当然tryImplementation方法在执行前会判断构造器logConstructor为空才允许执行任务中的run方法。下一步看看useXXXLogging方法:看到这里,聪明的你可能会有这样的疑问,从上图可以看出mybatis定义了8种useXXXLogging方法,但是在前面的static静态代码块中却只调用了6种,这是为什么? 对比后发现:useCustomLogging 和 useStdOutLogging 前面是没调用的。useStdOutLogging它里面使用了StdOutImpl类 该类其实就是通过JDK自带的System类的方法打印日志的,无需引入额外的jar包,所以不参与static代码块中的判断。 而useCustomLogging方法需要传入一个实现了Log接口的类,如果mybatis默认提供的6种日志打印工具不满足要求,以便于用户自己扩展。 而这个方法是在Configuration类中调用的,如果用户有自定义logImpl参数的话。 具体是在XMLConfigBuilder类的settingsElement方法中调用 再回到前面LogFactory的setImplementation方法 它会先找到实现了Log接口的类的构造器,返回将该构造器赋值给全局的logConstructor。 这样一来,就可以通过getLog方法获取到Log实例。 然后在业务代码中通过下面这种方式获取Log对象,调用它的方法打印日志了。 梳理一下LogFactory的流程: 在static代码块中根据逐个引入日志打印工具jar包中的日志类,先判断如果全局变量logConstructor为空,则加载并获取相应的构造器,如果可以获取到则赋值给全局变量logConstructor。 如果全局变量logConstructor不为空,则不继续获取构造器。 根据getLog方法获取Log实例 通过Log实例的具体日志方法打印日志 在这里还分享一个知识点,如果某个工具类里面都是静态方法,那么要把该工具类的构造方法定义成private的,防止被疑问调用,LogFactory就是这么做的。 适配器模式 日志模块除了使用工厂模式之外,还是有了适配器模式。 适配器模式会将所需要适配的类转换成调用者能够使用的目标接口 涉及以下几个角色: 目标接口( Target ) 需要适配的类( Adaptee ) 适配器( Adapter) mybatis是怎么用适配器模式的? 上图中标红的类对应的是Adapter角色,Log是Target角色。 而LogFactory就是Adaptee,它里面的getLog方法里面包含是需要适配的对象。 sql执行日志打印原理 从上面已经能够确定使用哪种日志打印工具,但在sql执行的过程中是如何打印日志的呢?这就需要进一步分析logging目录下的jdbc目录了。 看看这几个类的关系图: ConnectionLogger、PreparedStatementLogger、ResultSetLogger和StatementLogger都继承了BaseJdbcLogger类,并且实现了InvocationHandler接口。从类名非常直观的看出,这4种类对应的数据库jdbc功能。 类名 对应功能 ConnectionLogger Connection PreparedStatementLogger PreparedStatement ResultSetLogger ResultSet StatementLogger Statement 它们实现了InvocationHandler接口意味着它用到了动态代理,真正起作用的是invoke方法,我们以ConnectionLogger为例: 如果调用了prepareStatement方法,则会打印debug日志。 上图中传入的original参数里面包含了\n\t等分隔符,需要将分隔符替换成空格,拼接成一行sql。 最终会在日志中打印sql、入参和影响行数: 上图中的sql语句是在ConnectionLogger类中打印的 那么入参和影响行数呢? 入参在PreparedStatementLogger类中打印的 影响行数在ResultSetLogger类中打印的 大家需要注意的一个地方是: sql、入参和影响行数只打印了debug级别的日志,其他级别并没打印。所以需要在 mybatis logging.level debug,才能打印日志。 不知道大家有没有发现这样一个问题: 在LogFactory的代码中定义了很多匿名的任务执行器 但是在实际调用时,却没有在线程中执行,而是直接调用的,这是为什么? 答案是为了保证顺序执行,如果所有的日志工具jar包都有,加载优先级是:slf4j 》commonsLog 》log4j2 》log4j 》jdkLog 》NoLog 还有个问题,顺序执行就可以了,为什么要把匿名内部类定义成Runnable的呢? 这里非常有迷惑性,因为它没创建Thread类,并不会多线程执行。我个人认为,这里是mybatis的开发者的一种偷懒,不然需要定义一个新类代替这种执行任务的含义,还不如就用已有的。 长按订阅更多精彩▼ 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3平台首页_干货!一文了解SPI总线工作原理、优缺点和应用案例

将微控制器连接到传感器,显示器或其他模块时,您是否考虑过两个设备之间如何通信?他们到底在说什么?他们如何能够相互理解? 电子设备之间的通信就像人类之间的通信,双方都需要说同一种语言。在电子学中,这些语言称为通信协议。幸运的是,在构建大多数DIY电子项目时,我们只需要了解一些通信协议。在本系列文章中,我们将讨论三种最常见协议的基础知识:串行外设接口(SPI),内部集成电路(I2C)和通用异步接收器/发送器(UART)驱动通信。 首先,我们将从一些关于电子通信的基本概念开始,然后详细解释SPI的工作原理。 SPI,I2C和UART比USB,以太网,蓝牙和WiFi等协议慢得多,但它们更简单,使用的硬件和系统资源也更少。SPI,I2C和UART非常适用于微控制器之间以及微控制器和传感器之间的通信,在这些传感器中不需要传输大量高速数据。 串行与并行通信 电子设备通过物理连接在设备之间的导线发送数据位来相互通信,有点像一个字母中的字母,除了26个字母(英文字母表中),一个位是二进制的,只能是1或0。通过电压的快速变化,位从一个设备传输到另一个设备。在工作电压为5V的系统中,0位作为0V的短脉冲通信,1位通过5V的短脉冲通信。 数据位可以并行或串行形式传输。在并行通信中,数据位是同时发送的,每个都通过单独的线路。下图显示了二进制(01000011)中字母“C”的并行传输: 在串行通信中,通过单线逐个发送这些位。下图显示了二进制(01000011)中字母“C”的串行传输: SPI通信简介 许多设备都采用了SPI通用通信协议。例如,SD卡模块,RFID读卡器模块和2.4 GHz无线发送器/接收器都使用SPI与微控制器通信。 SPI的一个独特优势是可以不间断地传输数据。可以连续流发送或接收任意数量的比特。使用I2C和UART,数据以数据包形式发送,限制为特定的位数。启动和停止条件定义每个数据包的开始和结束,因此数据在传输过程中会被中断。 通过SPI通信的设备处于主从关系。主设备是控制设备(通常是微控制器),而从设备(通常是传感器,显示器或存储器芯片)接收来自主设备的指令。最简单的SPI配置是单主机,单从机系统,但是一个主机可以控制多个从机(下面将详细介绍)。 SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间。 (1)MISO– Master Input Slave Output,主设备数据输入,从设备数据输出; (2)MOSI– Master Output Slave Input,主设备数据输出,从设备数据输入; (3)SCLK – Serial Clock,时钟信号,由主设备产生; (4)CS – Chip Select,从设备使能信号,由主设备控制。 *实际上,从设备的数量受到系统负载电容的限制,受主设备在电压电平之间精确切换的能力。 SPI如何工作 时钟 时钟信号将来自主设备的数据位输出与从设备的位采样同步。在每个时钟周期传输一位数据,因此数据传输的速度由时钟信号的频率决定。由于主设备配置并生成时钟信号,因此SPI时钟始终为主设备的时钟。 设备共享时钟信号的任何通信协议称为同步。SPI是一种同步通信协议,还有一些不使用时钟信号的异步方法。例如,在UART通信中,双方都设置为预先配置的波特率,该波特率决定数据传输的速度和时间。 SPI中的时钟信号可以使用时钟极性和时钟相位属性进行修改。这两个属性协同工作以定义何时输出以及何时对它们进行采样。时钟极性可由主机设置,以允许在时钟周期的上升沿或下降沿输出和采样。时钟相位也可以由主机设置,以便在时钟周期的第一个边沿或第二个边沿上进行输出和采样,无论是上升还是下降。 从设备选择 主设备可以通过将从设备的CS / SS线设置为低电压电平来选择要通话的从设备。在空闲非传输状态中,从选择线保持在高电压电平。主机上可能有多个CS / SS引脚,以允许多个从机并联连接。如果只有一个CS/SS引脚,则可以通过菊花链将多个从器件连接到主器件。 多个从设备 SPI可以设置为使用单个主设备和单个从设备进行操作,也可以设置通过单个主设备控制多个从设备。有两种方法可以将多个从站连接到主站。如果主机有多个从机选择引脚,则从机可以并联连接,如下所示: 如果只有一个从选择引脚可用,则从器件可以菊花链式连接,如下所示: MOSI和MISO 主机通过MOSI线串行发送数据到从机。从器件接收MOSI引脚上的主器件发送的数据。从主设备发送到从设备的数据通常首先以最高有效位发送。 从机还可以通过串行的MISO线路将数据发送回主机。从从设备发送回主设备的数据通常首先以最低有效位发送。 SPI数据传输步骤 1.主机输出时钟信号: 2.主器件将SS / CS引脚切换到低电压状态,从而激活从器件: 3.主机沿MOSI线一次一位地向从机发送数据。从机在接收到的位时读取这些位: 4.如果需要响应,从站将沿着MISO线一次一位地向主站返回数据。主机在接收到的位时读取这些位: SPI的优点和缺点 使用SPI有一些优点和缺点,如果在不同的通信协议之间进行选择,您应该根据项目的要求知道何时使用SPI: 优点 没有启动和停止位,因此数据可以连续流式传输而不会中断 没有复杂的从机寻址系统,如I2C 比I2C更高的数据传输速率(几乎快两倍) 单独的MISO和MOSI线,因此可以同时发送和接收数据 缺点 使用四根线(I2C和UART使用两根) 无法确认数据已成功接收(I2C已执行此操作) 没有错误检查,如UART中的奇偶校验位 仅允许单个主机 最后 以上就是本次的分享,如果觉得文章不错,转发、在看,也是我们继续更新得动力。 猜你喜欢: 串口打印知多少? 串口通讯你真的会了吗?不妨看看这些经验 ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3平台开户_Teledyne e2v的新服务缓解了航空航天和国防领域正面临的热量管理和功率限制难题

法国格勒诺布尔 – Media OutReach – 2020年11月24日 – Teledyne e2v在为航空航天、国防客户解决其高可靠性(Hi-Rel)电子处理平台的功耗和热量管理方面取得了进一步进展。该公司在2019年末宣布的服务基础上扩大服务范围,以纳入几个关键的附加元素。因此,在部署高性能多核处理器的设计团队,可以享受更多方面的服务来提升设计的裕度。 当面对功耗消耗过大和缺乏足够空间来散发产生的热量时,工程师必须找到相应的方法来改进他们的设计。而今,在设计概念阶段通过与Teledyne e2v合作,客户的技术团队有机会更好地评估Teledyne e2v在处理器级别提供的设计裕度,这将有助于他们理解所必需保持的范围边界。Teledyne e2v在处理器使用方面的技能和经验,使其成为在在处理器系统上提高功效或优化热量管理的首选合作伙伴。 通过深入分析应用的总体表现,可以明确最佳方案,以克服功率预算以及与空间使用限制所带来的潜在挑战。为了实现这一点,可以查阅诸如处理器CPU负载、核心频率和结温等参数的数据。接下来,Teledyne e2v能够筛选和提供功率优化的处理器,这意味着其可以提供符合标准的最佳配合。如此一来,可以提升性能基准,同时节省电力资源和减少产生热量。 Teledyne e2v的应用工程师Thomas PORCHEZ解释说:”通常只有在设计项目接近尾声时,工程师才会遇到电源和热管理问题,但硬件安装在内部的外壳几乎没有为散热或风扇留出空间,从而导致性能有所折衷。此外,工程师可能会被迫预留足够的’头部空间’来安装未来的系统升级,这将对尽可能提高系统的能效带来更大压力。” 他继续表示:”空间限制或潜在的机械故障也可能意味着必须得使用无风扇系统,甚至可能需要在极端情况下保持运行。例如,即使在随附的风扇无法运作的情况下,系统也能够长时间保持运行。事实证明,我们的专长至关重要。通过结合我们的筛选和技术建议,我们已经成功地将一些客户部署的功耗水平降低了一半。”

摩登3主管554258:_2020年11月全国程序员工资,新出炉!

2020年11月全国招收程序员340579人。2020年11月全国程序员平均工资14327元,工资中位数12500元,其中96%的人的工资介于3000元到85000元。 工资与上个月相比有所下降,但是岗位有所增加,也许这也是经济复苏的信号。我最近就接到很多面试电话。 城市 北京,上海,杭州,深圳,仍然是工资最高的四座城市。 南京的工资爬了一名,超过了广州。真替广州捉急。。。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3测速登录地址_基础知识:压敏电阻原理、参数、选型

周末好~ 压敏电阻并不是一般的电阻,而是一种具有瞬态电压抑制功能的元件,效果同TVS。 这篇文章介绍压敏电阻的一些基本知识,包括参数、选型、应用等。      基础知识   压敏电阻用MY表示,MY后缀:J (家用)、W(稳压)、G(过压)、P (高频)、L(防雷)、H(灭弧)、Z(消噪)等,这是一般通用命名方式,不同厂家的命名不太一样。 压敏电阻是一种具有非线性伏安特性的特殊电阻器件,英文名称叫Voltage Dependent Resistor,简写为VDR ,或者叫做Varistor。 压敏电阻不是真正的电阻,而是一种具有瞬态电压抑制功能的元件,一般无正负极之分,这一点不同于TVS,使用时同样是并接与被保护IC或电路,压敏电阻的响应时间会比TVS慢一点。 当加到压敏电阻上的电压超过一定值时,它的阻值会迅速下降,以导通大电流,保护后端电路;当低于其工作电压时,压敏电阻阻值极高,相当于开路,不影响后端电路的工作状态。 压敏电阻虽然能吸收很大的浪涌能量, 但不能承受毫安级以上的持续电流,在用作过压保护时必须考虑到这一点。 压敏电阻与被保护设备连接 再看一下压敏电阻的参数。    参数解读    如下是某一压敏电阻的电气参数。 某一压敏电阻电气参数 ▉ 压敏电压 指击穿电压或阈值电压,特定电流下测得的压敏电阻两端的电压,一般是1mA直流电流通入压敏电阻时测试得到的。 一般符号是Vb@1mA(DC)或者V1mA。 ▉ 最大工作电压 分为交流和直流两种情况。对交流来说,一般用AC RMS表示,指的是加在压敏电阻上的交流有效值不能超过这个值,上面SPEC的Vwac指加在压敏电阻上的交流电压有效值不能超过4V。对直流来说,被保护信号或者电路的最高电压不能超过这个值。 SPEC中的Vdc是5.5V,即对于即对于5.5V以上的直流电路来说,这个压敏电阻是不合适的。 ▉ 最大钳位电压 指施加规定的脉冲能量波形如(8/20µs)时压敏电阻两端电压,从SPEC看,对压敏电阻施加8/20µs脉冲波形时,最大钳位电压是18V。8/20us脉冲指的是8us达到100%Ipp,20us达到50%Ipp。 8/20µs脉冲能量波形 ▉ 能量耐量 指施加规定的脉冲能量波形(如10/1000µs波形)时压敏电阻吸收的最大能量,符号用E表示,单位是J(焦耳Joule),压敏电阻的片径越大,它的能量耐量越大,耐冲击电流也越大。 能量耐量的计算公式是:W=KIVT,I是流过压敏电阻的峰值电流,K是电流I的波形系数,不同的脉冲波形系数K不一样(2ms的方波K=1,8/20μs的波形K=1.4,10/1000μs的波形K=1.4),T是电流的持续时间,V是电流为I时压敏电阻两端的电压。 10/1000µs脉冲能量波形 ▉ 浪涌电流 指的是施加规定的脉冲能量波形(如8/20µs)时,压敏电阻的电气特性不会下降的最大电流,从SPEC上可以看到此压敏电阻,在8/20µs脉冲波形下,最大浪涌电流到3A。 有这么定义的:1次,以 8/20μs 标准波形的电流作一次冲击的最大电流值,此时压敏电压变化率仍在±10%以内;2 次,以 8/20μs 标准波形的电流作两次冲击的最大电流值,两次冲击时间间隔为 5 分钟,此时压敏电压变化率仍在±10%以内。 在一些资料上,会有通流容量这个概念,也可以把最大浪涌电流看作通流容量,通流容量比较难计算,多个压敏电阻并联,其压敏电压不变,通流量等于几者之和,要求并联的压敏电阻伏安特性尽量相同,否则易引起分流不均匀而损坏压敏电阻对选型来说,一般参照SPEC即可。 ▉ 静电电容 指的是压敏电阻器本身固有的电容容量,一般测试条件是振荡器频率为1KHz或1MHz,振荡器电压1Vrms。 ▉ 漏电流 现在一般SPEC不给出压敏电阻的漏电流参数,漏电流又称为等待电流,指压敏电阻器在规定的温度和最大直流电压下,流过压敏电阻器的电流。    选型要点    压敏电阻的选型,我总结了如下几点。 一、在交流回路中,V1mA(min)≥(2.2~2.5)*Vac,Vac是被保护交流电路工作电压有效值。 二、在直流回路中,V1mA(min)≥(1.6~2)*Vdc,Vdc是直流电路最大工作电压。 三、 如果被保护电路工作电压或耐压较低,而浪涌能量又比较大,则可选择压敏电压较低、片径较大的压敏电阻器。 四、如果工作电压或耐压较高,可选择压敏电压较高的压敏电阻器,既保护了电路,又能延长压敏电阻寿命。 五、压敏电阻的电容量一般是几十到几百pF,。 再来看看压敏电阻的分类。 按结构分:可以分为结型压敏电阻器、体型压敏电阻器、单颗粒层压敏电阻器和薄膜压敏电阻器。 按使用材料分:可分为氧化锌压敏电阻器、碳化硅压敏电阻器、金属氧化物压敏电阻器、锗(硅)压敏电阻器、钛酸钡压敏电阻器。 按伏安特性分:可分为对称型压敏电阻器(无极性)和非对称型压敏电阻器(有极性),我们一般使用的压敏电阻都是没有极性的。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3平台登录_究竟什么是内核?我该如何高效学习?

01 前言 本文主要讲解什么是Linux内核,以及通过多张图片展示Linux内核的作用与功能,以便于读者能快速理解什么是Linux内核,能看懂Linux内核。 拥有超过1300万行的代码,Linux内核是世界上最大的开源项目之一,但是内核是什么,它用于什么? 02 什么是内核 内核是与计算机硬件接口的易替换软件的最低级别。它负责将所有以“用户模式”运行的应用程序连接到物理硬件,并允许称为服务器的进程使用进程间通信(IPC)彼此获取信息。 03 内核还要分种类? 是的,没错。 3.1 微内核 微内核只管理它必须管理的东西:CPU、内存和IPC。计算机中几乎所有的东西都可以被看作是一个附件,并且可以在用户模式下处理。微内核具有可移植性的优势,因为只要操作系统仍然试图以相同的方式访问硬件,就不必担心您是否更改了视频卡,甚至是操作系统。微内核对内存和安装空间的占用也非常小,而且它们往往更安全,因为只有特定的进程在用户模式下运行,而用户模式不具有管理员模式的高权限。 3.1.1 Pros 可移植性 安装占用空间小 小内存占用 安全 3.1.2 Cons 通过驱动程序,硬件更加抽象 硬件可能反应较慢,因为驱动程序处于用户模式 进程必须在队列中等待才能获得信息 进程不能在不等待的情况下访问其他进程 3.2 单内核 单内核与微内核相反,因为它们不仅包含CPU、内存和IPC,而且还包含设备驱动程序、文件系统管理和系统服务器调用等内容。单内核更擅长于访问硬件和多任务处理,因为如果一个程序需要从内存或运行中的其他进程中获取信息,那么它就有一条更直接的线路来访问信息,而不需要在队列中等待来完成任务。但是,这可能会导致问题,因为在管理模式下运行的东西越多,如果行为不正常,就会有越多的东西导致系统崩溃。 3.2.1 Pros 更直接地访问程序的硬件 流程之间更容易通信 如果支持您的设备,它应该不需要额外安装就可以工作 进程反应更快,因为没有等待处理器时间的队列 3.2.2 Cons 较大安装体积 较大内存占用 不太安全,因为所有操作都在管理模式下运行 04 混合的内核 混合内核能够选择在用户模式下运行什么,以及在管理模式下运行什么。通常情况下,设备驱动程序和文件系统I/O将在用户模式下运行,而IPC和服务器调用将保持在管理器模式下。这是两全其美,但通常需要硬件制造商做更多的工作,因为所有驱动程序的责任都由他们来承担。它还可能存在一些与微内核固有的延迟问题。 4.1 Pros 开发人员可以选择什么在用户模式下运行,什么在管理模式下运行 比单片内核更小的安装占用空间 比其他型号更灵活 4.2 Cons 会遭受与微内核相同的进程延迟 设备驱动程序需要由用户管理(通常) 05 Linux内核文件在哪里 Ubuntu中的内核文件存储在/boot文件夹中,称为vmlinux -version。vmlinuz这个名字来自于unix世界,早在60年代,他们就把内核简单地称为“unix”,所以当内核在90年代首次开发时,Linux就开始把内核称为“Linux”。 当开发虚拟内存以便更容易地进行多任务处理时,将“vm”放在文件的前面,以显示内核支持虚拟内存。有一段时间,Linux内核被称为vmlinux,但是内核变得太大,无法装入可用的引导内存,因此压缩了内核映像,并将末尾的x更改为z,以显示它是用zlib压缩的。并不总是使用相同的压缩,通常用LZMA或BZIP2替换,一些内核简单地称为zImage。 版本号将采用A.B.C.格式D在。B可能是2.6,C是您的版本,D表示您的补丁或补丁。 在/boot文件夹中还有其他非常重要的文件,称为initrd.img-version、system.map-version, config-version。initrd文件用作一个小RAM磁盘,用于提取和执行实际的内核文件。这个系统。map文件用于内核完全加载之前的内存管理,配置文件告诉内核在编译内核映像时要加载哪些选项和模块。 06 Linux内核体系结构 因为Linux内核是单片的,所以它比其他类型的内核占用空间最大,复杂度也最高。这是一个设计特性,在Linux早期引起了相当多的争论,并且仍然带有一些与单内核固有的相同的设计缺陷。 为了解决这些缺陷,Linux内核开发人员所做的一件事就是使内核模块可以在运行时加载和卸载,这意味着您可以动态地添加或删除内核的特性。这不仅可以向内核添加硬件功能,还可以包括运行服务器进程的模块,比如低级别虚拟化,但也可以替换整个内核,而不需要在某些情况下重启计算机。 想象一下,如果您可以升级到Windows服务包,而不需要重新启动…… 07 内核模块 如果Windows已经安装了所有可用的驱动程序,而您只需要打开所需的驱动程序怎么办?这本质上就是内核模块为Linux所做的。内核模块,也称为可加载内核模块(LKM),对于保持内核在不消耗所有可用内存的情况下与所有硬件一起工作是必不可少的。 模块通常向基本内核添加设备、文件系统和系统调用等功能。lkm的文件扩展名是.ko,通常存储在/lib/modules目录中。由于模块的特性,您可以通过在启动时使用menuconfig命令将模块设置为load或not load,或者通过编辑/boot/config文件,或者使用modprobe命令动态地加载和卸载模块,轻松定制内核。 第三方和封闭源码模块在一些发行版中是可用的,比如Ubuntu,默认情况下可能无法安装,因为这些模块的源代码是不可用的。该软件的开发人员(即nVidia、ATI等)不提供源代码,而是构建自己的模块并编译所需的.ko文件以便分发。虽然这些模块像beer一样是免费的,但它们不像speech那样是免费的,因此不包括在一些发行版中,因为维护人员认为它通过提供非免费软件“污染”了内核。 内核并不神奇,但对于任何正常运行的计算机来说,它都是必不可少的。Linux内核不同于OS X和Windows,因为它包含内核级别的驱动程序,并使许多东西“开箱即用”。希望您能对软件和硬件如何协同工作以及启动计算机所需的文件有更多的了解。 08 Linux 内核学习经验总结 开篇 学习内核,每个人都有自己的学习方法,仁者见仁智者见智。以下是我在学习过程中总结出来的东西,对自身来说,我认为比较有效率,拿出来跟大家交流一下。 内核学习,一偏之见;疏漏难免,恳请指正。 为什么写这篇博客 刚开始学内核的时候,不要执着于一个方面,不要专注于一个子系统就一头扎到实际的代码行中去,因为这样的话,牵涉的面会很广,会碰到很多困难,容易产生挫败感,一个函数体中(假设刚开始的时候正在学习某个方面的某个具体的功能函数)很可能掺杂着其他各个子系统方面设计理念(多是大量相关的数据结构或者全局变量,用于支撑该子系统的管理工作)下相应的代码实现,这个时候看到这些东西,纷繁芜杂,是没有头绪而且很不理解的,会产生很多很多的疑问,(这个时候如果对这些疑问纠缠不清,刨根问底,那么事实上就是在学习当前子系统的过程中频繁的去涉足其他子系统,这时候注意力就分散了),而事实上等了解了各个子系统后再回头看这些东西的话,就简单多了,而且思路也会比较清晰。所以,要避免 “只见树木,不见森林”,不要急于深入到底层代码中去,不要过早研究底层代码。 我在大二的时候刚开始接触内核,就犯了这个错误,一头扎到内存管理里头,去看非常底层的实现代码,虽然也是建立在内存管理的设计思想的基础上,但是相对来说,比较孤立,因为此时并没有学习其它子系统,应该说无论是视野还是思想,都比较狭隘,所以代码中牵涉到的其它子系统的实现我都直接跳过了,这一点还算聪明,当然也是迫不得已的。 我的学习方法 刚开始,我认为主要的问题在于你知道不知道,而不是理解不理解,某个子系统的实现采用了某种策略、方法,而你在学习中需要做的就是知道有这么一回事儿,然后才是理解所描述的策略或者方法。 根据自己的学习经验,刚开始学习内核的时候,我认为要做的是在自己的脑海中建立起内核的大体框架,理解各个子系统的设计理念和构建思想,这些理念和思想会从宏观上呈献给你清晰的脉络,就像一个去除了枝枝叶叶的大树的主干,一目了然;当然,肯定还会涉及到具体的实现方法、函数,但是此时接触到的函数或者方法位于内核实现的较高的层次,是主(要)函数,已经了解到这些函数,针对的是哪些设计思想,实现了什么样的功能,达成了什么样的目的,混个脸熟的说法在这儿也是成立的。至于该主函数所调用的其它的辅助性函数就等同于枝枝叶叶了,不必太早就去深究。此时,也就初步建立起了内核子系统框架和代码实现之间的关联,关联其实很简单,比如一看到某个函数名字,就想起这个函数是针对哪个子系统的,实现了什么功能。 我认为此时要看的就是LKD3,这本书算是泛泛而谈,主要就是从概念,设计,大的实现方法上描述各个子系统,而对于具体的相关的函数实现的代码讲解很少涉及(对比于ULK3,此书主要就是关于具体函数代码的具体实现的深入分析,当然,你也可以看,但是过早看这本书,会感觉很痛苦,很枯燥无味,基本上都是函数的实现),很少,但不是没有,这就很好,满足我们当前的需求,还避免我们过早深入到实际的代码中去。而且本书在一些重要的点上还给出了写程序时的注意事项,算是指导性建议。主要的子系统包括:内存管理,进程管理和调度,系统调用,中断和异常,内核同步,时间和定时器管理,虚拟文件系统,块I/O层,设备和模块。(这里的先后顺序其实就是LKD3的目录的顺序)。 我学习的时候是三本书交叉着看的,先看LKD3,专于一个子系统,主要就是了解设计的原理和思想,当然也会碰到对一些主要函数的介绍,但大多就是该函数基于前面介绍的思想和原理完成了什么样的功能,该书并没有就函数本身的实现进行深入剖析。然后再看ULK3和PLKA上看同样的子系统,但是并不仔细分析底层具体函数的代码,只是粗略地、不求甚解地看,甚至不看。因为,有些时候,在其中一本书的某个点上,卡壳了,不是很理解了,在另外的书上你可能就碰到对同一个问题的不同角度的描述,说不准哪句话就能让你豁然开朗,如醍醐灌顶。我经常碰到这种情况。 并不是说学习过程中对一些函数体的实现完全就忽略掉,只要自己想彻底了解其代码实现,没有谁会阻止你。我是在反复阅读过程中慢慢深入的。比如VFS中文件打开需要对路径进行分析,需要考虑的细节不少(.././之类的),但是其代码实现是很好理解的。再比如,CFS调度中根据shedule latency、队列中进程个数及其nice值(使用的是动态优先级)计算出分配给进程的时间片,没理由不看的,这个太重要了,而且也很有意思。 ULK3也会有设计原理与思想之类的概括性介绍,基本上都位于某个主题的开篇段落。但是更多的是对支持该原理和思想的主要函数实现的具体分析,同样在首段,一句话综述函数的功能,然后对函数的实现以1、2、3,或者a、b、c步骤的形式进行讲解。我只是有选择性的看,有时候对照着用source insight打开的源码,确认一下代码大体上确实是按书中所描述的步骤实现的,就当是增加感性认识。由于步骤中掺杂着各种针对不同实现目的安全性、有效性检查,如果不理解就先跳过。这并不妨碍你对函数体功能实现的整体把握。 PLKA介于LKD3和ULK3之间。我觉得PLKA的作者(看照片,真一德国帅小伙,技术如此了得)肯定看过ULK,无论他的本意还是有意,总之PLKA还是跟ULK有所不同,对函数的仔细讲解都做补充说明,去掉函数体中边边角角的情况,比如一些特殊情况的处理,有效性检查等,而不妨碍对整个函数体功能的理解,这些他都有所交代,做了声明;而且,就像LKD3一样,在某些点上也给出了指导性编程建议。作者们甚至对同一个主要函数的讲解的着重点都不一样。这样的话,对我们学习的人而言,有助于加深理解。另外,我认为很重要的一点就是PLKA针对的2.6.24的内核版本,而ULK是2.6.11,LKD3是2.6.34。在某些方面PLKA比较接近现代的实现。其实作者们之所以分别选择11或者24,都是因为在版本发行树中,这两个版本在某些方面都做了不小的变动,或者说是具有标志性的转折点(这些信息大多是在书中的引言部分介绍的,具体的细节我想不起来了)。 Intel V3,针对X86的CPU,本书自然是系统编程的权威。内核部分实现都可以在本书找到其根源。所以,在读以上三本书某个子系统的时候,不要忘记可以在V3中相应章节找到一些基础性支撑信息。 在读书过程中,会产生相当多的疑问,这一点是确信无疑的。大到搞不明白一个设计思想,小到不理解某行代码的用途。各个方面,各种疑问,你完全可以把不理解的地方都记录下来(不过,我并没有这么做,没有把疑问全部记下来,只标记了很少一部分我认为很关键的几个问题),专门写到一张纸上,不对,一个本上,我确信会产生这么多的疑问,不然内核相关的论坛早就可以关闭了。其实,大部分的问题(其中很多问题都是你知道不知道有这么一回事的问题)都可以迎刃而解,只要你肯回头再看,书读百遍,其义自现。多看几遍,前前后后的联系明白个七七八八是没有问题的。我也这么做了,针对某些子系统也看了好几遍,切身体会。 当你按顺序学习这些子系统的时候,前面的章节很可能会引用后面的章节,就像PLKA的作者说的那样,完全没有向后引用是不可能的,他能做的只是尽量减少这种引用而又不损害你对当前问题的理解。不理解,没关系,跳过就行了。后面的章节同样会有向前章节的引用,不过这个问题就简单一些了  ,你可以再回头去看相应的介绍,当时你不太理解的东西,很可能这个时候就知道了它的设计的目的以及具体的应用。不求甚解只是暂时的。比如说,内核各个子系统之间的交互和引用在代码中的体现就是实现函数穿插调用,比如你在内存管理章节学习了的内存分配和释放的函数,而你是了解内存在先的,在学习驱动或者模块的时候就会碰到这些函数的调用,这样也就比较容易接受,不至于太过茫然;再比如,你了解了系统时间和定时器的管理,再回头看中断和异常中bottom half的调度实现,你对它的理解就会加深一层。 子系统进行管理工作需要大量的数据结构。子系统之间交互的一种方式就是各个子系统各自的主要数据结构通过指针成员相互引用。学习过程中,参考书上在讲解某个子系统的时候会对数据结构中主要成员的用途解释一下,但肯定不会覆盖全部(成员比较多的情况,例如task_struct),对其它子系统基于某个功能实现的引用可能解释了,也可能没做解释,还可能说这个变量在何处会做进一步说明。所以,不要纠结于一个不理解的点上,暂且放过,回头还可以看的。之间的联系可以在对各个子系统都有所了解之后再建立起来。其实,我仍然在强调先理解概念和框架的重要性。 等我们完成了建立框架这一步,就可以选择一个比较感兴趣的子系统,比如驱动、网络,或者文件系统之类的。这个时候你再去深入了解底层代码实现,相较于一开始就钻研代码,更容易一些,而且碰到了不解之处,或者忘记了某个方面的实现,此时你完全可以找到相应的子系统,因为你知道在哪去找,查漏补缺,不仅完成了对当前函数的钻研,而且可以回顾、温习以前的内容,融会贯通的时机就在这里了。 《深入理解linux虚拟内存》(2.4内核版本),LDD3,《深入理解linux网络技术内幕》,几乎每一个子系统都需要一本书的容量去讲解,所以说,刚开始学习不宜对某个模块太过深入,等对各个子系统都有所了解了,再有针对性的去学习一个特定的子系统。这时候对其它系统的援引都可以让我们不再感到茫然、复杂,不知所云。 比如,LDD3中的以下所列章节:构造和运行模块,并发和竞态,时间、延迟及延缓操作,分配内存,中断处理等,都属于驱动开发的支撑性子系统,虽说本书对这些子系统都专门开辟一个章节进行讲解,但是详细程度怎么能比得上PLKA,ULK3,LKD3这三本书,看完这三本书,你会发现读LDD3这些章节的时候简直跟喝白开水一样,太随意了,因为LDD3的讲解比之LKD3更粗略。打好了基础,PCI、USB、TTY驱动,块设备驱动,网卡驱动,需要了解和学习的东西就比较有针对性了。这些子系统就属于通用子系统,了解之后,基于这些子系统的子系统的开发—驱动(需进一步针对硬件特性)和网络(需进一步理解各种协议)—相对而言,其学习难度大大降低,学习进度大大加快,学习效率大大提升。说着容易做来难。达到这样一种效果的前提就是:必须得静下心来,认真读书,要看得进去,PLKA,ULK3厚得都跟砖头块儿一样,令人望之生畏,如果没有兴趣,没有热情,没有毅力,无论如何都是不行,因为需要时间,需要很长时间。我并不是说必须打好了基础才可以进行驱动开发,只是说打好了基础的情况下进行开发会更轻松,更有效率,而且自己对内核代码的驾驭能力会更强大。这只是我个人见解,我自己的学习方式,仅供参考。 语言 PLKA是个德国人用德语写的,后来翻译成英文,又从英文翻译成中文,我在网上书店里没有找到它的纸质英文版,所以就买了中文版的。ULK3和LKD3都是英文版的。大牛们写的书,遣词造句真的是简洁,易懂,看原版对我们学习计算机编程的程序员来说完全不成问题,最好原汁原味。如果一本书确实翻译地很好,我们当然可以看中文版的,用母语进行学习,理解速度和学习进度当然是很快的,不作他想。看英文的时候不要脑子里想着把他翻译成中文,没必要。 API感想 “比起知道你所用技术的重要性,成为某一个特别领域的专家是不重要的。知道某一个具体API调用一点好处都没有,当你需要他的时候只要查询下就好了。”这句话源于我看到的一篇翻译过来的博客。我想强调的就是,这句话针应用型编程再合适不过,但是内核API就不完全如此。 内核相当复杂,学习起来很不容易,但是当你学习到一定程度,你会发现,如果自己打算写内核代码,到最后要关注的仍然是API接口,只不过这些API绝大部分是跨平台的,满足可移植性。内核黑客基本上已经标准化、文档化了这些接口,你所要做的只是调用而已。当然,在使用的时候,最好对可移植性这一话题在内核中的编码约定烂熟于心,这样才会写出可移植性的代码。就像应用程序一样,可以使用开发商提供的动态库API,或者使用开源API。同样是调用API,不同点在于使用内核API要比使用应用API了解的东西要多出许多。 当你了解了操作系统的实现—这些实现可都是对应用程序的基础性支撑啊—你再去写应用程序的时候,应用程序中用到的多线程,定时器,同步锁机制等等等等,使用共享库API的时候,联系到操作系统,从而把对该API的文档描述同自己所了解到的这些方面在内核中的相应支撑性实现结合起来进行考虑,这会指导你选择使用哪一个API接口,选出效率最高的实现方式。对系统编程颇有了解的话,对应用编程不无益处,甚至可以说是大有好处。 设计实现的本质,知道还是理解 操作系统是介于底层硬件和应用软件之间的接口,其各个子系统的实现很大程度上依赖于硬件特性。书上介绍这些子系统的设计和实现的时候,我们读过了,也就知道了,如果再深入考虑一下,为什么整体架构要按照这种方式组织,为什么局部函数要遵循这样的步骤处理,知其然,知其所以然,如果你知道了某个功能的实现是因为芯片就是这么设计的,CPU就是这么做的,那么你的疑问也就基本上到此为止了。再深究,就是芯片架构方面的设计与实现,对于程序员来讲,无论是系统还是应用程序员,足迹探究到这里,已经解决了很多疑问,因为我们的工作性质偏软,而这些东西实在是够硬。 比如,ULK3中讲解的中断和异常的实现,究其根源,那是因为Intel x86系列就是这么设计的,去看看Intel V3手册中相应章节介绍,都可以为ULK3中描述的代码实现方式找到注解。还有时间和定时器管理,同样可以在Intel V3  对APIC的介绍中获取足够的信息,操作系统就是依据这些硬件特性来实现软件方法定义的。 又是那句话,不是理解不理解的问题,而是知道不知道的问题。有时候,知道了,就理解了。在整个学习过程中,知道,理解,知道,理解,知道……,交叉反复。为什么开始和结尾都是知道,而理解只是中间步骤呢?世界上万事万物自有其规律,人类只是发现而已,实践是第一位的,实践就是知道的过程,实践产生经验,经验的总结就是理论,理论源于实践,理论才需要理解。我们学习内核,深入研究,搞来搞去,又回到了芯片上,芯片是物质的,芯片的功用基于自然界中物质本有的物理和电子特性。追本溯源,此之谓也。 动手写代码 纸上得来终觉浅,绝知此事要躬行。只看书是绝对不行的,一定要结合课本给出的编程建议自己敲代码。刚开始就以模块形式测试好了,或者自己编译一个开发版本的内核。一台机器的话,使用UML方式调试,内核控制路走到哪一步,单步调试看看程序执行过程,比书上的讲解更直观明了。一定要动手实际操作。 参考书 LDD3 …