偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Linux設(shè)備驅(qū)動之定時與延時

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

[[179010]]

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

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 */ 

內(nèi)核定時器

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

定時器定義/初始化

在Linux內(nèi)核中,timer_list結(jié)構(gòu)體的一個實例對應(yīng)一個定時器:

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

  1. /* 當expires指定的定時器到期時間期滿后,將執(zhí)行function(data) */ 
  2.    struct timer_list { 
  3.        unsigned long expires;           /*定時器到期時間*/ 
  4.        void (*function)(unsigned long); /* 定時器處理函數(shù) */ 
  5.        unsigned long data;              /* function的參數(shù) */ 
  6.        ... 
  7.    }; 
  8.  
  9.    /* 定義 */ 
  10.    struct timer_list my_timer; 
  11.  
  12.    /* 初始化函數(shù) */ 
  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. /* 注冊內(nèi)核定時器,將定時器加入到內(nèi)核動態(tài)定時器鏈表中 */ 
  2.    void add_timer(struct timer_list * timer); 
  3.  
  4.    /* del_timer_sync()是 del_timer()的同步版,在刪除一個定時器時需等待其被處理完, 
  5.       因此該函數(shù)的調(diào)用不能發(fā)生在中斷上下文 */ 
  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); 

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

長延時

  • 一個很直觀的方法是比較當前的 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()不能被打斷。

責任編輯:武曉燕 來源: 博客園
相關(guān)推薦

2009-12-07 09:39:04

Linux設(shè)備驅(qū)動硬件通信

2010-07-19 10:05:52

ibmdwLinux

2017-02-10 15:32:47

2020-12-03 08:59:06

Linux設(shè)備驅(qū)動

2017-11-16 14:46:58

Linuxplatform總線驅(qū)動設(shè)備

2022-05-10 08:49:46

設(shè)備驅(qū)動Linux

2017-02-28 17:18:34

Linux驅(qū)動技術(shù)內(nèi)核定時器

2017-11-06 17:16:55

Linux設(shè)備驅(qū)動并發(fā)控制

2023-05-15 08:58:41

塊設(shè)備驅(qū)動Linux

2009-12-23 13:17:36

Linux設(shè)備驅(qū)動

2011-01-10 18:21:38

linux編寫程序

2020-04-20 21:22:50

網(wǎng)絡(luò)設(shè)備網(wǎng)絡(luò)協(xié)議計算機網(wǎng)絡(luò)

2021-11-29 07:55:45

Linux GPIO Linux 系統(tǒng)

2021-04-12 12:00:13

Linux運維Linux系統(tǒng)

2023-05-12 07:27:24

Linux內(nèi)核網(wǎng)絡(luò)設(shè)備驅(qū)動

2010-04-19 10:28:43

Unix操作系統(tǒng)

2009-10-22 12:27:30

linux塊設(shè)備

2016-11-11 13:07:18

LinuxWindows設(shè)備驅(qū)動模型

2017-03-01 16:40:12

Linux驅(qū)動技術(shù)設(shè)備阻塞

2017-11-07 20:12:05

Linux音頻設(shè)備ALSA
點贊
收藏

51CTO技術(shù)棧公眾號