📄 timer.txt
字号:
any question,send email to netxiong@263.net
相关的文件:
/include/linux/timer.h
/kernel/timer.c
****************************实现机理*************************************************
基本过程如下:
当一个时钟中断发生的时候,系统调用timer_interrupt函数,
在这个函数中调用do_timer,do_timer将系统计时器jiffies加一,
同时mark_bh相应的位。更明显,这里的mark_bh将这个软中断连接到tasklet_hi中区。
当处理函数run_all_timer执行的时候,就会调用这个软中断。
注意这里有一点和一般的软中断不同,
一般的软中断是把一个包含处理函数和数据的结构挂接到一定的软中断的队列上的。
所以当系统执行外队列中的一个元素后就把他从队列中拿掉。
所以一般的软中断没有显示的删除操作。
但是时钟中断不同,他是由系统的时钟中断处理函数来进行设置的。
二timer的处理方法是设置了一个几个很大的数组(tvec_base_t),每回用init_timer先生成一个timer,
然后用add_timer连接到这个数组的一项中的list指针后面。当系统执行时,
就扫描这个数组,把那些有timer队列的数组项的timer取出来进行处理,
但并不把他从系统中删除。所以,在系统完成之后,要删除这些项。就是del_timer。
*************************************************************************************
********************************使用方法*********************************************
首先声明一个struct timer_list(timer_t)型的变量。
例如:struct timer_list jiq_timer;
然后使用init_timer进行初始化
例如:init_timer(&jiq_timer);
然后对变量的属性进行赋值
例如:jiq_timer.function = jiq_timedout;
jiq_timer.data = (unsigned long)&jiq_data;
jiq_timer.expires = jiffies + HZ; //注意,这里的值一定要是jiffies+XXX的形式
//也就是延迟执行的时间XXX。
然后调用add_timer加入到系统中去
例如;add_timer(&jiq_timer);
最后删除他(这一步可以省略)
例如:del_timer_sync(&jiq_timer); //主要是防止被信号唤醒,并没有被处理。
注意;在正常的情况下,加入的timer执行完毕后就被从队列中删掉了,
单调用一下del_timer_sync不会产生什么副作用。
*************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -