曹玉華 游有鵬
(南京航空航天大學(xué)機(jī)電學(xué)院,江蘇南京210016)
新一代數(shù)控系統(tǒng)的模塊化、集成化、小型化要求,使得嵌入式數(shù)控系統(tǒng)成為一個(gè)重要的發(fā)展和研究方向。所謂的嵌入式系統(tǒng)是以應(yīng)用為中心,軟硬件可裁減的,適用于對(duì)功能、可靠性、成本、體積、功耗等綜合性能嚴(yán)格要求的計(jì)算機(jī)系統(tǒng),而嵌入式數(shù)控系統(tǒng)則兼?zhèn)淞饲度胧郊夹g(shù)和數(shù)控技術(shù)的優(yōu)勢(shì)。一種典型的嵌入式數(shù)控系統(tǒng)是以“嵌入式處理器+運(yùn)動(dòng)控制器”的結(jié)構(gòu)形式。嵌入式處理器完成對(duì)整個(gè)系統(tǒng)總體控制,是數(shù)控系統(tǒng)軟件運(yùn)行的平臺(tái);運(yùn)動(dòng)控制器完成對(duì)機(jī)床的直接控制,并接收機(jī)床的反饋信息。
隨著數(shù)控系統(tǒng)功能的日益強(qiáng)大以及高性能嵌入式處理器的不斷推出,對(duì)系統(tǒng)所需的任務(wù)管理平臺(tái)和底層驅(qū)動(dòng)平臺(tái)的要求逐漸提高,這就使得將操作系統(tǒng)引入到嵌入式系統(tǒng)中成為必然的趨勢(shì)。利用操作系統(tǒng)不但可以提高嵌入式系統(tǒng)的穩(wěn)定性,同時(shí)也能夠充分發(fā)揮32位CPU的多任務(wù)處理能力。嵌入式數(shù)控系統(tǒng)的應(yīng)用決定了其很高的實(shí)時(shí)性要求,采用了操作系統(tǒng)的嵌入式數(shù)控系統(tǒng),系統(tǒng)的實(shí)時(shí)性主要取決于處理器和操作系統(tǒng)本身。目前,嵌入式處理器的運(yùn)算速度通常都能達(dá)到百兆級(jí)以上,處理器對(duì)于嵌入式系統(tǒng)實(shí)時(shí)性要求的限制很小,因此整個(gè)嵌入式數(shù)控系統(tǒng)的實(shí)時(shí)性很大程度上取決于操作系統(tǒng)。所以,選擇和構(gòu)建一種合適的實(shí)時(shí)操作系統(tǒng)就成為開(kāi)發(fā)嵌入式數(shù)控系統(tǒng)的關(guān)鍵環(huán)節(jié)。本文選擇Linux系統(tǒng)作為嵌入式數(shù)控系統(tǒng)的操作系統(tǒng),并在此基礎(chǔ)上研究其實(shí)時(shí)性。
所謂實(shí)時(shí),就是一個(gè)特定任務(wù)的執(zhí)行時(shí)間必須是確定的,可預(yù)測(cè)的,并且在任何情況下都能保證任務(wù)的時(shí)限(最大執(zhí)行時(shí)間限制)。嵌入式數(shù)控系統(tǒng)是一個(gè)典型的強(qiáng)實(shí)時(shí)性系統(tǒng),系統(tǒng)要求具有可確定性,即可確保條件出現(xiàn)到由此引起的動(dòng)作開(kāi)始(或者結(jié)束)的時(shí)間在一個(gè)準(zhǔn)確的時(shí)段內(nèi)[1]。在數(shù)控系統(tǒng)中,條件是由指令(如急停,G代碼的軸進(jìn)給要求等)或是機(jī)床的狀態(tài)(如超程等)引起的。在機(jī)床運(yùn)行時(shí),需要滿足時(shí)間約束的情況主要是和系統(tǒng)安全(如對(duì)突發(fā)事件的反應(yīng)等)以及切削精度有關(guān)。比如數(shù)控機(jī)床的進(jìn)給控制系統(tǒng),在規(guī)定時(shí)間進(jìn)給系統(tǒng)必須達(dá)到預(yù)定的位置,否則無(wú)法保證加工零件的精度甚至無(wú)法完成加工。數(shù)控系統(tǒng)中的插補(bǔ)運(yùn)算和位置控制等軌跡控制功能都是實(shí)時(shí)性很強(qiáng)的任務(wù)。以FANUC 7M系統(tǒng)為例,插補(bǔ)周期設(shè)置為8 ms,位置反饋采樣周期為4 ms,當(dāng)前的高速高精度控制甚至已經(jīng)把采樣周期和插補(bǔ)周期減小到1 ms以下,因此其運(yùn)行必須滿足最后期限的限制。為了達(dá)到快速響應(yīng)和及時(shí)運(yùn)算處理的實(shí)時(shí)性要求,在嵌入式數(shù)控系統(tǒng)軟件模塊設(shè)計(jì)時(shí)需充分考慮數(shù)控系統(tǒng)的實(shí)時(shí)性要求,合理規(guī)劃不同實(shí)時(shí)性要求的軟件模塊。而軟件模塊的設(shè)計(jì)與嵌入式操作系統(tǒng)的性能極度相關(guān),因此一個(gè)實(shí)時(shí)性能優(yōu)秀的操作系統(tǒng)對(duì)整個(gè)嵌入式數(shù)控系統(tǒng)開(kāi)發(fā)至關(guān)重要。
Linux以其開(kāi)源、可裁剪、易移植、多架構(gòu)支持、穩(wěn)定等特性使得它在嵌入式系統(tǒng)中得到了廣泛應(yīng)用。然而Linux在設(shè)計(jì)之初沒(méi)有對(duì)實(shí)時(shí)性進(jìn)行考慮,標(biāo)準(zhǔn)Linux有幾個(gè)機(jī)制嚴(yán)重地影響了實(shí)時(shí)性[2]。
(1)內(nèi)核限制。在Linux 2.4和以前的版本,內(nèi)核是不可搶占的,緊急任務(wù)必須等到當(dāng)前任務(wù)執(zhí)行完成后,或者當(dāng)前任務(wù)因需要等待某些條件滿足而主動(dòng)讓出CPU才能被考慮執(zhí)行,從而造成很嚴(yán)重的搶占延遲。在Linux 2.6中,雖然內(nèi)核已經(jīng)可以搶占,但內(nèi)核中仍有大量的不可搶占區(qū)域。
(2)自旋鎖(spinlock)。自旋鎖是對(duì)共享資源的一種同步機(jī)制,用來(lái)解決共享資源沖突的問(wèn)題,但是在保持自旋鎖期間搶占將失效,這意味搶占延遲非常不確定。
(3)時(shí)間粒度。時(shí)間粒度是指操作系統(tǒng)所能提供的最小時(shí)間間隔。時(shí)間粒度越小,系統(tǒng)開(kāi)銷越大。時(shí)間粒度越大,進(jìn)程的響應(yīng)延遲越大。Linux的時(shí)鐘中斷的周期設(shè)為10 ms,這足以滿足一般Linux進(jìn)程對(duì)于時(shí)間粒度的要求,但對(duì)于高性能要求的嵌入式數(shù)控系統(tǒng)(如插補(bǔ)周期只有幾毫秒甚至更小的情況),則時(shí)間粒度過(guò)大。
(4)調(diào)度算法和調(diào)度點(diǎn)。在Linux 2.4及以前的版本,所有的CPU共享一個(gè)任務(wù)鏈表,任何時(shí)刻只能有一個(gè)調(diào)度器運(yùn)行。搶占延遲很大程度上取決于當(dāng)前系統(tǒng)的任務(wù)數(shù),具有非常大的不確定性和不可預(yù)測(cè)性。此外,即使內(nèi)核是可搶占的,也不是在任何地方可以發(fā)生調(diào)度。
綜上可見(jiàn),Linux任務(wù)調(diào)度和中斷處理的延遲較大,幾乎不能滿足嵌入式數(shù)控系統(tǒng)實(shí)時(shí)任務(wù)的要求,因此必須對(duì)Linux內(nèi)核進(jìn)行實(shí)時(shí)改造。
針對(duì)Linux實(shí)時(shí)性不足的問(wèn)題,目前的實(shí)時(shí)改造方案都基于兩種原理[3]:(1)對(duì)Linux內(nèi)核進(jìn)行實(shí)時(shí)改造。即直接修改Linux內(nèi)核的數(shù)據(jù)結(jié)構(gòu)、調(diào)度方式以及中斷方式(主要是定時(shí)器中斷)。這種實(shí)時(shí)改造后的系統(tǒng)實(shí)時(shí)性較好,但是改造工作量大,并可能會(huì)造成系統(tǒng)的不穩(wěn)定。典型代表有Kurt-Linux;(2)對(duì)Linux內(nèi)核的外部實(shí)時(shí)擴(kuò)展,即所謂雙內(nèi)核的辦法。具體是在Linux內(nèi)核和硬件之間加入一個(gè)硬件抽象層(HardwareAbstractLayer,HAL),系統(tǒng)所有的硬件中斷由這個(gè)抽象層控制。新創(chuàng)建一個(gè)內(nèi)核專門(mén)用來(lái)調(diào)度實(shí)時(shí)進(jìn)程,而普通進(jìn)程通過(guò)原來(lái)的Linux內(nèi)核進(jìn)行調(diào)度。采用此方法的最大好處在于對(duì)Linux的內(nèi)核改動(dòng)很小,而且原Linux上的設(shè)備驅(qū)動(dòng)程序和應(yīng)用程序都能順利在此實(shí)時(shí)系統(tǒng)上運(yùn)行。典型代表有RTLinux、RTAI和Xenomai。
本文采用基于第二種改造原理的Xenomai進(jìn)行實(shí)時(shí)化改造。Xenomai是一個(gè)自由軟件項(xiàng)目,它可以提供工業(yè)級(jí)的RTOS的性能,完全遵守GNU/Linux自由軟件協(xié)議,與其他實(shí)時(shí)性改造項(xiàng)目相比,Xenomai更關(guān)注可擴(kuò)展、輕便和可維護(hù)性,代碼的移植工作量較小,尤其適合嵌入式系統(tǒng)的改造與移植。Linux+Xenomai基本構(gòu)架如圖1所示[4]。
Xenomai是充分利用Adeos原理來(lái)實(shí)現(xiàn)的,圖中Adeos實(shí)現(xiàn)的功能主要包括中斷管道機(jī)制(I-Pipe)、域調(diào)度模塊功能和域管理模塊功能,它可以將硬件中斷定向到指定的域[5]。Linux內(nèi)核和Xenomai分別作為Adeos中的一個(gè)域存在。Linux內(nèi)核負(fù)責(zé)非實(shí)時(shí)任務(wù)的調(diào)度,而Xenomai采用不同于Linux的精度更高的定時(shí)中斷來(lái)調(diào)度實(shí)時(shí)任務(wù),實(shí)現(xiàn)更小的調(diào)度延時(shí)。另外,Xenomai域的優(yōu)先級(jí)高于Linux域,每當(dāng)中斷到來(lái),Adeos會(huì)先將中斷交給Xenomai處理,如果Xenomai沒(méi)有需要處理的中斷,才會(huì)將中斷交給Linux內(nèi)核處理,保證了Xenomai的中斷響應(yīng)和任務(wù)調(diào)度的實(shí)時(shí)性。作為和Linux核同等地位的Xenomai,除了提供最基本的Native API,還提供與傳統(tǒng)的工業(yè)級(jí)實(shí)時(shí)操作系統(tǒng)(包括 VxWorks、pSOS+、VRTX和 uITRON)相同功能的API(RTOS skins),這樣可以讓這些操作系統(tǒng)下的應(yīng)用程序只需極少的改動(dòng),就能方便地移植到GNU/Linux環(huán)境中,并能保持良好的實(shí)時(shí)性。
基于Linux+Xenomai構(gòu)架的嵌入式系統(tǒng)構(gòu)造了從用戶空間到內(nèi)核空間的實(shí)時(shí)開(kāi)發(fā)環(huán)境,為嵌入式數(shù)控系統(tǒng)軟件模塊的合理規(guī)劃提供強(qiáng)有力的保證。
嵌入式數(shù)控系統(tǒng)的另一個(gè)顯著特點(diǎn)是多任務(wù)性,在上文構(gòu)建的Linux+Xenomai實(shí)時(shí)構(gòu)架的基礎(chǔ)上,充分考慮數(shù)控系統(tǒng)不同模塊的實(shí)時(shí)性能,合理規(guī)劃數(shù)控系統(tǒng)的軟件模塊,也具有非常重要的意義。遵循不同模塊的實(shí)時(shí)性要求以及模塊規(guī)劃需符合軟件工程學(xué)的科學(xué)原理且易于擴(kuò)展和維護(hù)的原則[6]。本文對(duì)數(shù)控系統(tǒng)軟件模塊的規(guī)劃如圖2所示。
根據(jù)任務(wù)的實(shí)時(shí)性強(qiáng)弱,將嵌入式數(shù)控系統(tǒng)軟件結(jié)構(gòu)層次分為:非實(shí)時(shí)層和實(shí)時(shí)層,兩個(gè)層次的應(yīng)用軟件都涉及到用戶空間和內(nèi)核空間。
非實(shí)時(shí)層主要包括:任務(wù)管理部分、人機(jī)交互部分和PLC管理部分。其中任務(wù)管理模塊是本層的核心,負(fù)責(zé)調(diào)度其他模塊,對(duì)非實(shí)時(shí)層和實(shí)時(shí)層之間的數(shù)據(jù)傳遞進(jìn)行管理。人機(jī)交互模塊提供與用戶交互相關(guān)的功能,主要包括人機(jī)界面、文件管理、參數(shù)管理、狀態(tài)顯示、圖形仿真等功能。PLC管理和譯碼模塊則負(fù)責(zé)將PLC文件譯碼并提供給實(shí)時(shí)層。非實(shí)時(shí)層對(duì)實(shí)時(shí)性基本沒(méi)有要求,可采用普通的Linux任務(wù)調(diào)度。實(shí)時(shí)層主要包括:譯碼、刀補(bǔ)、速度預(yù)處理、插補(bǔ)、手動(dòng)、軟PLC執(zhí)行模塊、位控和狀態(tài)檢測(cè)等模塊。這部分對(duì)實(shí)時(shí)性要求較高,所以采用Xenomai進(jìn)行實(shí)時(shí)的任務(wù)調(diào)度。實(shí)時(shí)層的實(shí)現(xiàn)涉及用戶和內(nèi)核空間。運(yùn)動(dòng)控制部分的刀補(bǔ)、速度預(yù)處理、插補(bǔ)等模塊運(yùn)算復(fù)雜,對(duì)實(shí)時(shí)要求相對(duì)較低,基本不與硬件交互,可以在實(shí)時(shí)層的用戶空間運(yùn)行;而狀態(tài)檢測(cè)、位置控制等運(yùn)算相對(duì)少,對(duì)實(shí)時(shí)要求最高,并且需要與硬件交互,另外軟PLC運(yùn)行模塊也需要直接與硬件進(jìn)行交互,所以將它們規(guī)劃在實(shí)時(shí)層的內(nèi)核空間。
非實(shí)時(shí)和實(shí)時(shí)層中的任務(wù)模塊以進(jìn)程或線程的形式獨(dú)立并發(fā)的運(yùn)行,各層、各模塊之間通過(guò)通信協(xié)作來(lái)實(shí)現(xiàn)數(shù)控功能。
Linux實(shí)時(shí)化改造完成后,需要對(duì)其做一定的測(cè)試來(lái)確定系統(tǒng)是否符合實(shí)際應(yīng)用的實(shí)時(shí)性要求。本文的硬件平臺(tái)是研華PCM-3350/PC104卡,PC104是一種基于PC/104總線規(guī)范的嵌入式板卡,與傳統(tǒng)PC系統(tǒng)兼容,它不僅基本具備普通PC系統(tǒng)的一切功能,還具有小尺寸、低功耗、開(kāi)放的和高可靠性的工業(yè)規(guī)范等優(yōu)點(diǎn)。在PC104上移植安裝經(jīng)裁剪過(guò)的嵌入式Linux內(nèi)核,將Xenomai作為目標(biāo)內(nèi)核的一部分進(jìn)行編譯安裝,使其成為一個(gè)與Linux無(wú)縫結(jié)合的實(shí)時(shí)子系統(tǒng)?;緶y(cè)試環(huán)境:處理器主頻300 MHz,128 M內(nèi)存,Linux內(nèi)核版本為2.6.20,Xenomai版本為2.4.8。
定時(shí)器抖動(dòng)是系統(tǒng)實(shí)時(shí)性的一個(gè)重要指標(biāo),它能夠很好地反映系統(tǒng)周期性執(zhí)行任務(wù)時(shí)間上的準(zhǔn)確性。其測(cè)試原理是創(chuàng)建一個(gè)周期線程,測(cè)量實(shí)際的和期望的周期結(jié)束時(shí)間之間的偏差[7]。定時(shí)器抖動(dòng)的概念如圖3所示。周期線程從T1時(shí)刻開(kāi)始運(yùn)行,并在該周期預(yù)期時(shí)間結(jié)束后,在T2時(shí)刻重新開(kāi)始運(yùn)行。但實(shí)際情況是在T3時(shí)刻線程才開(kāi)始新的周期。T3時(shí)刻和T2時(shí)刻之間的時(shí)間間隔就是所謂的定時(shí)器抖動(dòng)。
基于此原理,使用周期性的線程,在每次線程運(yùn)行開(kāi)始,將上一次讀取的時(shí)間存放到一個(gè)變量中,再讀取當(dāng)前的時(shí)間。然后將當(dāng)前時(shí)間和存放到變量中的時(shí)間求差,得到線程實(shí)際的周期,再減去期望的定時(shí)周期時(shí)間,得到一個(gè)定時(shí)器的抖動(dòng)值。編程中使用posix標(biāo)準(zhǔn)提供的clock_gettime函數(shù)獲取當(dāng)前時(shí)間,其時(shí)間讀取精度達(dá)10個(gè)納秒級(jí)。測(cè)試程序利用Xenomai的N-ative API進(jìn)行編寫(xiě),使用Xenomai實(shí)時(shí)內(nèi)核的調(diào)度,調(diào)度采用Xenomai的定時(shí)器,因此完全可以測(cè)試Xenomai的實(shí)時(shí)性。關(guān)鍵代碼如下:
線程周期為5 ms,程序每1 s打印一次平均抖動(dòng)、最大最小抖動(dòng)和當(dāng)前抖動(dòng)。在Linux+Xenomai構(gòu)架下,將測(cè)試程序編譯為內(nèi)核模塊,使用insmod工具將模塊加入Linux內(nèi)核后運(yùn)行。采用同樣的原理,測(cè)試未經(jīng)Xenomai實(shí)時(shí)改造的2.6.20版的Linux內(nèi)核,在條件相同時(shí),測(cè)試結(jié)果如表1。可以看出,在Linux+Xenomai構(gòu)架下定時(shí)器抖動(dòng)的絕大部分集中在10 μs以內(nèi),極少出現(xiàn)的抖動(dòng)峰值不超過(guò)100 μs。而在未經(jīng)實(shí)時(shí)化改造的平臺(tái)下,100 μs以上的抖動(dòng)出現(xiàn)頻率較高,而且抖動(dòng)峰值可以超過(guò)1 ms。測(cè)試表明,經(jīng)實(shí)時(shí)化改造后的系統(tǒng)實(shí)時(shí)性有了很大提高。
表1 定時(shí)器抖動(dòng)對(duì)比 μs
Xenomai安裝成功后,在目錄/usr/xenomai/bin/下提供了一系列實(shí)時(shí)性能測(cè)試程序,其中測(cè)試程序latency可以用來(lái)測(cè)試內(nèi)核層、用戶層的實(shí)時(shí)任務(wù)調(diào)度延遲以及內(nèi)核定時(shí)器中斷延遲。下面在重載情況下對(duì)內(nèi)核層實(shí)時(shí)任務(wù)的調(diào)度延遲和定時(shí)器中斷延遲進(jìn)行測(cè)試。測(cè)試采樣周期150 μs,在測(cè)試目錄下輸入:
在后臺(tái)模擬重載情況,此時(shí) CPU使用率接近100%。再輸入:
對(duì)內(nèi)核實(shí)時(shí)任務(wù)調(diào)度延遲進(jìn)行測(cè)試。測(cè)試結(jié)束后再輸入:
對(duì)定時(shí)器中斷延遲進(jìn)行測(cè)試。測(cè)試界面如圖4。
測(cè)試時(shí)間5 min,提取10 000個(gè)采樣點(diǎn),作出平均延時(shí)時(shí)間直方圖如圖5、6所示??梢?jiàn),在重載情況下,內(nèi)核層實(shí)時(shí)任務(wù)調(diào)度延遲和定時(shí)器中斷延遲是非常小的,絕大部分集中在10 μs以下。內(nèi)核層任務(wù)調(diào)度平均延遲不超過(guò)10 μs,定時(shí)器中斷平均延遲不超過(guò)6 μs。測(cè)試表明,基于Xenomai的系統(tǒng)實(shí)時(shí)性能非常好。
隨著現(xiàn)代數(shù)控技術(shù)的發(fā)展要求,采用高性能的嵌入式處理器和實(shí)時(shí)操作系統(tǒng)構(gòu)建嵌入式工業(yè)控制系統(tǒng)平臺(tái)已經(jīng)成為一種發(fā)展趨勢(shì)。Linux+Xenomai實(shí)時(shí)化方案,結(jié)合了Linux強(qiáng)大的多任務(wù)能力與Xenomai良好的實(shí)時(shí)性和可移植性特點(diǎn),簡(jiǎn)單方便,代碼改動(dòng)量小,是開(kāi)發(fā)嵌入式數(shù)控系統(tǒng)比較理想的軟件平臺(tái)。經(jīng)過(guò)實(shí)際的實(shí)時(shí)性測(cè)試表明,基于Xenomai的Linux實(shí)時(shí)化改造,其性能完全可以滿足數(shù)控加工對(duì)系統(tǒng)的高實(shí)時(shí)性要求。本文對(duì)嵌入式數(shù)控系統(tǒng)實(shí)時(shí)性研究也為下一步數(shù)控系統(tǒng)的開(kāi)發(fā)奠定了基礎(chǔ)。
[1]劉淼,王田苗,魏洪興,等.基于uCOS-Ⅱ的嵌入式數(shù)控系統(tǒng)實(shí)時(shí)性分析[J].計(jì)算機(jī)工程,2006,32(22):222-226.
[2]楊燚.Linux實(shí)時(shí)技術(shù)與典型實(shí)析.http://www.ibm.com/developerworks/cn/linux/l-lrt/part1,2010,4.
[3]阮鴻芳,鐘家騏.Linux與硬實(shí)時(shí)擴(kuò)展系統(tǒng)—RTAI的分析與研究[J].嵌入式操作系統(tǒng)應(yīng)用,2007,23(2):44-45.
[4]Barbalace A,Luchetta A,Manduchi G,et al.Performance comparison of VxWorks,Linux,RTAI and Xenomai in a hard real-time application[J].IEEE Transactions On Nuclear Science,2008,55(1):435-439.
[5]Xenomai API.http://www.xenomai.org/documentation/trunk/html/api/,2010,4.
[6]劉曉梅.基于RTLinux的開(kāi)放式數(shù)控系統(tǒng)的研究[D].大連:大連理工大學(xué),2005.
[7]陳路遠(yuǎn).嵌入式Linux實(shí)時(shí)化及其測(cè)試方法的研究[D].哈爾濱:哈爾濱工程大學(xué),2006.