- 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 内核机制-定时器;1. 基本概念;在非进程上下文需要遵循的原则;如何判断中断上下文?;2.在了解定时器之前先了解三个概念;2.1 节拍率:HZ;在X86体系结构中,系统HZ默认值为100
内核在asm/param.h文件中定义了这个值
在编写内核代码时,HZ值不是一个固定不变的值,大多数体系结构的HZ值是可调的;2.1.1 理想的HZ值; 提高节拍率等同于提供啊中断解析度。例如:HZ=100的时钟执行粒度为10ms,,即系统中周期事件最快为每10ms运行一次,而不可能有更高的精度,但是当HZ = 1000时,解析度就为1ms—精细了10倍。虽然内核可以提供频度为1ms的时钟,但是并没有证据显示对系统中所有的程序而言,频率为1000HZ比100HZ的时钟更合适。;高HZ的优点;高HZ的缺点;2.2 jiffies;Jiffies定义于文件linux/jiffies.h中,格式如下:
extern u64 __jiffy_data jiffies_64;
extern unsigned long volatile __jiffy_data jiffies;
使用例子如下:
unsigned long time_tick = jiffies + 1;
//从现在开始1个节拍
unsigned long later = jiffies + 5 * HZ;
//从现在开始5秒;2.2.1 jiffies的回绕; 对于32位无符号长整型,最大取值为2^32-1。所以在溢出之前,定时器节拍计数最大为4294967295。如果节拍计数达到了最大值后还要继续增加的话,它的值就会回绕到0。
比如下面的代码:
unsigned long timeout = jiffies + HZ/2;
//设置超时时间为0.5秒
while (timeout jiffies)
{
/*还没有超时,继续执行任务*/
}
/*超时了,发生错误*/;正常的情况下,上面的代码没有问题。但是当jiffies接近最大值的时候,就会出现回绕问题,如下图所示:
1. 循环中第一次比较时,jiffies = J1,没有超时
2. 循环中第二次比较时,jiffies = J2,实际已经超时了,但是jiffies超过最大值后又从0开始,所以J2远远小于timeout
3. while循环不会结束,相当于死循环。; 内核提供四个宏来帮助比较节拍计数,能正确处理节拍计数的回绕问题;为什么四个宏能解决回绕问题呢?;把上面得代码改成下面得代码就可以解决回绕问题:;关于时间的换算;2.3 用户空间的HZ;/*参见文件: kernel/time.c*/
clock_t jiffies_to_clock_t(long x)
{
#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
# if HZ USER_HZ
return x * (USER_HZ / HZ);
# else
return x / (HZ / USER_HZ);
# endif
#else
return div_u64((u64)x * TICK_NSEC, NSEC_PER_SEC / USER_HZ);
#endif
}
EXPORT_SYMBOL(jiffies_to_clock_t);;2.4 时钟中断处理程序;获得xtime_lock锁,以便访问jiffies_64和墙上时间xtime进行保护
需要时应答或重新设置系统时钟
周期性地使用墙上时间更新实时时钟
调用体系结构无关的时钟例程:tick_periodic();/*tick_periodic函数位于:kernel/time/tick_common.c*/
static void tick_periodic(int cpu)
{
if (tick_do_timer_cpu == cpu) {
write_seqlock(xtime_lock);
/* Keep track of the next tick event */
tick_next_period = ktime_add(tick_next_period, tick_period);
do_timer(1);
write_sequnlock(xtime_lock);
}
update_process_times(user_mode(get_irq_regs()));
profile_tick(CPU_PROFILING);
};
您可能关注的文档
最近下载
- 三年级新教科版科学《水沸腾了》说课稿.pdf VIP
- 2019一级造价工程师《建设工程技术与计量(水利工程)》真题带答案与解析.doc VIP
- 学会与父母沟通kt_,.ppt VIP
- 脑出血的分子生物学机制.pptx VIP
- 电除颤操作流程-电除颤操作流程.ppt VIP
- 医疗器械委托生产生产放行和上市放行管理制度.docx VIP
- 紫日电气ZVF9V变频器使用手册.docx
- 物流行业深度研究报告:大物流时代系列研究(三),公路港到网络货运平台,传化与满帮为例,探讨我国公路整车物流最优解(202108).pdf VIP
- 新教材 人教A版高中数学选择性必修第一册全册各章节 知识点考点汇总及解题方法提炼.pdf VIP
- 工业机器人及其应用 第三章 工业机器人的末端执行器.ppt VIP
文档评论(0)