文章目录 [+] 小编\"大众 data-from=\"大众0\"大众 data-is_biz_ban=\"大众0\公众>序言:上一篇文章我们大略理解了一些关于韶光的观点,以及Linux内核中的关于韶光的基本理解。而本篇则会大略解释时钟硬件,以及Linux韶光子系统干系的一些数据构造。打算机里的时钟硬件前文曾经提到过,内核韶光子系统的实现也须要有硬件的支持。在打算机里一共有三类时钟硬件,分别是真时钟RTC(Real Time Clock)、定时器Timer、计时器Counter。那生活中的场景举例,我们可以理解成RTC相称于是腕表、座钟,定时器相称于是闹钟,计时器当然便是运动会中的计时器。把稳这是三类时钟硬件,而不是三个,某一类时钟可能有多个不同的硬件,某一个时钟硬件也可能实现多种不同的时钟类型。打算机中还有其它的时钟类型,比如晶振时钟,是驱动CPU运行的周期旗子暗记,用来触发和同步CPU内部的操作,我们常说某CPU是多少GHz,便是说这个时钟晶振每秒向CPU发送多少旗子暗记。晶振时钟一样平常在CPU内部,但有些嵌入式CPU的晶振在外部。时钟晶振在软件层不可见。还有一些设备也有自己的时钟,还有相应的驱动可以掌握它。由于这些时钟都和韶光子系统关系不大,以是本文中就不谈论它们了。再详细点的话,我们以x86平台上的时钟举例说说:真时钟RTC,在x86上的硬件实现也叫做RTC,和CMOS(打算机中有很多叫做CMOS的东西,但是是不同的观点,此处的CMOS是指BIOS设置保存数据的地方),是放在一起的。由于在关机后都须要供电,以是两者放在一起,由一个纽扣电池供电。以是有时候也会被人叫做CMOS时钟。定时器Timer,在UP时期是PIT(Programmable Interval Timer),它以固定时间间隔向CPU发送中断旗子暗记。PIT可以在系统启动时设置每秒产生多少个定时器中断,一样平常设置是100,250,300,1000,这个值叫做HZ。到了SMP时期,PIT就不适用了,此时有多种不同的定时器。有一个叫做Local APIC Timer的定时器,它是和中断系统干系的。中断系统有一个全局的IO APIC,有NR_CPU个Local APIC,一个Local APIC对应一个CPU。以是在每个Local APIC都安装一个定时器,专门给自己对应的CPU发送定时器中断,就很方便。还有一个定时器叫做HPET(High Precision Event Timer),它是Intel和微软共同研发的。它不仅是个定时器,而且还有计时器的功能。HPET反面特定的CPU绑定,以是它可以给任意一个CPU发中断,这点和Local APIC Timer不同。计时器Counter,RTC或者定时器虽然也可以实现计时器的目的,但是由于精度太差,以是系统都有专门的计时器硬件。计时器一样平常都是一个整数寄存器,以特定的韶光间隔增长,比如说1纳秒增加1,这样两次读它的值就可以算出个中的韶光差,而且精度很高。x86上最常用的计时器叫做TSC(Time Stamp Counter),是个64位整数寄存器。还有一个计时器叫做ACPI PMT(ACPI Power Management Timer),但是它是一个设备寄存器,须要通过IO端口来读取。而TSC是CPU寄存器,可以直接读取,读取速率就非常快。Linux韶光子系统的文件汇总Linux kernel 韶光子系统的源文件位于linux/kernel/time/目录下,基本包含如下:这里面也包含几个主要的数据构造,接下来会分开说说:Clocksource: 时钟源clock source又被叫做时钟源,如果它的频率是10MHZ,就代表它每秒增加10M次,每增长一次我们称cycle加一,而且两次增长的韶光间隔相同,通过这个性子,可以在两个韶光点读取clock souce,相减得到一个差值,这个差值 / 频率就可以得到两个韶光点的韶光间隔。设cycles:两个韶光点的cycle差值,hz :每一纳秒的cycle值,time :两点之间的韶光差(ns为单位)以是可得:time = cycles/ hz可以看到,通过cycles和hz做除法,可以很轻松的得到两韶光点的详细韶光差,但是落到代码中,就没那么大略了。内核中由于效率或者兼容性问题,禁用了浮点数运算,如果用整数除法那么精度会受到影响,速率也不高,以是内核中用了乘法和移位运算的办法来实现上述公式,虽然也有偏差,但运算速率很高。内核打算韶光差的公式:time = (cycles mul) >> shift,打算mul和shift的过程如下:下面详细阐明一下这个打算过程:上述代码,part2 很好理解,便是根据 mul = (time << shift) / cycle,做打算,part1可能比较难明得,意义如下:time = (cycles mul) >> shift,可以看到想要获取time,先要cycles mul,如果cycles mul溢出了,那打算结果就完备缺点了,以是要对mul的值做限定,担保任何 可能的cycle的值 和mul值相乘都不会溢出,这便是part1的浸染。要达成不产生溢出的哀求,首先要明确可能的cycle的值的范围,cycle一样平常是两次中断之间的时钟源计数差值。以是,求cycle值范围的问题,就转化成了,两次时钟中断的最长间隔。目前两次时钟中断的最长间隔被假设成了10分钟。为什么是10分钟?这因此下两个成分相互平衡做取舍的结果:打算精度,从打算精度来看,mul的值肯定是越大越好,mul的值越大,得到的time值的精度也就越高,当然mul值越大,cycles的最大值就越小,这会影响到第二个成分\"大众能耗\"大众.能耗角度,这个和低功耗干系,由于如果系统处于idle线程的状态,会通过wfi进入低功耗状态,此时如果有中断来临,会让cpu退出,以是如果两次timer中断间隔韶光太短,会增加功耗。 综上两点,内核选择 10分钟 这个值,作为两次韶光中断的韶光间隔最大值,该逻辑可以在init_time_arch()中表示。timer_device:时钟设备(也叫clock_event_device)clocksrouce和clock_event_device之间的关系如上图所示。在arm平台(其他平台该当也是类似)的设计中,硬件定时器设备和时钟源设备是合营利用的,硬件定时器可以设置时钟源到达何值时会产生一个中断。在smp系统中,为了减少处理器间的通信开销,基本上每个cpu都会具备一个属于自己确当地timer_device,独立地为该cpu供应时钟事宜做事,smp中的每个cpu基于本地timer_device,建立自己的高精度定时器。timekeeping模块所谓timekeeping,如字面意思,便是让韶光持续更新下去。linux内核中掩护了有三种韶光观点:Wall time 现实韶光。MONOTONIC time: 递增韶光,从系统被启动时候开始打算,但不包含cpu低功耗状态的韶光。Boot time: 递增的韶光,在monotonic韶光的根本上增加cpu的低功耗状态的韶光。上面三种韶光通过 xtime变量打算,xtime会在系统启动的时候通过从rtc获取的值来初始化,之后通过每次时钟中断的时候,加上当前韶光和上次中断产生韶光的差值。可能会有的疑问:为什么须要掩护xtime,每次须要获取韶光的时候读取rtc不就好了?但实在读取rtc也有缺点,比如:读取rtc的效率不高,以是一样平常只在初始化的时候掩护一次。rtc能供应的韶光精度一样平常很低,最多就到毫秒级别,自己通过clock_source掩护可以达到ns级别。高精度定时器和低精度定时器:传统的低精度定时器,是指让硬件定时器每隔固定时间(1ms或者10ms)产生一次中断,这种操作的默认语义便是许可产生ms级的延迟,这种时钟中断频率作为任务调度用场来说还可以接管,但是如果有更高精度需求的设备就完备无法知足了。以是就涌现了高精度定时器这种形式,它和低精度定时器的最大差别点在于:低精度是被动的等待下一次固定间隔的时钟中断的到来,而高精度定时器则会主动去设置硬件定时器,让它在第几个cycle上产生中断,从而知足自己的需求。很自然的可以推测出来,如果要实现高精度定时器,那么必须担保硬件定时器支持one-shot模式,也便是可以以变革的中断频率涌现。同时为了知足 任务调度的需求和原来系统的对 周期性时钟中断的依赖,专门安排了一个hrtimer来按照(CONFIG_CPU_HZ)规定的频率来对硬件定时器进行设置,从而达到周期性产生时钟中断的效果。相信通过两期的内容,可以帮助大家对打算机韶光子系统有一个大概的理解,同时更好的理解hrtimer和timekeeping事理。显然关于Linux韶光子系统的内容,还有很多可以深入挖掘,在此篇幅有限,就不做过多赘述了,也希望同样对操作系统感兴趣的小伙伴与我们一起互换。部分内容出自:CSDN博主「wmzjzwlzs」的原创文章,原文链接:https://blog.csdn.net/wmzjzwlzs/article/details/131617402以及蜗窝科技 http://www.wowotech.net/timer_subsystem/time-subsyste-architecture.html
最强车载芯片进级AI能力英伟达连续拉拢中国车企_英伟_芯片 界面新闻编辑 | 文姝琪3月19日,英伟达创始人兼CEO黄仁勋在GTC主题演讲中宣告,集中式车载打算平台“NVIDIA DRIVE... 智能 2025-01-24 阅读1 评论0
若何设计嵌入式系统电路板供电系统_电压_事理 条记本电脑电源适配器比如我们手机和条记本电脑的供电便是先由外部一个电源适配器供电,然后产品内部有各种电压值的供电系统。以是设计嵌入... 智能 2025-01-24 阅读5 评论0
英特尔锐炫A系列五款新显卡曝光ID现身Linux内核补丁_新产物_英特尔 这些新添加的 ID 与最近发布的锐炫 A580 GPU 干系的 ID 不一致,基本可以确定是新产品,但仍未知详细型号和参数:0x5... 智能 2025-01-24 阅读9 评论0
苹果硬件高管:自立设计芯片是公司以前20年来最深刻的变革_芯片_苹果 Srouji 阐明,硬件团队、芯片设计团队和软件团队之间的紧密互助形成了独特的事情关系,使苹果能够从发布前四年就开始“构建完备针对... 智能 2025-01-24 阅读1 评论0
一种快速锁定锁相环的筹划设计_暗记_旗子 个中Icp为电荷泵镜像电流,Kvco为压控振荡器增益,N为分频比,ωlpf为滤波器-3 dB带宽。锁相环的闭环通报函数表达为:将式... 智能 2025-01-24 阅读1 评论0
U盘内部存储结构事理及常见的故障分析_优盘_芯片 优盘利用的是标准的USB接口,容量大致在2G~4G之间,高容量的优盘也有256G的产品,以是,它可以作为大容量数据存储交流的设备。... 智能 2025-01-24 阅读5 评论0