内核定时器
時(shí)鐘中斷由系統(tǒng)的定時(shí)硬件以周期性的間間隔產(chǎn)生,這個(gè)間隔(即頻率)由內(nèi)核根
據(jù)HZ來(lái)確定,HZ是一個(gè)與體系結(jié)構(gòu)無(wú)關(guān)的常數(shù),可配置(50-1200),在X86平臺(tái),
默認(rèn)值為1000。
每當(dāng)時(shí)鐘中斷發(fā)生時(shí),全局變量jiffies(unsigned long)就加1,因此jiffies記錄
了自linux啟動(dòng)后時(shí)鐘中斷發(fā)生的次數(shù)。驅(qū)動(dòng)程序常利用jiffies來(lái)計(jì)算不同事件間
的時(shí)間間隔。
定時(shí)器用于控制某個(gè)函數(shù)(定時(shí)器處理函數(shù))在未來(lái)的某個(gè)特定時(shí)間執(zhí)行。內(nèi)核定時(shí)
器注冊(cè)的處理函只執(zhí)行一次--不是循環(huán)執(zhí)行的。
內(nèi)核定時(shí)器被組織成雙向鏈表,并使用struct timer_list結(jié)構(gòu)描述。
struct timer_list{
struct list_head entry /*內(nèi)核使用*/;
unsigned long expires; /*超時(shí)的jiffies值*/
void (*function)(unsigned long); /*超時(shí)處理函數(shù)*/
unsigned long data; /*超時(shí)處理函數(shù)參數(shù)*/
struct tvec_base *base; /*內(nèi)核使用*/
};
操作定時(shí)器的有如下函數(shù):
* void init_timer(struct timer_list *timer);
初始化定時(shí)器隊(duì)列結(jié)構(gòu)。
* void add_timer(struct timer_list * timer);
啟動(dòng)定時(shí)器。
* int del_timer(struct timer_list *timer);
在定時(shí)器超時(shí)前將它刪除。當(dāng)定時(shí)器超時(shí)后,系統(tǒng)會(huì)自動(dòng)地將它刪除。
example:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/timer.h> /*timer*/
#include <asm/uaccess.h> /*jiffies*/
MODULE_LICENSE("GPL");
MODULE_AUTHOR("David Xie");
MODULE_DESCRIPTION("Timer Module");
MODULE_ALIAS("timer module");
struct timer_list timer;
void timer_function(int para)
{
printk("<0>Timer Expired and para is %d !!\n",para);
}
int timer_init()
{
init_timer(&timer);
timer.data = 5;
timer.expires = jiffies + (5 * HZ);
timer.function = timer_function;
add_timer(&timer);
return 0;
}
void timer_exit()
{
del_timer( &timer );
}
module_init(timer_init);
module_exit(timer_exit);
轉(zhuǎn)載于:https://www.cnblogs.com/Daniel-G/archive/2012/10/16/2726507.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: 固定资产制作修理费应如何入账
- 下一篇: 注意语句顺序 防止Servlet Req