简单谈谈Linux内核定时器

吾爱主题 阅读:194 2024-04-05 13:51:59 评论:0

软件意义上的定时器最终依赖硬件定时器来实现, 内核在时钟中断发生后检测各定时器是否到期 , 到期后的定时器处理函数将作为软中断在底半部执行 。实质上,时钟中断处理程序会 换起TIMER_SOFTIRQ软中断 ,运行当前处理器上到期的所有定时器。

总结起来还是软中断的流程

a.注册软中断处理函数

?
1 2 3 /*/linux/kernel.timer.c*/ void __init init_timers( void )    -->open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL);

b.添加timer_list到某个链表

void add_timer (struct timer_list *timer);

c.触发软中断处理函数

?
1 2 3 void irq_exit( void )    -->tick_nohz_stop_sched_tick();      -->raise_softirq_irqoff(TIMER_SOFTIRQ);

d.调用软中断处理函数

static void run_timer_softirq(struct softirq_action *h)
    -->__run_timers(base);
        -->遍历执行时间到达的timer_list中的定时器处理函数
在Linux设备驱动编程中,可以利用Linux内核中提供的一组函数和数据结构来完成定时触发工作或者完成某种周期性的事务。这组函数和数据结构使得驱动程序师在多数情况下不用关心具体的软件定时器究竟对应着怎样的内核和硬件行为。

1) 一个timer_list 结构体的实例对应一个定时器,其定义如下:

?
1 2 3 4 5 6 7 8 9 10 struct timer_list {       struct list_head entry, /*定时器列表*/    unsigned long expires, /*定时器到期时间*/     void (*function) (unsigned long ), /*定时器处理函数*/    unsigned long data, /*作为参数被传入定时器处理函数*/     struct timer_base_s *base,    ...   };

实例化 struct timer_list my_timer;

2) 初始化定时器

?
1 2 3 4 5 6 7 void init_timer ( struct timer_list *timer);   TIMER_INITIALIZER (_function, _expires, _data)   DEFINE_TIMER (_name, _function, _expires, _data)   setup_timer ();

3) 增加定时器

void add_timer (struct timer_list *timer);

4) 删除定时器

int del_timer (struct timer_list *timer);

5) 修改定时器的expire

int mod_timer (struct timer_list *timer, unsigned long expires);

原文链接:http://www.linuxidc.com/Linux/2017-10/147463.htm

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容