05 Linux硬體定時 jiffies

2021-09-29 10:19:06 字數 3481 閱讀 2617

本系列文章主要講linux中的中斷和時間管理,文章機構如下:

01 - 驅動中的中斷處理

02 - 中斷下半部 tasklet

03 - 中斷的下半部 workqueue

04 - linux中的延時操作函式

05 - linux硬體定時 jiffies

06 - linux 低解析度定時器

07 - linux高解析度定時器

本文內容參考正點原子《嵌入式 linux驅動開發指南》一書,《嵌入式 linux驅動開發指南》

在linux中硬體定時器提供時鐘源,時鐘源的可以在核心原始碼目錄下,執行 make menuconfig 進行配置,配置介面如下圖所示:

從上圖可以看出,硬體時鐘源一共可以選擇100hz、250hz、300hz和1000hz四種,配置完核心之後,可以在核心原始碼目錄下的 .config 檔案中看到已經將配置的時鐘頻率寫入到配置檔案中,如下圖所示:

除此之外,還可以在 include\asm-generic\param.h 檔案中找到設定的時鐘頻率,如下所示:

採用不同的時鐘頻率可以獲得不同的定時精度,高節拍率和低節拍率的優缺點如下:

①、高節拍率會提高系統時間精度,如果採用 100hz 的節拍率,時間精度就是 10ms,採用1000hz 的話時間精度就是 1ms,精度提高了 10 倍。高精度時鐘的好處有很多,對於那些對時間要求嚴格的函式來說,能夠以更高的精度執行,時間測量也更加準確。

②、高節拍率會帶導致中斷的產生更加頻繁,頻繁的中斷會加劇系統的負擔,1000hz 的100hz 的系統節拍率相比,系統要花費 10 倍的「精力」去處理中斷。中斷服務函式占用處理器的時間增加,但是現在的處理器效能都很強大,所以採用 1000hz 的系統節拍率並不會增加太大的負載壓力。根據自己的實際情況,選擇合適的系統節拍率,本教程我們全部採用預設的100hz 系統節拍率。

linux 核心使用全域性變數 jiffies 來記錄系統從啟動以來的系統節拍數,系統啟動的時候會將 jiffies 初始化為 0,jiffies 定義在文include/linux/jiffies.h 中,定義如下:

extern u64 __jiffy_data jiffies_64;

// 64位的jiffies_64

extern

unsigned

long

volatile __jiffy_data jiffies;

// 32位的jiffies

當我們訪問 jiffies 的時候其實訪問的是 jiffies_64 的低 32 位,使用 get_jiffies_64 這個函式可以獲取 jiffies_64 的值。在 32 位的系統上讀取 jiffies 的值,在 64 位的系統上 jiffes 和 jiffies_64表示同乙個變數,因此也可以直接讀取 jiffies 的值。所以不管是 32 位的系統還是 64 位系統,都可以使用jiffies。前面說了 hz 表示每秒的節拍數,jiffies 表示系統執行的 jiffies 節拍數,所以 jiffies/hz 就是系統執行時間,單位為秒。不管是 32 位還是 64 位的 jiffies,都有溢位的風險,溢位以後會重新從 0 開始計數,相當於繞回來了,因此有些資料也將這個現象也叫做繞回。假如 hz 為最大值 1000 的時候,32 位的 jiffies 只需要 4294967295(0xffffffff)/1000/3600/24 = 49.7 天就發生了繞回,對於 64 為的 jiffies 來說大概需要5.8 億年才能繞回,因此 jiffies_64 的繞回忽略不計。處理 32 位 jiffies 的繞回顯得尤為重要,

linux 核心提供了下面幾個 api 函式來對jiffies進行處理(include\linux\jiffies.h)

u64 get_jiffies_64

(void

)// 獲取jiffies_64的值

time_after

(a, b)

// atime_before

(a,b)

// a>b

time_after_eq

(a,b)

// a<=b

time_before_eq

(a,b)

// a>=b

time_in_range

(a,b,c)

// b<=a<=c

time_in_range_open

(a,b,c)

// b<=atime_after64

(a,b)

// atime_before64

(a,b)

// a>b

time_after_eq64

(a,b)

// a<=b

time_before_eq64

(a,b)

// a>=b

time_in_range64

(a, b, c)

// b<=a<=c

extern

unsigned

intjiffies_to_msecs

(const

unsigned

long j)

// 將jiffies轉換為對應的ms值

extern

unsigned

intjiffies_to_usecs

(const

unsigned

long j)

// 將jiffies轉換為對應的us值

static

inline u64 jiffies_to_nsecs

(const

unsigned

long j)

// 將jiffies轉換為對應的ns值

extern

unsigned

long

__msecs_to_jiffies

(const

unsigned

int m)

// 將ms轉換為對應的jiffies值

extern

unsigned

long

__usecs_to_jiffies

(const

unsigned

int u)

// 將us轉換為對應的jiffies值

extern

unsigned

long

nsecs_to_jiffies

(u64 n)

;// 將ns轉換為對應的jiffies值

這節簡單的對 jiffies 進行介紹,下面將在低解析度定時器和高解析度定時器中對 jiffies 進行實際的應用。

05 linux 檔案相關操作命令

常用的linux操作指令之一,也是必備的。下面就簡單介紹下 touch 命令 建立檔案 touch option filename1 filename2 檔案不存在則建立,檔案存在則更改訪問時間。rm r cc 刪除目錄 r遞迴刪除子目錄 rm rf 刪除當前目錄內全部內容 強制刪除,慎用 cp c...

Linux介紹 命令05 Linux基本命令 一

ls是英文單詞list的簡寫,其功能為列出目錄的內容,是使用者最常用的命令之一,它類似於dos下的dir命令。linux檔案或者目錄名稱最長可以有265個字元,代表當前目錄,代表上一級目錄,以 開頭的檔案為隱藏檔案,需要用 a 引數才能顯示。ls常用引數 引數含義 a顯示指定目錄下所有子目錄與檔案,...

第四階段 05 Linux掛載 開機自啟 遠端連線

mount 掛載 在linux作業系統中,掛載是乙個非常重要的功能,使用非常頻繁。它指將乙個裝置 通常是儲存裝置 掛接到乙個已存在的目錄上。這個目錄可以不為空,但掛載後這個目錄下以前的內容將不可用。mount a 重新掛載 chkconfig on 設定開機自動啟動 改變啟動vi etc initt...