如何提高linux的时钟精度,Linux时钟精度提高有什么办法?
2 動態高精度時鐘設計和實現
動態高精度時鐘設計方案借鑒了KURT-Linux思想,但與其不同的是提供一個與標準Linux核心時鐘并行的具有精密刻度的實時時鐘,并與原核心時鐘區別開。采用X86體系CPU提供的TSC作為高精度的時間標度,權衡一定時間段(如一個jiffies)內高精度定時器的數量,設置Linux時鐘中斷模式為標準模式、one-shot模式或高頻周期時鐘模式。實現了μs級定時精度的同時,降低了頻繁計算和設置時鐘芯片的時間代價。
下面給出關鍵的全局變量:
(1)time_mode:表示當前時鐘工作模式。其中-1代表高頻周期時鐘模式,該模式下,根據需要達到的定時精度,設置時鐘芯片以較高的頻率產生周期性中斷;0代表標準模式,時鐘芯片以標準Linux默認的頻率產生周期中斷;1代表one-shot模式,時鐘芯片被設置為單次觸發狀態,即每次給時鐘芯片設置一個超時時間,超時事件發生時,在時鐘中斷處理程序中根據需要再次給時鐘芯片設置一個超時時間。系統啟動時設置為默認值0。
(2)SCALE:時鐘精度提高比。設置高頻周期模式需要的參數,用來表示所需要達到的時鐘精度相對普通Linux時鐘精度的提高倍數。
(3)Threshold:閾值。如果即將在某一時間段內超時的實時定時器數量大于預設值,系統設置硬件定時器工作在高頻周期時鐘模式。
2.1 時鐘中斷處理
為了加強Linux的實時功能,同時又要保持Linux的完整性,本方案的動態多模式時鐘機制以模塊化的方式實現有關實時部分的功能,并利用接口函數實現實時模塊與Linux核心的聯系。
(1)標準模式。標準模式下的中斷處理首先查詢實時定時器隊列中是否有實時定時器在下一個系統時鐘中斷(jiffies+1)之前超時,即在(jiffies,jiffies+1)內是否有實時定時器要處理,根據實時定時器數量設置時鐘芯片的工作模式,執行do_timer_interrupt()等函數維護系統相關時間,標記下半部。
(2)one_shot模式。one-shot模式下的中斷處理先判斷jiffies時鐘是否到期,如果到期:
①查詢實時定時器隊列中是否有實時定時器在下一個系統時鐘中斷(tick+1)之前超時,即在(jiffies,jiffies+1)內有實時定時器要處理(其超時時間用sub_jiffies表示),然后根據實時定時器數量設置時鐘芯片工作模式。
②執行do_timer_interrupt()函數等維護與系統有關的時間,并標記下半部。
如果jiffies時鐘未到期,則查詢實時定時器鏈表,根據其最早超時實時定時器的超時時間與當前時間的差值設置時鐘芯片產生下一次中斷的時間。
(3)高頻周期時鐘模式。高頻周期模式下中斷處理先判斷jiffies時鐘是否到期,如果系統時鐘節拍到期,執行上述①、②模式。否則,如果有實時定時器超時,標記中斷下半部;如果沒有實時定時器超時則直接返回。
對超時定時器的處理都留到時鐘中斷下半部(softirq)處理,超時的實時定時器優先得到處理,以盡可能保證實時定時器的及時處理,隨后處理普通Linux的定時器,時鐘中斷處理過程如圖1所示。
2.2 定時器組織
普通Linux系統原有的粗粒度定時器對于內核的穩定和不要求高精度定時的非實時應用仍是合適的,只是針對有高精度定時要求的實時應用組織一個高精度定時器隊列HRT_list,隊列中的定時器按超時時間非降序排列,隊列中第一個定時器的超時時間就是隊列的最早超時時間。
原Linux內核中的定時器是通過稱為CTW(Cascading Timer Wheel)的結構管理和維護,并因此使得對定時器的插入、刪除等操作的時間為0(1)。本文把HRT_list隊列和CTW結合起來以降低定時器處理時間、提高效率。把需要較長時間才超時的實時定時器仍舊插入到原定時器隊列中,借助該隊列維護。在每次系統時鐘中斷處理的下半部處理完超時的實時定時器后,把在下一次系統時鐘中斷前超時的高精度定時器從原隊列移除,并插入到HRT_list隊列中。因此,HRT_list隊列中所需要維護的高精度實時定時器也是有限的,避免了維護一個大規模定時器隊列的開銷,近似實現了0(1)的系統開銷。
3 性能分析與測試
3.1 性能分析
當系統中沒有高精度定時器時,PIT仍以Linux系統默認的頻率觸發時鐘中斷,在每一次系統時鐘中斷處理過程中,只需要判斷工作模式以及下一次jiffies中斷前有否實時定時器超時,經測試由此而帶來的處理時間不超過1us,增加系統負擔<0.1%,不會影響系統的性能。當在某個時間段內系統中實時定時器不多于閾值時,系統時鐘工作在類似KURT-Linux的one-shot模式,同時維持普通Linux系統時鐘的穩定。而由此而帶來的系統負擔是可以接受的[3]。
當系統中存在大量實時定時器或在某個時間段內即將超時的實時定時器數量超過一定值(閾值)時,相對于one-shot模式需要頻繁地計算下次中斷時間,并重新編程在低速的ISA總線上的PIT的時間代價是可取的,證明如下:
用Thw表示中斷的硬件處理時間,Tisr表示中斷程序上半部執行時間,n代表某個時段內(一個jiffies內)超時的定時器數量。得到兩種模式下總的時鐘中斷處理時間關系式:
顯然,當某個時段內超時的定時器數量大于Threshold時,采用高頻周期模式的時間開銷就會小于one-shot模式。
3.2 模擬測試
測試環境為Pentium4 3.0 GHz CPU,1GDDR內存的硬件平臺和2.6.15.6版本內核的Fedora core linux操作系統平臺。
根據數控實時任務的要求設定了周期為0.1 ms、1 ms和100 ms的進程模擬數控實時周期任務[10],統計運行1 000次的數據,比較改進后的高精度定時器和原linux定時器的平均定時偏差,并令閾值為30,設置周期任務數量為4、20、40,使時鐘工作在不同模式下。測試結果如表1所示。
由測試數據對比,原linux系統的定時平均偏差為968 μs,改進后系統的定時平均偏差為34 ?滋s。顯而易見,改進后的定時器定時精度大大提高,達到10 μs級,能滿足數控系統應用的要求。
在原Linux內核和改進后的高精度定時器內核上睡眠50 μs各1 000次,測試實際睡眠時間所得結果與表1類似,50 μs的實際睡眠時間從(2.001~2.116) ms級降到(57~91) μs級。
全軟件數控系統以應用軟件的形式實現運動控制,是開放式數控系統的發展方向。開源的Linux是開發具有自主知識產權數控系統的理想平臺,但是其粗糙的時鐘粒度是普通Linux直接應用于數控系統的最大障礙,因此需要細化Linux的時鐘粒度提高其實時性。
簡單地提高系統時鐘頻率將引起頻繁的中斷處理,導致系統性能的下降。KURT-Linux采用的one-shot方式將周期性的時鐘中斷改進為單次觸發狀態,實現了μs級的定時精度。本文分析了普通Linux時鐘機制和幾種實時Linux操作系統細化時鐘精度的方式,提出了一種混合多種時鐘模式的動態時鐘機制,達到了CNC要求的時鐘精度。最后的性能分析和模擬測試證實了新時鐘機制的技術性能。
參考文獻
[1] 李迪,萬加富,葉峰,等.軟數控系統混合任務兩級調度策略[J].機械工程學報,2008,44(12):157-162.
[2] 王霞,馬忠梅,何小慶,等.提高嵌入式linux時鐘精度的方法[J].計算機工程,2006,32(23):70-96.
[3] 施映,何嘉.KURT-Linux實時性研究及改進策略[J].計算機科學,2006,33(7):417-420.
[4] 丁一,胡封林,李國寬.高級可編程中斷控制系統的研究[J].計算機工程與科學,2005,27(12):97-100.
[5] 范劍英,吳巖,賈佳,等.Linux2.6實時性分析與改進方案[J].哈爾濱理工大學學報,2008,13(1):24-28.
[6] 於時才,繆東升,孫華,等.Linux2.6調度系統的分析與改進[J].微計算機信息,2007,24(5-3):252-254.
[7]周鵬,周明天.linux內核中一種高精度定時器的設計與實現[J].計算機技術與發展,2006,16(4):73-78.
[8] SRINIVASAN B, PATHER S, HILL R, et al. A firm real-time system implementation using commercial off-the-shelf hardware and free software[R]. rtas. Fourth IEEE Real-Time Technology and Applications Symposium (RTAS’98), 1998.
[9] 李小群,趙慧斌,葉以民,等.一種基于時鐘粒度細化的Linux實時化方案[J].計算機研究與發展,2003,40(5):734-740.
[10] 姚鑫驊,潘雪增,傅建中,等.數控系統的混合任務模型及其最優調度算法研究[J].浙江大學學報,2006,40(8):1315-1319.
總結
以上是生活随笔為你收集整理的如何提高linux的时钟精度,Linux时钟精度提高有什么办法?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 验证码 添加背景图_java登
- 下一篇: word和html互换,word与htm