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

Linux設備驅動之定時與延時

系統 Linux
Linux通過系統硬件定時器以規律的間隔(由HZ度量)產生定時器中斷,每次中斷使得一個內核計數器的值jiffies累加,因此這個jiffies就記錄了系統啟動開始的時間流逝,然后內核據此實現軟件定時器和延時。

[[179010]]

Linux通過系統硬件定時器以規律的間隔(由HZ度量)產生定時器中斷,每次中斷使得一個內核計數器的值jiffies累加,因此這個jiffies就記錄了系統啟動開始的時間流逝,然后內核據此實現軟件定時器和延時。

Demo for jiffies and HZ

  1. #include <linux/jiffies.h> 
  2.  
  3. unsigned long j, stamp_1, stamp_half, stamp_n; 
  4.  
  5. j = jiffies; /* read the current value */ 
  6. stamp_1 = j + HZ; /* 1 second in the future */ 
  7. stamp_half = j + HZ/2; /* half a second */ 
  8. stamp_n = j + n * HZ / 1000; /* n milliseconds */ 

內核定時器

硬件時鐘中斷處理程序會喚起 TIMER_SOFTIRQ 軟中斷,運行當前處理器上到期的所有內核定時器。

定時器定義/初始化

在Linux內核中,timer_list結構體的一個實例對應一個定時器:

/* 當expires指定的定時器到期時間期滿后,將執行function(data) */

  1. /* 當expires指定的定時器到期時間期滿后,將執行function(data) */ 
  2.    struct timer_list { 
  3.        unsigned long expires;           /*定時器到期時間*/ 
  4.        void (*function)(unsigned long); /* 定時器處理函數 */ 
  5.        unsigned long data;              /* function的參數 */ 
  6.        ... 
  7.    }; 
  8.  
  9.    /* 定義 */ 
  10.    struct timer_list my_timer; 
  11.  
  12.    /* 初始化函數 */ 
  13.    void init_timer(struct timer_list * timer); 
  14.    /* 初始化宏 */ 
  15.    TIMER_INITIALIZER(_function, _expires, _data) 
  16.  
  17.    /* 定義并初始化宏 */ 
  18.    DEFINE_TIMER(_name, _function, _expires, _data) 

定時器添加/移除

  1. /* 注冊內核定時器,將定時器加入到內核動態定時器鏈表中 */ 
  2.    void add_timer(struct timer_list * timer); 
  3.  
  4.    /* del_timer_sync()是 del_timer()的同步版,在刪除一個定時器時需等待其被處理完, 
  5.       因此該函數的調用不能發生在中斷上下文 */ 
  6.    void del_timer(struct timer_list * timer); 
  7.    void del_timer_sync(struct timer_list * timer); 

定時時間修改

  1. int mod_timer(struct timer_list *timer, unsigned long expires); 

延時

短延時

  1. void ndelay(unsigned long nsecs);  
  2. void udelay(unsigned long usecs);  
  3. void mdelay(unsigned long msecs); 

內核在啟動時,會運行一個延遲測試程序(delay loop calibration),計算出lpj(loops per jiffy),根據lpj就實現了這幾個函數,屬忙等待。

長延時

  • 一個很直觀的方法是比較當前的 jiffies 和目標 jiffies:
  1. int time_after(unsigned long a, unsigned long b); /* a after b, true */  
  2. int time_before(unsigned long a, unsigned long b); /* a before b */  
  3. int time_after_eq(unsigned long a, unsigned long b); /* a after or equal b */  
  4. int time_before_eq(unsigned long a, unsigned long b);/* a before or equal b */ 
  • 睡著延時
  1. void msleep(unsigned int millisecs);  
  2. unsigned long msleep_interruptible(unsigned int millisecs);  
  3. void ssleep(unsigned int seconds); 

Tip: msleep()、 ssleep()不能被打斷。

責任編輯:武曉燕 來源: 博客園
相關推薦

2009-12-07 09:39:04

Linux設備驅動硬件通信

2010-07-19 10:05:52

ibmdwLinux

2017-02-10 15:32:47

2020-12-03 08:59:06

Linux設備驅動

2017-11-16 14:46:58

Linuxplatform總線驅動設備

2022-05-10 08:49:46

設備驅動Linux

2017-02-28 17:18:34

Linux驅動技術內核定時器

2009-12-23 13:17:36

Linux設備驅動

2011-01-10 18:21:38

linux編寫程序

2017-11-06 17:16:55

Linux設備驅動并發控制

2023-05-15 08:58:41

塊設備驅動Linux

2021-11-29 07:55:45

Linux GPIO Linux 系統

2020-04-20 21:22:50

網絡設備網絡協議計算機網絡

2023-05-12 07:27:24

Linux內核網絡設備驅動

2021-04-12 12:00:13

Linux運維Linux系統

2010-04-19 10:28:43

Unix操作系統

2016-11-11 13:07:18

LinuxWindows設備驅動模型

2009-10-22 12:27:30

linux塊設備

2017-03-01 16:40:12

Linux驅動技術設備阻塞

2017-11-07 20:12:05

Linux音頻設備ALSA
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩精品一区二区三区蜜桃 | 国产成人精品一区二区三区网站观看 | 精品日韩一区 | 羞羞的视频在线看 | 国产一级毛片精品完整视频版 | 日本欧美大片 | 久草中文网 | 国产一区二区精华 | 国产一区二区三区视频 | 久久亚洲国产 | 亚洲福利在线观看 | 999视频在线播放 | 免费观看一级特黄欧美大片 | 日韩欧美一区二区三区免费观看 | 成人精品鲁一区一区二区 | 欧美精品欧美精品系列 | 99re在线观看 | 亚洲欧美在线一区 | 亚洲免费三区 | 国产中文字幕网 | 黄色国产 | 99国产精品99久久久久久 | 欧美在线一区二区三区 | 日本精品视频在线观看 | 国产精品久久久久久婷婷天堂 | 日韩欧美国产综合 | 日本免费在线 | 围产精品久久久久久久 | 91麻豆产精品久久久久久 | 羞羞的视频免费看 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 99国内精品久久久久久久 | 91在线电影 | 国产一区二区三区在线 | 午夜精品福利视频 | 日韩在线电影 | 精品视频在线一区 | 日韩精品一区二区三区中文字幕 | 欧美中文在线 | 亚洲精品福利在线 | 毛片免费观看视频 |