成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux驅動技術(七) _內核定時器與延遲工作

系統 Linux 系統運維
軟件上的定時器最終要依靠硬件時鐘來實現,簡單的說,內核會在時鐘中斷發生后檢測各個注冊到內核的定時器是否到期,如果到期,就回調相應的注冊函數,將其作為中斷底半部來執行。實際上,時鐘中斷處理程序會觸發TIMER_SOFTIRQ軟中斷,運行當前處理器上到期的所有定時器。

[[184387]]

內核定時器

軟件上的定時器最終要依靠硬件時鐘來實現,簡單的說,內核會在時鐘中斷發生后檢測各個注冊到內核的定時器是否到期,如果到期,就回調相應的注冊函數,將其作為中斷底半部來執行。實際上,時鐘中斷處理程序會觸發TIMER_SOFTIRQ軟中斷,運行當前處理器上到期的所有定時器。

設備驅動程序如要獲得時間信息以及需要定時服務,都可以使用內核定時器。

jiffies

要說內核定時器,首先就得說說內核中關于時間的一個重要的概念:jiffies變量,作為內核時鐘的基礎,jiffies每隔一個固定的時間就會增加1,稱為增加一個節拍,這個固定間隔由定時器中斷來實現,每秒中產生多少個定時器中斷,由在<linux/param.h>中定義的HZ宏來確定,如此,可以通過jiffies獲取一段時間,比如jiffies/HZ表示自系統啟動的秒數。下兩秒就是(jiffies/HZ+2),內核中用jiffies來計時,秒轉換成的jiffies:seconds*HZ,所以以jiffiy為單位,以當前時刻為基準計時2秒:(jiffies/HZ+2)*HZ=jiffies+2*HZ如果要獲取當前時間,可以使用do_gettimeofday(),該函數填充一個struct timeval結構,有著接近微妙的分辨率。

  1. //kernel/time/timekeeping.c 
  2. /** 
  3. * do_gettimeofday - Returns the time of day in a timeval 
  4. * @tv:         pointer to the timeval to be set 
  5. * NOTE: Users should be converted to using getnstimeofday() 
  6. */ 
  7. void do_gettimeofday(struct timeval *tv)  

驅動程序為了讓硬件有足夠的時間完成一些任務,常常需要將特定的代碼延后一段時間來執行,根據延時的長短,內核開發中使用長延時和短延時兩個概念。長延時的定義為:延時時間>多個jiffies,實現長延時可以用查詢jiffies的方法:

  1. time_before(jiffies, new_jiffies); 
  2. time_after(new_jiffiesmjiffies); 

**短延時的定義為:延遲事件接近或短于一個jiffy,實現短延時可以調用

  1. udelay(); 
  2. mdelay(); 

這兩個函數都是忙等待函數,大量消耗CPU時間,前者使用軟件循環來延遲指定數目的微妙數,后者使用前者的嵌套來實現毫秒級的延時。

定時器

驅動可以注冊一個內核定時器,來指定一個函數在未來某個時間來執行。定時器從注冊到內核開始計時,達到指定的時間后會執行注冊的函數。即超時值是一個jiffies值,當jiffies值大于timer->expires時,timer->function就會被執行。API如下

  1. //定一個定時器 
  2.  
  3. struct timer_list my_timer;//初始化定時器 
  4.  
  5. void init_timer(struct timer_list *timer); 
  6. mytimer.function = my_function; 
  7. mytimer.expires = jiffies +HZ;//增加定時器 
  8.  
  9. void add_timer(struct timer_list *timer);//刪除定時器 
  10.  
  11. int del_tiemr(struct timer_list *timer);  

實例

  1. static struct timer_list tm; 
  2. struct timeval oldtv;void callback(unsigned long arg){ 
  3.     struct timeval tv; 
  4.     char *strp = (char*)arg; 
  5.     do_gettimeofday(&tv); 
  6.     printk("%s: %ld, %ld\n", __func__, 
  7.         tv.tv_sec - oldtv.tv_sec, 
  8.         tv.tv_usec- oldtv.tv_usec); 
  9.     oldtv = tv; 
  10.     tm.expires = jiffies+1*HZ; 
  11.     add_timer(&tm); 
  12. static int __init demo_init(void){ 
  13.     init_timer(&tm); 
  14.     do_gettimeofday(&oldtv); 
  15.     tm.function= callback; 
  16.     tm.data    = (unsigned long)"hello world"
  17.     tm.expires = jiffies+1*HZ; 
  18.     add_timer(&tm); 
  19.     return 0; 
  20.  

延遲工作

除了使用內核定時器完成定時延遲工作,Linux內核還提供了一套封裝好的"快捷方式"-delayed_work,和內核定時器類似,其本質也是利用工作隊列和定時器實現, 

  1. //include/linux/workqueue.h 
  2.  struct work_struct {            
  3.          atomic_long_t data; 
  4.          struct list_head entry; 
  5.          work_func_t func; 
  6.  #ifdef CONFIG_LOCKDEP 
  7.          struct lockdep_map lockdep_map; 
  8.  #endif 
  9.  }; 
  10.  struct delayed_work {              114         struct work_struct work
  11.          struct timer_list timer; 
  12.  
  13.   /* target workqueue and CPU ->timer uses to queue ->work */ 
  14.          struct workqueue_struct *wq; 
  15.          int cpu; 
  16.  };  

--103-->需要延遲執行的函數, typedef void (work_func_t)(struct work_struct work);

至此,我們可以使用一個delayed_work對象以及相應的調度API實現對指定任務的延時執行

  1. //注冊一個延遲執行 
  2.  
  3. 591 static inline bool schedule_delayed_work(struct delayed_work *dwork,unsigned long delay)//注銷一個延遲執行 
  4. 2975 bool cancel_delayed_work(struct delayed_work *dwork)     

和內核定時器一樣,延遲執行只會在超時的時候執行一次,如果要實現循環延遲,只需要在注冊的函數中再次注冊一個延遲執行函數。

  1. schedule_delayed_work(&work,msecs_to_jiffies(poll_interval)); 
責任編輯:龐桂玉 來源: 嵌入式Linux中文站
相關推薦

2009-11-11 10:14:10

linux定時器操作系統

2010-01-18 10:05:20

FreeBSD內核

2023-08-02 09:26:03

軟件定時器鴻蒙

2023-01-10 13:53:21

Linux定時器

2021-08-03 14:33:53

cron定時器Linux命令

2021-08-11 10:10:26

Linux定時器數組

2018-11-02 08:10:58

Linuxsystemd定時器

2016-12-15 14:55:31

Linux定時延時

2023-12-11 09:50:35

Linux定時器

2021-04-09 16:39:41

鴻蒙HarmonyOS應用

2010-07-28 15:56:22

FlexTimer定時

2021-05-27 09:43:56

鴻蒙HarmonyOS應用

2021-06-09 09:48:01

鴻蒙HarmonyOS應用

2011-04-21 10:49:28

Linux時間定時器

2024-06-03 00:00:20

.NET定時器

2022-11-02 11:40:16

Flowable定時器流程

2009-04-12 08:51:50

Symbian諾基亞移動OS

2011-02-23 10:20:45

2021-03-31 08:33:17

SysTick定時器SysTick定時器

2013-07-29 10:10:40

TCP協議TCP定時器TCP
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99视频免费 | 天天搞天天操 | 秋霞在线一区 | 国产欧美日韩在线观看 | h视频在线观看免费 | 日韩三级电影一区二区 | 91 在线| 国产高清区 | 一级欧美一级日韩片免费观看 | 欧美精品一区二区三区在线播放 | www.jizzjizz| www.五月婷婷.com | 中文字幕精品视频在线观看 | 欧美三区 | 福利视频三区 | 国产视频中文字幕 | 日韩精品视频在线观看一区二区三区 | 中文字幕亚洲欧美 | 国产精品成人一区 | 午夜影院在线免费观看视频 | 久久久久国产精品免费免费搜索 | 久久精品一区 | 亚洲成人一区二区三区 | 亚洲一区亚洲二区 | 中国大陆高清aⅴ毛片 | 国产91久久久久久久免费 | 亚洲乱码一区二区 | 午夜私人影院在线观看 | 亚洲天堂男人的天堂 | 九九天堂网 | 日韩精品在线观看视频 | 九九热精品免费 | 毛片免费看 | 欧美日韩高清在线一区 | 久久91 | 羞羞视频网站 | 在线日韩 | 羞羞视频在线观看网站 | 99热视| 日本高清中文字幕 | 精品美女视频在免费观看 |