简单谈谈Linux内核定时器
软件意义上的定时器最终依赖硬件定时器来实现, 内核在时钟中断发生后检测各定时器是否到期 , 到期后的定时器处理函数将作为软中断在底半部执行 。实质上,时钟中断处理程序会 换起TIMER_SOFTIRQ软中断 ,运行当前处理器上到期的所有定时器。 总结起来还是软中断的流程 a.注册软中断处理函数 /*/linux/kernel.timer.c*/ void __init init_timers(void) -->open_softirq(TIMER_SOFTIRQ,run_timer_softirq,NULL); b.添加timer_list到某个链表
c.触发软中断处理函数 void irq_exit(void) -->tick_nohz_stop_sched_tick(); -->raise_softirq_irqoff(TIMER_SOFTIRQ); d.调用软中断处理函数 static void run_timer_softirq(struct softirq_action *h) 1) 一个timer_list 结构体的实例对应一个定时器,其定义如下: 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) 初始化定时器 void init_timer (struct timer_list *timer); TIMER_INITIALIZER (_function,_expires,_data) DEFINE_TIMER (_name,_function,_data) setup_timer (); 3) 增加定时器
4) 删除定时器
5) 修改定时器的expire
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |