<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 采用混合時(shí)鐘模式提高Linux時(shí)鐘精度的方法

采用混合時(shí)鐘模式提高Linux時(shí)鐘精度的方法

作者: 時(shí)間:2011-06-10 來(lái)源:網(wǎng)絡(luò ) 收藏

數控技術(shù)(CNC)已經(jīng)成為現代制造業(yè)的核心技術(shù)之一,開(kāi)放式數控系統相對于傳統數控系統在功能、靈活性、成本等方面的優(yōu)勢,使得開(kāi)放式數控成為數控系統未來(lái)發(fā)展的主要趨勢。目前,開(kāi)放式數控系統主要有三種結構,即專(zhuān)用CNC+PC、通用PC+運動(dòng)控制器和軟數控系統。其中軟數控系統采用多任務(wù)實(shí)時(shí)操作系統,將運動(dòng)控制部分與管理部分集成到一個(gè)硬件平臺上,滿(mǎn)足數控系統在功能方面和非功能方面(主要表現在實(shí)時(shí)性)的要求[1]。開(kāi)放式數控系統的理想軟件平臺是實(shí)時(shí)多任務(wù)操作系統,目前,商業(yè)實(shí)時(shí)多任務(wù)操作系統有很多,比較著(zhù)名的有VxWORKS、iRMX、QNX等,但這些操作系統產(chǎn)品大多成本高、開(kāi)放性差。Linux是一種發(fā)展十分迅速的類(lèi)UNIX系統,已被廣泛地運用到服務(wù)器、桌面系統以及嵌入式應用領(lǐng)域。Linux由于其開(kāi)放源代碼的特點(diǎn),可以在此基礎上開(kāi)發(fā)具有自主知識產(chǎn)權的數控系統。但是Linux最初的設計目標是一個(gè)分時(shí)操作系統,追求系統效率和公平性,在對實(shí)時(shí)性要求高的領(lǐng)域應用受到限制。雖然2.6內核的Linux提高到了1 ms,但仍遠不能滿(mǎn)足數控系統對定時(shí)精度的要求。

近年來(lái)的研究以細化來(lái)提高Linux的能力提出了一些方案和設想,主要有KURT-Linux系統、RT-Linux系統。本文對KURT_Linux、RT-Linux提高時(shí)鐘精度的方法進(jìn)行分析,考慮在強周期性應用或者在某個(gè)時(shí)段內有大量高精度定時(shí)器將超時(shí)的情況下,采用一種動(dòng)態(tài)的多模式時(shí)鐘機制來(lái)提高Linux的時(shí)鐘精度,并通過(guò)分析測試證明該方案確實(shí)可行。

1 Linux時(shí)鐘機制與改進(jìn)

1.1 Linux時(shí)鐘機制

時(shí)鐘和定時(shí)器對Linux系統來(lái)說(shuō)是至關(guān)重要的。首先,內核要管理系統的運行時(shí)間以及墻上時(shí)間;其次,內核中大量的任務(wù)是基于時(shí)間驅動(dòng),其中有些任務(wù)是周期執行,如對調度程序中運行隊列進(jìn)行平衡調整或對屏幕進(jìn)行刷新,而有些任務(wù)需要推后執行的I/O操作則需要等待一個(gè)相對時(shí)間后才運行。

系統時(shí)鐘是定時(shí)器硬件和系統軟件的結合,在X86體系結構中,使用最普遍的定時(shí)器硬件是Intel8254可編程定時(shí)器芯片(PIT),它產(chǎn)生的中斷就是時(shí)鐘中斷(tick)。時(shí)鐘中斷是特定的周期性中斷,對應中斷服務(wù)程序,完成更新系統時(shí)間以及任務(wù)的管理、調度等工作;系統在每次時(shí)鐘中斷處理中更新jiffies,維護系統定時(shí)器鏈表timer_list,對超時(shí)的定時(shí)器進(jìn)行處理。

與系統定時(shí)器相對的是動(dòng)態(tài)定時(shí)器,是用來(lái)調度事件在將來(lái)某個(gè)時(shí)刻發(fā)生的機制。它依賴(lài)于系統時(shí)鐘中斷,在時(shí)鐘中斷服務(wù)程序的下半部,系統檢查是否有超時(shí)的動(dòng)態(tài)定時(shí)器并進(jìn)行處理。linux2.6內核的系統時(shí)鐘頻率為1 000 Hz,即時(shí)鐘中斷的觸發(fā)周期為1 ms,中斷服務(wù)程序最快每1 ms執行一次。動(dòng)態(tài)定時(shí)器隨時(shí)都可能超時(shí),但只有在中斷服務(wù)處理程序執行時(shí)才會(huì )檢查、執行超時(shí)的動(dòng)態(tài)定時(shí)器,所以動(dòng)態(tài)定時(shí)器的平均誤差大約為半個(gè)系統時(shí)鐘周期。

CNC數控系統的工作過(guò)程通常是首先內建一個(gè)定時(shí)器(由操作系統完成),然后周期性地執行控制程序,周期通常為幾十微秒到十幾毫秒。在每個(gè)周期內要完成狀態(tài)監測、譯碼、刀具補償計算、插補計算、PLC管理、位置控制等工作??梢?jiàn),在加工工件過(guò)程中,CNC要求的實(shí)時(shí)性非常高,必須在很短、很精確的周期內完成一系列的計算和輸入輸出,否則加工精度無(wú)法得到保障。標準2.6內核Linux定時(shí)器精度遠遠達不到數控系統周期實(shí)時(shí)任務(wù)要求的微秒級定時(shí)精度。

1.2 提高時(shí)鐘精度的辦法

近年來(lái)人們對Linux進(jìn)行實(shí)時(shí)化改造提出了一些方案和設想,主要有KURT-Linux、RT-Linux等[2]。下面分別進(jìn)行介紹。

KURT_Linux[3]由kansas大學(xué)開(kāi)發(fā),通過(guò)對Linux內核內部進(jìn)行改造來(lái)滿(mǎn)足需求。在時(shí)鐘精度方面,KURT-Linux將Linux的時(shí)鐘中斷固定模式改為單次觸發(fā)模式(one-shot mode),即每次給時(shí)鐘芯片設置一個(gè)超時(shí)時(shí)間,然后等到該超時(shí)事件發(fā)生,在時(shí)鐘中斷處理過(guò)程中再次根據需要設置一個(gè)超時(shí)時(shí)間。通過(guò)這種變長(cháng)時(shí)鐘模式,將提高到μs級。既保證了特定實(shí)時(shí)任務(wù)的精度要求,又避免了不必要的調度負擔。

RT-Linux是新墨西哥工學(xué)院研制的一個(gè)基于Linux的硬實(shí)時(shí)系統。它采用雙內核方法,在原有Linux基礎上設計一個(gè)專(zhuān)門(mén)處理實(shí)時(shí)進(jìn)程的內核,然后把整個(gè)Linux作為實(shí)時(shí)內核上運行的一個(gè)低優(yōu)先級進(jìn)程。在時(shí)鐘精度方面類(lèi)似KURT_Linux,將系統實(shí)時(shí)時(shí)鐘設置為單次觸發(fā)狀態(tài),然后利用TSC提供高達CPU時(shí)鐘頻率的定時(shí)精度。
Monta Vista Linux是由James Ready領(lǐng)導開(kāi)發(fā)的嵌入式Linux,通過(guò)對Linux內核進(jìn)行內部改造,直接修改原有Linux內核的數據結構等來(lái)滿(mǎn)足實(shí)時(shí)需要。在高精度時(shí)鐘方面,拋開(kāi)傳統的周期中斷CPU的方法,使定時(shí)器在需要的任何一個(gè)μs產(chǎn)生中斷,但不在每個(gè)μs產(chǎn)生中斷,將系統的定時(shí)精度提高到μs級。

Linux-SRT是劍橋大學(xué)David Ingram的博士論文項目,它簡(jiǎn)單地修改了Linux中Hz的定義,將Linux時(shí)鐘頻率由100 Hz提高到1 024 Hz。這種方式實(shí)現起來(lái)很簡(jiǎn)單,但是由此帶來(lái)頻繁的定時(shí)中斷使得系統開(kāi)銷(xiāo)很大。借鑒KURT-Linux的one-shot思想來(lái)提高時(shí)鐘精度,并利用高級可編程中斷控制器(APIC)[4]或通過(guò)附加的硬件資源實(shí)現一個(gè)與系統時(shí)鐘并行的高精度實(shí)時(shí)時(shí)鐘,在系統中維護一個(gè)高精度實(shí)時(shí)時(shí)鐘和一個(gè)低精度系統時(shí)鐘[5-7],是一種普遍采用的提高時(shí)鐘精度的方法。但是在缺乏附加硬件支持或APIC使用受限的應用環(huán)境下,只能利用PIT芯片作為高精度時(shí)鐘源,在每次中斷處理時(shí)要重新計算下一次中斷時(shí)間和對PIT進(jìn)行編程。由于PC的兼容性,PIT芯片位于低速的ISA總線(xiàn)上,頻繁設置定時(shí)器硬件也需要耗費大量的時(shí)鐘周期。因此one-shot模式時(shí)鐘中斷處理時(shí)間可能達到標準Linux時(shí)鐘中斷處理時(shí)間的7~15倍[8-9]。在強周期應用或有大量定時(shí)器集中在某個(gè)時(shí)段內時(shí)超時(shí),需要采取一種不同于one-shot的時(shí)鐘模式。

如果系統中沒(méi)有任何實(shí)時(shí)定時(shí)器,則系統每隔1 ms會(huì )有一次周期性jiffies時(shí)鐘中斷,采用one-shot模式使得系統性能下降大約1.5%。如果系統中沒(méi)有任何實(shí)時(shí)定時(shí)器,則需要重新將時(shí)鐘設置為RTL CLOCK MODE PERIODIC工作模式,并且時(shí)鐘周期和標準Linux下時(shí)鐘周期一致,使Linux能在系統中不存在實(shí)時(shí)任務(wù)的情況下高效地工作。

2 動(dòng)態(tài)高精度時(shí)鐘設計和實(shí)現

動(dòng)態(tài)高精度時(shí)鐘設計方案借鑒了KURT-Linux思想,但與其不同的是提供一個(gè)與標準Linux核心時(shí)鐘并行的具有精密刻度的實(shí)時(shí)時(shí)鐘,并與原核心時(shí)鐘區別開(kāi)。采用X86體系CPU提供的TSC作為高精度的時(shí)間標度,權衡一定時(shí)間段(如一個(gè)jiffies)內高精度定時(shí)器的數量,設置Linux時(shí)鐘中斷模式為標準模式、one-shot模式或高頻周期時(shí)鐘模式。實(shí)現了μs級定時(shí)精度的同時(shí),降低了頻繁計算和設置時(shí)鐘芯片的時(shí)間代價(jià)。

下面給出關(guān)鍵的全局變量:
(1)time_mode:表示當前時(shí)鐘工作模式。其中-1代表高頻周期時(shí)鐘模式,該模式下,根據需要達到的定時(shí)精度,設置時(shí)鐘芯片以較高的頻率產(chǎn)生周期性中斷;0代表標準模式,時(shí)鐘芯片以標準Linux默認的頻率產(chǎn)生周期中斷;1代表one-shot模式,時(shí)鐘芯片被設置為單次觸發(fā)狀態(tài),即每次給時(shí)鐘芯片設置一個(gè)超時(shí)時(shí)間,超時(shí)事件發(fā)生時(shí),在時(shí)鐘中斷處理程序中根據需要再次給時(shí)鐘芯片設置一個(gè)超時(shí)時(shí)間。系統啟動(dòng)時(shí)設置為默認值0。

(2)SCALE:時(shí)鐘精度提高比。設置高頻周期模式需要的參數,用來(lái)表示所需要達到的時(shí)鐘精度相對普通的提高倍數。

(3)Threshold:閾值。如果即將在某一時(shí)間段內超時(shí)的實(shí)時(shí)定時(shí)器數量大于預設值,系統設置硬件定時(shí)器工作在高頻周期時(shí)鐘模式。

2.1 時(shí)鐘中斷處理

為了加強Linux的實(shí)時(shí)功能,同時(shí)又要保持Linux的完整性,本方案的動(dòng)態(tài)多模式時(shí)鐘機制以模塊化的方式實(shí)現有關(guān)實(shí)時(shí)部分的功能,并利用接口函數實(shí)現實(shí)時(shí)模塊與Linux核心的聯(lián)系。

(1)標準模式。標準模式下的中斷處理首先查詢(xún)實(shí)時(shí)定時(shí)器隊列中是否有實(shí)時(shí)定時(shí)器在下一個(gè)系統時(shí)鐘中斷(jiffies+1)之前超時(shí),即在(jiffies,jiffies+1)內是否有實(shí)時(shí)定時(shí)器要處理,根據實(shí)時(shí)定時(shí)器數量設置時(shí)鐘芯片的工作模式,執行do_timer_interrupt()等函數維護系統相關(guān)時(shí)間,標記下半部。

(2)one_shot模式。one-shot模式下的中斷處理先判斷jiffies時(shí)鐘是否到期,如果到期:
①查詢(xún)實(shí)時(shí)定時(shí)器隊列中是否有實(shí)時(shí)定時(shí)器在下一個(gè)系統時(shí)鐘中斷(tick+1)之前超時(shí),即在(jiffies,jiffies+1)內有實(shí)時(shí)定時(shí)器要處理(其超時(shí)時(shí)間用sub_jiffies表示),然后根據實(shí)時(shí)定時(shí)器數量設置時(shí)鐘芯片工作模式。
②執行do_timer_interrupt()函數等維護與系統有關(guān)的時(shí)間,并標記下半部。
如果jiffies時(shí)鐘未到期,則查詢(xún)實(shí)時(shí)定時(shí)器鏈表,根據其最早超時(shí)實(shí)時(shí)定時(shí)器的超時(shí)時(shí)間與當前時(shí)間的差值設置時(shí)鐘芯片產(chǎn)生下一次中斷的時(shí)間。

(3)高頻周期時(shí)鐘模式。高頻周期模式下中斷處理先判斷jiffies時(shí)鐘是否到期,如果系統時(shí)鐘節拍到期,執行上述①、②模式。否則,如果有實(shí)時(shí)定時(shí)器超時(shí),標記中斷下半部;如果沒(méi)有實(shí)時(shí)定時(shí)器超時(shí)則直接返回。
對超時(shí)定時(shí)器的處理都留到時(shí)鐘中斷下半部(softirq)處理,超時(shí)的實(shí)時(shí)定時(shí)器優(yōu)先得到處理,以盡可能保證實(shí)時(shí)定時(shí)器的及時(shí)處理,隨后處理普通Linux的定時(shí)器,時(shí)鐘中斷處理過(guò)程如圖1所示。


2.2 定時(shí)器組織

普通Linux系統原有的粗粒度定時(shí)器對于內核的穩定和不要求高精度定時(shí)的非仍是合適的,只是針對有高精度定時(shí)要求的實(shí)時(shí)應用組織一個(gè)高精度定時(shí)器隊列HRT_list,隊列中的定時(shí)器按超時(shí)時(shí)間非降序排列,隊列中第一個(gè)定時(shí)器的超時(shí)時(shí)間就是隊列的最早超時(shí)時(shí)間。

原Linux內核中的定時(shí)器是通過(guò)稱(chēng)為CTW(Cascading Timer Wheel)的結構管理和維護,并因此使得對定時(shí)器的插入、刪除等操作的時(shí)間為0(1)。本文把HRT_list隊列和CTW結合起來(lái)以降低定時(shí)器處理時(shí)間、提高效率。把需要較長(cháng)時(shí)間才超時(shí)的實(shí)時(shí)定時(shí)器仍舊插入到原定時(shí)器隊列中,借助該隊列維護。在每次系統時(shí)鐘中斷處理的下半部處理完超時(shí)的實(shí)時(shí)定時(shí)器后,把在下一次系統時(shí)鐘中斷前超時(shí)的高精度定時(shí)器從原隊列移除,并插入到HRT_list隊列中。因此,HRT_list隊列中所需要維護的高精度實(shí)時(shí)定時(shí)器也是有限的,避免了維護一個(gè)大規模定時(shí)器隊列的開(kāi)銷(xiāo),近似實(shí)現了0(1)的系統開(kāi)銷(xiāo)。

3 性能分析與測試

3.1 性能分析

當系統中沒(méi)有高精度定時(shí)器時(shí),PIT仍以L(fǎng)inux系統默認的頻率觸發(fā)時(shí)鐘中斷,在每一次系統時(shí)鐘中斷處理過(guò)程中,只需要判斷工作模式以及下一次jiffies中斷前有否實(shí)時(shí)定時(shí)器超時(shí),經(jīng)測試由此而帶來(lái)的處理時(shí)間不超過(guò)1us,增加系統負擔0.1%,不會(huì )影響系統的性能。當在某個(gè)時(shí)間段內系統中實(shí)時(shí)定時(shí)器不多于閾值時(shí),系統時(shí)鐘工作在類(lèi)似KURT-Linux的one-shot模式,同時(shí)維持普通Linux系統時(shí)鐘的穩定。而由此而帶來(lái)的系統負擔是可以接受的[3]。

當系統中存在大量實(shí)時(shí)定時(shí)器或在某個(gè)時(shí)間段內即將超時(shí)的實(shí)時(shí)定時(shí)器數量超過(guò)一定值(閾值)時(shí),相對于one-shot模式需要頻繁地計算下次中斷時(shí)間,并重新編程在低速的ISA總線(xiàn)上的PIT的時(shí)間代價(jià)是可取的,證明如下:
用Thw表示中斷的硬件處理時(shí)間,Tisr表示中斷程序上半部執行時(shí)間,n代表某個(gè)時(shí)段內(一個(gè)jiffies內)超時(shí)的定時(shí)器數量。得到兩種模式下總的時(shí)鐘中斷處理時(shí)間關(guān)系式:

顯然,當某個(gè)時(shí)段內超時(shí)的定時(shí)器數量大于Threshold時(shí),采用高頻周期模式的時(shí)間開(kāi)銷(xiāo)就會(huì )小于one-shot模式。

本文引用地址:http://dyxdggzs.com/article/257872.htm

3.2 模擬測試

測試環(huán)境為Pentium4 3.0 GHz CPU,1GDDR內存的硬件平臺和2.6.15.6版本內核的Fedora core linux操作系統平臺。

根據數控實(shí)時(shí)任務(wù)的要求設定了周期為0.1 ms、1 ms和100 ms的進(jìn)程模擬數控實(shí)時(shí)周期任務(wù)[10],統計運行1 000次的數據,比較改進(jìn)后的高精度定時(shí)器和原linux定時(shí)器的平均定時(shí)偏差,并令閾值為30,設置周期任務(wù)數量為4、20、40,使時(shí)鐘工作在不同模式下。測試結果如表1所示。

由測試數據對比,原linux系統的定時(shí)平均偏差為968 μs,改進(jìn)后系統的定時(shí)平均偏差為34 ?滋s。顯而易見(jiàn),改進(jìn)后的定時(shí)器定時(shí)精度大大提高,達到10 μs級,能滿(mǎn)足數控系統應用的要求。

在原Linux內核和改進(jìn)后的高精度定時(shí)器內核上睡眠50 μs各1 000次,測試實(shí)際睡眠時(shí)間所得結果與表1類(lèi)似,50 μs的實(shí)際睡眠時(shí)間從(2.001~2.116) ms級降到(57~91) μs級。

全軟件數控系統以應用軟件的形式實(shí)現運動(dòng)控制,是開(kāi)放式數控系統的發(fā)展方向。開(kāi)源的Linux是開(kāi)發(fā)具有自主知識產(chǎn)權數控系統的理想平臺,但是其粗糙的是普通Linux直接應用于數控系統的最大障礙,因此需要細化Linux的時(shí)鐘粒度提高其實(shí)時(shí)性。

簡(jiǎn)單地提高系統時(shí)鐘頻率將引起頻繁的中斷處理,導致系統性能的下降。KURT-Linux采用的one-shot方式將周期性的時(shí)鐘中斷改進(jìn)為單次觸發(fā)狀態(tài),實(shí)現了μs級的定時(shí)精度。本文分析了普通Linux時(shí)鐘機制和幾種實(shí)時(shí)Linux操作系統細化時(shí)鐘精度的方式,提出了一種混合多種時(shí)鐘模式的動(dòng)態(tài)時(shí)鐘機制,達到了CNC要求的時(shí)鐘精度。最后的性能分析和模擬測試證實(shí)了新時(shí)鐘機制的技術(shù)性能。



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>