本文介紹Linux2.6.29中,配置高精度模式的hrtimer與未配置高精度模式時行為的區別。本文暫不考慮高精度模式對Linux系統時鐘中斷的影響。
在沒有配置高精度模式時,hrtimer的超時在系統時鐘中斷的輪循中檢查,所以此時hrtimer的定時精度(jiffy)還是以輪循的間隔為單位,精度與傳統的時間輪定時器一樣。
在配置高精度模式後,hrtimer的超時由struct clock_event_device的超時中斷完成。clock_event_device一般來說描述的都是一個硬件定時器,其定時精度由硬件定時器決定,比如我的板子上的此定時器參數為:Timer at Vir:0xE0100200 = Phy:0xE0100200, using Irq:27, at Freq:250000000,可見其精度之高:250MHz,這也是高精度時鐘這個名稱的由來。
下面簡要介紹一下在配置了高精度模式之後hrtimer的實現細節。
在配置高精度模式後,添加hrtimer也是由函數hrtimer_start完成,這與沒有配置高精度模式時一樣。但是,高精度模式時,如果添加的hrtimer在紅黑樹的最左邊一個節點,即要添加的hrtimer是將會第一個到期的hrtimer時,那麼這時會調用子函數hrtimer_enqueue_reprogram重新設置clock_event_device的超時中斷。
hrtimer_enqueue_reprogram
hrtimer_reprogram
tick_program_event
tick_dev_program_event
clockevents_program_event
struct clock_event_device * pDev->set_next_event
比如我的平台的clock_event_device的定義如下:
其中timer_set_next_event主要是設置硬件設備的相關registers.