嵌入式Linux熱門培訓內容之Linux內核定時器

時間:2018-12-13 17:39:24

Linux內核定時器是非常關鍵的一個部分,大家從學單片機開始,到后面的多任務系統,到RTOS,到Linux,發現延時這個東西是必不可少的,所以這個章節是非常關鍵的。

1、mdelay和msleep

我們在編寫Linux內核驅動的時候,肯定避免不了用延遲函數,為了等待硬件到達一定的狀態,下面來討論一下Linux內核里面的幾個延遲函數

ndelay(unsigned long nsecs)

udelay(unsigned long usecs)

mdelay(unsigned long msecs)

msleep()

msleep()是讓當前進程休眠,讓出CPU給其它進程使用,等到時間到了之后再喚醒。由此看來,msleep()不能用于中斷上下文中。

mdelay()是一個讓CPU空轉,一直等待到給定的時間后才退出。

所以內核里面有這樣一段話,大家自行體會一下:

mdelay is macro wrapper around udelay, to account for possible overflow when passing large arguments to udelay.In general, use of mdelay is discouraged and code should be refactored to allow for the use of msleep

!!!內核建議使用msleep,而不是mdelay

2、定時器基礎

2.1、struct timer_list

一個struct timer_list對應了一個定時器。

#include <linux/timer.h>

以下列出常用的接口:

struct timer_list

  {

   /*....*/

   unsigned long expires;//定時器服務函數開始執行時間

   void (*function)(unsigned long);//定義一個指向定時器服務函數的指針function,服務函數有一個 unsigned long的參數,并且返回void

   unsigned long data;//定時時間到時,data參數會傳入服務函數

  }

 2.2、jiffies

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

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

         Jiffies/HZ:我想知道從系統開機到現在系統運行了多少秒,可以這樣計算

         jiffies類型為無符號長整型(unsigned long)

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

2.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

? 江苏快3号码表