Linux内核定时器笔记

发布时间:2017-1-19 22:52:52 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"Linux内核定时器笔记",主要涉及到Linux内核定时器笔记方面的内容,对于Linux内核定时器笔记感兴趣的同学可以参考一下。

转自:http://linux.chinaitlab.com/kernel/802304.html Linux内核定时器笔记   80X86体系结构上,常用的定时器电路   实时时钟(RTC)   RTC内核通过IRQ8上发出周期性的中断,频率在2-8192HZ之间,掉电后依然工作,内核通过访问0x70和0x71 I/O端口访问RTC。   时间戳计时器(TSC)   利用CLK输入引线,接收外部振荡器的时钟信号,该计算器是利用64位的时间戳计时器寄存器来实现额,与可编程间隔定时器传递来的时间测量相比,更为精确。   可编程间隔定时器(PIT)   PIT的作用类似于微波炉的闹钟,PIT永远以内核确定的固定频率发出中断,但频率不算高。   CPU本地定时器   利用PIC或者APIC总线的时钟计算。   高精度时间定时器(HPET)   功能比较强大,家机很少用,也不去记了。   ACPI电源管理定时器   它的时钟信号拥有大约为3.58MHZ的固定频率,该设备实际上是一个简单的计数器,为了读取计算器的值,内核需要访问某个I/O端口,需要初始化   定时器的数据结构   利用timer_opts描述定时器   Timer_opts的数据结构   Name :标志定时器员的一个字符串   Mark_offset :记录上一个节拍开始所经过的时间,由时钟中断处理程序调用   Get_offset 返回自上一个节拍开始所经过的时间   Monotonic_clock :返回自内核初始化开始所经过的纳秒数   Delay:等待制定数目的“循环”   定时插补   就好像我们要为1小时35分34秒进行定时,我们不可能用秒表去统计,肯定先使用计算时的表,再用计算分的,最后才用秒表,在80x86架构的定时器也会使用各种定时器去进行定时插补,我们可以通过cur_timer指针来实现。   单处理器系统上的计时体系结构   所有与定时有关的活动都是由IRQ线0上的可编程间隔定时器的中断触发。   初始化阶段   1. 初始化间,time_init()函数被调用来建立计时体系结构   2. 初始化xtime变量(xtime变量存放当前时间和日期,它是一个timespec类型的数据结构)   3. 初始化wall_to_monotonic变量,它跟xtime是同一类型的,但它存放将加在xtime上的描述和纳秒数,这样即使突发改变xtime也不会受到影响。   4. 看是否支持高精度计时器HPET   5. 调用select_timer()挑选系统中可利用的最好的定时资源,并让cur_timer变量指向该定时器   6. 调用setup_irq(0,&irq0)来创建与IRQ相应的中断门。   时钟中断处理程序   1. 在xtime_lock顺序锁产生一个write_seqlock()来保护与定时相关的内核变量,这样防止中断让该进程被阻止。   2. 执行cur_timer定时器对象的mark_offset方法(记录上一个节拍开始所经过的时间,由时钟中断处理程序调用)   3. 调用do_timer_interrupt函数,步骤为   a) 使jiffies_64值增1   b) 调用updata_times()函数来更新系统日期和时间。   c) 调用updata_process_times()函数为本地CPU执行几个与定时相关的计数器作用。   d) 调用profile_tick()函数   e) 如果利用外部时钟来同步系统时钟,则每隔660秒,调用一次st_rtc_mmss()函数来调整实时时钟。   f) 调用write_sequnlokc()释放xtime_lock顺序锁。   4. 返回值1,报告中断已经有效地处理了。   这个还算简单,接下来是多处理器系统上的计时体系设计。   多处理器系统上的计时体系   初始化阶段   通过calibrate_APIC_clock()计算本地APIC多久才产生一次中断。   全局时钟中断处理程序   SMP版本的timer_interrupt()处理程序与UP版本的处理程序在几个地方有差异。   Timer_interrupt()调用函数do_timer_interrupt()向I/O APIC芯片的一个端口写入,以应答定时器的中断要求。   Updata_process_times()函数不被调用,因为该函数执行与特定CPU相关的操作   Profile_tick()不被调用,因为该函数同样执行与特定CPU相关的操作。   动态定时器   这部分应用很容易,但要理解动态定时器的机理,真的囧,就说说用的部分吧。   动态定时器存放在timer_list结构中   Struct time_list{   Struct list_head entry;   Spinlock_t lock;   Unsigned long magic;   Void (*function)(unsigned long);   Unsigned long data;   Tvec_base_t *base   };   Entry字段用于将软定时器插入双向循环链表队列中,其值该链表根据定时器expires字段的值将他们分组放开(如果对动态定时器实现原理没兴趣的,可以无视,不需要要设置的项目)   Expries字段给出定时器到期时间,时间用拍子数表示,一般都是 unsigned long expire=timeout+jiffies   Lock自旋锁   Function 定时产生中断后,执行得函数   Data,可以定义一个单独的通用函数来处理多个设备驱动程序超时的问题。

上一篇:android 中设置背景颜色渐变
下一篇:think in java interview-高级开发人员面试宝典(二)

相关文章

相关评论