📄 timer.c.txt
字号:
any question,send email to netxiong@263.net
相关文件:
/include/linux/timer.h
***************************基本数据结构***********************************************
(1):tvec_base_t tvec_bases[NR_CPUS];
#每一个cpu都有一个tvec_base_t的结构对应。
**************************************************************************************
***********************初始化函数*****************************************************
(1):void __init init_timers(void)
#对所有的cpu的所有的tvec_bases[]结构进行初始化。
#init_bh(TIMER_BH, run_all_timers);
**************************************************************************************
****************************一般处理函数**********************************************
(1):static void run_all_timers(void)
#对所有的cpu上的时间等待队列进行处理。
#for (i = 0; i < smp_num_cpus; i++)
#调用__run_timer进行处理
tvec_base_t *base = tvec_bases + i;
#
__run_timers(base);
(2):static void __run_timers(tvec_base_t *base)
#对所有在tv1上的等待队列进行处理
#head = base->tv1.vec + base->tv1.index; //取出队列的头指针
#循环区数据直到回到头指针。
#fn = timer->function;
data = timer->data; //取出处理函数和指针。
# detach_timer(timer); //从队列中删除。
#fn(data) //执行。
(3):void add_timer(timer_t *timer)
#把timer加入到timer队列中去。
#首先检查是否他已经在队列中了
if (timer_pending(timer))
goto bug;
#调用 internal_add_timer(base, timer);加入
#参数设置timer->base = base把节点头赋给它的参数。
(4):static inline void internal_add_timer(tvec_base_t *base, timer_t *timer)
#把timer加入到指定的base中区。
# list_add(&timer->list, vec->prev); //先来先服务。
(5):static inline int detach_timer(timer_t *timer)
#把timer从timer队列中删除。
#首先检查是否他已经不在队列中了,如果不在了,返回成功。
if (!timer_pending(timer))
return 0;
#否则删除list_del(&timer->list);
**************************************************************************************
******************************时钟中断处理函数****************************************
(1):void do_timer(struct pt_regs *regs)
#(*(unsigned long *)&jiffies)++; //时标加一
# mark_bh(TIMER_BH); //标记timer的bottom half
# mark_bh(TQUEUE_BH); //同上
**************************************************************************************
**************************TQUEUE处理函数**********************************************
(1):void tqueue_bh(void)
#这个就是实事时钟的处理函数。见do_timer时钟中断处理函数。
#每当一个jiffies发生后,do_timer就标记TQUEUE_BH,
#调用 run_task_queue(&tq_timer)对tq_timer队列上等待处理的元素进行处理。
(2):void immediate_bh(void)
#immediate队列的处理函数。
#调用 run_task_queue(&tq_immediate)对tq_timer队列上等待处理的元素进行处理。
**************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -