linux下有兩類時鐘:
標準計時器,時鐘滴答計時(jiffies)的幾個基本引數:計時器timer晶體振盪器在1秒內產生的時鐘脈衝個數就是時鐘週期的頻率, 要注意把這個timer的時鐘週期頻率與時鐘中斷的頻率區別開來, linux用巨集clock_tick_rate來表示計時器的輸入時鐘脈衝的頻率(比如我的為#define clock_tick_rate 1193180),該巨集定義在arm/mach-***/include/mach/timex.h標頭檔案中。
我們知道當計數器減到0值時,它就在irq0上產生一次時鐘中斷,也即一次時鐘中斷, 計數器的初始值決定了要過多少時鐘週期才產生一次時鐘中斷,因此也就決定了一次時鐘滴答的時間間隔長度.
即1秒時間內timer所產生的時鐘中斷次數。確定了時鐘中斷的頻率值後也就可以確定timer的計數器初值。linux核心用巨集hz來表示時鐘中斷的頻率,而且在不同的平台上hz有不同的定義值。對於sparc、mips、arm和i386等平台hz的值都是100。該巨集在arm平台上的定義如下(/arch/arm/include/asm/param.h)
計數器的初始值由巨集latch定義在檔案:include/linux/jiffies.hjiffies通俗理解:#define latch ((clock_tick_rate + hz/2) / hz) /* for divider */
什麼是系統節拍? system tick系統節拍是核心/系統能有效運用的最小時間單位。如果乙個cpu主頻264m, 那麼系統硬體能區分的最小時間片斷就是1/(264m),這個最小的時間段叫timebase; 這個時間太小,基本上只能讓timebase計數器+1, 其他任何事情都幹不了。
核心/系統有一些事情是要定期去做:定期重新整理看門狗
給periodic task傳送喚醒事件
檢查soft alram 等
設計系統/核心必須決定這些rountine事情的頻率;做得太勤,太多cpu的運算能力花在這些事情上,影響系統的performance. 做得太慢,就會影響系統對事件反應能力,影響實時功能。這個頻率就是系統節拍,system tick. 系統選定乙個timer作為 system timer。在264mhzcpu的實時系統裡,我選1ms作為system tcik頻率。system timer每1ms中斷一次,在system timer的中斷處理程式裡,我處理前面列出的那些rountine事情,並把jiffies++; 這就是說,我的jiffies是每1ms增加一次。標準計時器api:
void
init_timer
(struct timer_list *timer )
;void
setup_timer
(struct timer_list *timer,
void
(*function)
(unsigned
long),
unsigned
long data )
;int
mod_timer
(struct timer_list *timer,
unsigned
long expires )
;void
del_timer
(struct timer_list *timer )
;int
timer_pending
(const
struct timer_list *timer )
;
更好用的可以看看 posix timer
參考:arm linux系統的時鐘機制
jiffies初始值問題
關於linux中定時器timer的巨集定義latch的解釋
ARM Linux時鐘初始化
arm linux時鐘初始化是從machine start中的map io函式開始的,map io函式中會呼叫s3c24xx init clocks 12000000 來進行,我們來看一下初始化過程 static struct cpu table cpu void init s3c24xx init...
實時(RTC)時鐘,系統時鐘和CPU時鐘
最近在學stm32的時候看到rtc時鐘和系統時鐘,不知道區別在 於是上網查了一下。實時時鐘 rtc時鐘,用於提供年 月 日 時 分 秒和星期等的實時時間資訊,由後備電池供電,當你晚上關閉系統和早上開啟系統時,rtc仍然會保持正確的時間和日期。系統時鐘 是乙個儲存於系統記憶體中的邏輯時鐘。用於系統的計...
微控制器的時鐘,系統時鐘
我們先來理解幾個比較重要的概念 時間週期 指令週期 機器週期,以及系統時鐘的工作原理。時鐘週期 時鐘週期也叫振盪週期或晶振週期,即晶振的單位時間發出的脈衝數,一般有外部的振晶產生,比如12mhz 12 10的6次方,即每秒發出12000000個脈衝訊號,那麼發出乙個脈衝的時間就是時鐘週期,也就是1 ...