自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

[[179010]]

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

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)核定時(shí)器

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

定時(shí)器定義/初始化

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

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

  1. /* 當(dāng)expires指定的定時(shí)器到期時(shí)間期滿后,將執(zhí)行function(data) */ 
  2.    struct timer_list { 
  3.        unsigned long expires;           /*定時(shí)器到期時(shí)間*/ 
  4.        void (*function)(unsigned long); /* 定時(shí)器處理函數(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) 

定時(shí)器添加/移除

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

定時(shí)時(shí)間修改

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

延時(shí)

短延時(shí)

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

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

長延時(shí)

  • 一個很直觀的方法是比較當(dāng)前的 jiffies 和目標(biāo) 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 */ 
  • 睡著延時(shí)
  1. void msleep(unsigned int millisecs);  
  2. unsigned long msleep_interruptible(unsigned int millisecs);  
  3. void ssleep(unsigned int seconds); 

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

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

2009-12-07 09:39:04

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

2010-07-19 10:05:52

ibmdwLinux

2017-02-10 15:32:47

2017-11-16 14:46:58

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

2020-12-03 08:59:06

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

2022-05-10 08:49:46

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

2017-02-28 17:18:34

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

2009-12-23 13:17:36

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

2011-01-10 18:21:38

linux編寫程序

2017-11-06 17:16:55

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

2023-05-15 08:58:41

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

2021-11-29 07:55:45

Linux GPIO Linux 系統(tǒng)

2020-04-20 21:22:50

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

2023-05-12 07:27:24

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

2021-04-12 12:00:13

Linux運(yùn)維Linux系統(tǒng)

2010-04-19 10:28:43

Unix操作系統(tǒng)

2016-11-11 13:07:18

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

2009-10-22 12:27:30

linux塊設(shè)備

2017-03-01 16:40:12

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

2017-11-07 20:12:05

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

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