黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 淺談Linux內核定時器

淺談Linux內核定時器

更新時間:2020-12-17 17:53:38 來源:動力節點 瀏覽1437次

Linux內核定時器是內核用來控制在未來某個時間點(基于jiffies)調度執行某個函數的一種機制,其實現位于 <Linux/timer.h> 和 kernel/timer.c 文件中。無論是從單片機還是到后面的多任務系統,還是RTOS到Linux,都需要用到定時器。

 

首先我們要知道被調度的函數肯定是異步執行的,它類似于一種“軟件中斷”,而且是處于非進程的上下文中,所以調度函數必須遵守以下規則:

1) 沒有 current 指針、不允許訪問用戶空間。因為沒有進程上下文,相關代碼和被中斷的進程沒有任何聯系。

 

2) 不能執行休眠(或可能引起休眠的函數)和調度。

 

3) 任何被訪問的數據結構都應該針對并發訪問進行保護,以防止競爭條件。

而內核定時器的調度函數運行過一次后就不會再被運行了(相當于自動注銷),但可以通過在被調度的函數中重新調度自己來周期運行。

在SMP系統中,調度函數總是在注冊它的同一CPU上運行,以盡可能獲得緩存的局域性。

 

1.Linux內核定時器的數據結構:

struct timer_list {

    struct list_head entry;

    unsigned long expires;

    void (*function)(unsigned long);

    unsigned long data;

    struct tvec_base *base;

    /* ... */

};

其中 expires 字段表示期望定時器執行的 jiffies 值,到達該 jiffies 值時,將調用 function 函數,并傳遞 data 作為參數。當一個定時器被注冊到內核之后,entry 字段用來連接該定時器到一個內核鏈表中。base 字段是內核內部實現所用的。

 

2.jiffies   

全局變量jiffies用來記錄自系統啟動以來產生的節拍的總數。啟動時,內核將該變量初始化為0,此后,每次時鐘中斷處理程序都會增加該變量的值。一秒內時鐘中斷的次數等于Hz,所以jiffies一秒內增加的值也就是Hz。  

HZ:這個可以認為是一個頻率,一秒內系統時鐘中斷的次數        

Jiffies/HZ:我想知道從系統開機到現在系統運行了多少秒,可以這樣計算         jiffies類型為無符號長整型(unsigned long)  

當jiffies的值超過它的最大存放范圍后就會發生溢出。對于32位無符號長整型,最大取值為(2^32)-1,即429496795。如果節拍計數達到了最大值后還要繼續增加,它的值就會回繞到0。

3.使用定時器步驟

struct timer_list  my_timer_list;//定義一個定時器,可以把它放在你的設備結構中init_timer(&my_timer_list);//初始化一個定時器

my_timer_list.expire=jiffies+HZ;//定時器1s后運行服務程序my_timer_list.function=timer_function;//定時器服務函數add_timer(&my_timer_list);//添加定時器

void timer_function(unsigned long);//寫定時器服務函數del_timer(&my_timer_list);//當定時器不再需要時刪除定時器del_timer_sync(&my_timer_list);//基本和del_timer一樣,比較適合在多核處理器使用,一般推薦使用del_timer_sync

 

4.實例分析#include

#include

#include

#include   /*timer*/

#include   /*jiffies*/

 

MODULE_LICENSE("GPL");

MODULE_AUTHOR("Qifa");

MODULE_DESCRIPTION("Timer Module");

MODULE_ALIAS("timer module");

 

struct timer_list timer;

 

void timer_function(int para)

{

    static int i = 0;

 

    printk("#########%d########Timer Expired and para is %d !!\n",i++,para);

    printk("jiffies:%lu jiffies/Hz: %lu HZ:%d\n",jiffies,(jiffies/HZ),HZ);

    mod_timer(&timer,jiffies+(2*HZ));    

}

 

 

int timer_init(void)

{

    init_timer(&timer);

    timer.data = 5;

    timer.expires = jiffies + (1 * HZ);

    timer.function = timer_function;

    add_timer(&timer);

 

    return 0;

}

 

 

void timer_exit(void)

{

    del_timer( &timer );

}

 

module_init(timer_init);

module_exit(timer_exit);

 

使用定時器的目的無外乎是為了周期性的執行某一任務,或者是到了一個指定時間去執行某一個任務。只要掌握了這一關鍵點,就能更好地理解定時器的工作機制,Linux內核定時器也是如此。在本站的Linux教程里還有關于Linux中其他類型的定時器的介紹,感興趣的小伙伴可以深入學習一下。


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 一色综合| hdⅹvideos欧美在线 | 在线中文字幕网站 | 日韩一区二区三区四区五区 | 看黄视频在线观看 | 国产成人综合在线观看 | 免费乱理伦片奇优影院 | 在线满18网站观看视频 | 中文字幕制服丝袜 | 欧美影院一区二区 | 亚洲青青草 | 北条麻妃初尝试黑人在线观看 | 你懂的手机在线 | 免费欧美| 亚洲特一级毛片 | 免费的一级黄色片 | 一级爱爱片一级毛片-一毛 一级α一级α片免费观看网站 | 97色伦图片在线观看 | 久久青青成人亚洲精品 | 天天躁天天弄天天爱 | 国产第一福利136视频导航 | 欧美精品一区二区精品久久 | 亚洲国产系列一区二区三区 | 国产欧美日韩不卡在线播放在线 | 中文字幕精品在线视频 | 最近更新中文字幕2019视频 | 狠狠的撞进去嗯啊h女强男视频 | 在线免费观看污视频 | www.亚色| 亚洲国产中文在线 | freexxxxⅹhd18日本 | 精品国产一区二区三区香蕉 | 99精品视频在线观看re | 国产精品v欧美精品v日韩精品 | 欧美天堂在线观看 | 色天网站 | 黄色污污 | 日本工里番h本无遮拦全彩 日本高清中文字幕在线观穿线视频 | 久久久亚洲天堂 | 亚洲视频 欧美视频 | 最近中文字幕大全 |