- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
嵌入式学习的资料之Linux内核定时器笔记
嵌入式学习资料之Linux内核定时器笔记;RTC内核通过IRQ8上发出周期性的中断,频率在2-8192HZ之间,掉电后依然工作,内核通过访问0x70和0x71 I/O端口访问RTC。;利用CLK输入引线,接收外部振荡器的时钟信号,该计算器是利用64位的时间戳计时器寄存器来实现额,与可编程间隔定时器传递来的时间测量相比,更为精确。
可编程间隔定时器(PIT)
PIT的作用类似于微波炉的闹钟,PIT永远以内核确定的固定频率发出中断,但频率不算高。;利用PIC或者APIC总线的时钟计算。;功能比较强大,家机很少用,也不用去记了。;它的时钟信号拥有大约为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字段的值将他们分组放开(如果对动态定时器实现原理没兴趣的,可
您可能关注的文档
最近下载
- 《高等数学(上册)》(阳平华)645-4教案 第六章 第25课 定积分的换元积分法和分部积分法.doc VIP
- 《高等数学(上册)》(阳平华)645-4教案 第六章 第24课 微积分基本公式.doc VIP
- 天津市南仓中学2024-2025学年高二上学期10月月考数学试题(无答案).docx VIP
- 欧洲规范-NF P94-078-中文版.pdf VIP
- 腔隙性脑梗死课件.pptx VIP
- 过顶板破碎段施工安全技术措施.doc VIP
- 2025年湖北省十一校届高三语文联考“世界的馈赠”考场作文评析与升格训练.docx VIP
- 腔隙性脑梗死演示课件.pptx VIP
- 2024第三季度医疗质量与安全管理委员会会议记录[1].docx VIP
- 天津市南仓中学2024-2025学年高二上学期10月月考物理试题(无答案).docx VIP
文档评论(0)