當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]  嵌入式系統(tǒng)是在有限的空間和有限的資源中運(yùn)行,高效地實(shí)現(xiàn)某種特定功能或功能集合的裝置。 它的開發(fā)通常受到很多客觀條件的限制,諸如較弱的CPU處理能力、較小的內(nèi)存空間、較少的可供選擇的外設(shè)、有限的電源供應(yīng)等。每個嵌入式系統(tǒng)的開發(fā)無不是精打細(xì)算,以求用有限的資源發(fā)揮最大的功效。在各種嵌入式系統(tǒng)上運(yùn)行的操作系統(tǒng)中,嵌入式Linux以其免費(fèi)、高可靠性、廣泛的硬件支持以及開放源碼等眾多特性正在獲得越來越多的關(guān)注。其源碼開放特性使得開發(fā)者可以針對特定的嵌入式系統(tǒng)對Linux內(nèi)核進(jìn)行修改,以滿足開發(fā)要求,達(dá)到系統(tǒng)最優(yōu)

嵌入式系統(tǒng)是在有限的空間和有限的資源中運(yùn)行,高效地實(shí)現(xiàn)某種特定功能或功能集合的裝置。

它的開發(fā)通常受到很多客觀條件的限制,諸如較弱的CPU處理能力、較小的內(nèi)存空間、較少的可供選擇的外設(shè)、有限的電源供應(yīng)等。每個嵌入式系統(tǒng)的開發(fā)無不是精打細(xì)算,以求用有限的資源發(fā)揮最大的功效。在各種嵌入式系統(tǒng)上運(yùn)行的操作系統(tǒng)中,嵌入式Linux以其免費(fèi)、高可靠性、廣泛的硬件支持以及開放源碼等眾多特性正在獲得越來越多的關(guān)注。其源碼開放特性使得開發(fā)者可以針對特定的嵌入式系統(tǒng)對Linux內(nèi)核進(jìn)行修改,以滿足開發(fā)要求,達(dá)到系統(tǒng)最優(yōu)化的目的。嵌入式Linux應(yīng)用中的一大問題是Linux的實(shí)時性問題。實(shí)時系統(tǒng)必須在限定時間內(nèi)對外部事件作出正確響應(yīng),重點(diǎn)放在對滿足突發(fā)性、暫時性的處理需求上。而Linux作為傳統(tǒng)的分時操作系統(tǒng),關(guān)注更多的是系統(tǒng)的整體數(shù)據(jù)吞吐量。如何提高Linux的實(shí)時性能是擺在廣大嵌入式系統(tǒng)級開發(fā)人員面前的挑戰(zhàn)。

1 相關(guān)研究

目前市面上有各種Linux發(fā)行版,但嚴(yán)格來說,Linux指的是Linus Torvalds維護(hù)的(及通過主要和鏡像網(wǎng)站發(fā)布的)內(nèi)核。建立嵌入式系統(tǒng)不需要特別的內(nèi)核,一個嵌入式Linux系統(tǒng)只是代表一個基于Linux內(nèi)核的嵌入式系統(tǒng),本文后面提及的Linux均指Linux內(nèi)核。目前已有很多改善Linux實(shí)時性能的工作在進(jìn)行中。最新的2.6版Linux已經(jīng)實(shí)現(xiàn)了可搶占式的內(nèi)核任務(wù)調(diào)度,但是不確定的中斷延時問題沒有得到解決。即2.6版的Linux高優(yōu)先級內(nèi)核空間進(jìn)程雖然能像在用戶空間里那樣搶占低優(yōu)先級進(jìn)程的系統(tǒng)資源,但是從中斷發(fā)出開始到中斷服務(wù)程序的第1條指令開始執(zhí)行的時間是不確定的。

除了Linux開發(fā)者的改進(jìn)工作之外,還有一些組織、公司為提高Linux的實(shí)時性做了大量工作。其中有代表性的是Fsm Labs公司的RT-Linux、Monta Vista公司的MontaVista Linux、由Paolo Mantegazza等人維護(hù)的RTAI(Realtime Application InteRFace)項目。這些項目采用的方法可歸納為兩類:

(1)直接修改Linux內(nèi)核。MontaVista Linux采用的就是這種方法。它將Linux修改成稱為Relatively Fully Preemptable Kernel的可搶占式內(nèi)核,并使現(xiàn)了實(shí)時調(diào)度機(jī)制和算法,增加了一個細(xì)粒度定時器,這樣就將Linux修改成為一個軟實(shí)時內(nèi)核。

(2)“雙內(nèi)核”方式。RTAI項目和RT-Linux采用了這種方法。這種方法將傳統(tǒng)Linux“架空”,作為新增加的小型實(shí)時內(nèi)核的一個優(yōu)先級最低的任務(wù)執(zhí)行,而實(shí)時任務(wù)則作為優(yōu)先級最高的任務(wù)。即在實(shí)時任務(wù)存在的情況下運(yùn)行實(shí)施任務(wù),否則才運(yùn)行Linux本身的任務(wù)。

MontaVista和RT-Linux的局限性在于它是一個商用軟件,不遵循GNU 的源代碼開放原則。若要在系統(tǒng)中使用這種Linux,則需要支付一筆頗為可觀的授權(quán)費(fèi)用,這就違背了使用Linux的初衷—— 開源、免費(fèi),能夠發(fā)展自己的知識產(chǎn)權(quán)。

RTAI為了實(shí)時性能舍棄了Linux固有的很多優(yōu)點(diǎn):對大量硬件的廣泛支持,優(yōu)秀的穩(wěn)定性、可靠性。開發(fā)者一方面要針對RTAI自定義的一個硬件抽象層RTHAL(Real Time Hardware Abstraction Layer)重新編寫驅(qū)動程序,而且龐大的Linux開發(fā)社區(qū)的成果也無法方便地應(yīng)用到實(shí)時核心中。

2 影響Linux實(shí)時性的因素

2.1 任務(wù)切換及其延時

任務(wù)切換延時是Linux從一個進(jìn)程切換到另一個進(jìn)程所需的時間,即高優(yōu)先級進(jìn)程從發(fā)出CPU 資源申請到進(jìn)程的第1條指令開始執(zhí)行的間隔。在實(shí)時系統(tǒng)中,任務(wù)切換延時必須越短越好。如之前所提到的,Linux 2.6.X已經(jīng)實(shí)現(xiàn)了可搶占式內(nèi)核,高優(yōu)先級內(nèi)核空間進(jìn)程可以像在用戶空間中那樣讓CPU在任何時候停止低優(yōu)先級進(jìn)程轉(zhuǎn)而執(zhí)行自己。但是有2種例外情況:

(1)進(jìn)程在臨界區(qū)(Critical Section)中執(zhí)行的時候不能被其他進(jìn)程搶占;

(2)中斷服務(wù)程序(Interrupt Service Routine)不能被其他進(jìn)程搶占。

2.2 基于優(yōu)先級的調(diào)度算法

在Linux 2.6中,采用了O(1)調(diào)度算法。它是一個基于優(yōu)先級的搶先式調(diào)度器,為每一個進(jìn)程分配一個唯一的優(yōu)先級,調(diào)度器保證在所有等待運(yùn)行的任務(wù)中,首先被執(zhí)行的總是高優(yōu)先級的任務(wù),為此高優(yōu)先級的任務(wù)能夠搶占低優(yōu)先級的任務(wù)。

這個調(diào)度器開銷恒定,與當(dāng)前系統(tǒng)開銷無關(guān),能夠改善系統(tǒng)實(shí)時性能。但是調(diào)度系統(tǒng)沒有提供除CPU以外的其他資源剝奪運(yùn)行,實(shí)時性能沒有得到根本改觀。如果兩個任務(wù)需要使用同一個資源(如高速緩存),高優(yōu)先級的任務(wù)已準(zhǔn)備就緒,而此刻低優(yōu)先級的任務(wù)正在用這個資源,高優(yōu)先級的任務(wù)就必須等待,直到低優(yōu)先級任務(wù)結(jié)束釋放了該資源后才能被執(zhí)行,這被稱為優(yōu)先級倒置。


2.3 中斷延時、中斷服務(wù)程序

中斷延時指的是從外設(shè)發(fā)出中斷信號開始到ISR的第1條指令開始執(zhí)行的時間間隔。由外部中斷引起的實(shí)時任務(wù)需求是實(shí)時系統(tǒng)處理量的主要組成部分,足夠快地中斷響應(yīng)和迅速地中斷服務(wù)程序處理是衡量實(shí)時系統(tǒng)的重要性能指標(biāo)。不同的ISR執(zhí)行時間是不一樣的,即使是相同的ISR也可能因?yàn)橛卸鄠€出口而有不同的執(zhí)行時間。而ISR執(zhí)行時外部中斷是被禁用的,造成這樣一種情況,即使Linux的中斷延時非常小,如果在一個ISR執(zhí)行時某個外設(shè)也產(chǎn)生了一個中斷信號,因?yàn)檎趫?zhí)行的ISR運(yùn)行時間的不確定性和不可搶占性,也會產(chǎn)生Linux的中斷延時的不可預(yù)測性。

3 系統(tǒng)實(shí)時性能的提高

3.1 任務(wù)切換機(jī)倒的建立

在2.1節(jié)中提到進(jìn)程在臨界區(qū)中執(zhí)行的時候不能被搶占的問題,為了不影響系統(tǒng)穩(wěn)定性、減少調(diào)試和測試的時間,我們不打算對此進(jìn)行修改,而引入一個機(jī)制保證實(shí)時任務(wù)能夠得到優(yōu)先執(zhí)行。即在實(shí)時系統(tǒng)中,只有當(dāng)進(jìn)程的臨界區(qū)能在下一個實(shí)時任務(wù)開始之前結(jié)束才被允許進(jìn)入。

如何判斷下一個實(shí)時任務(wù)中斷信號的產(chǎn)生時間,一般來說中斷信號是為了那些開始時間不可預(yù)測的任務(wù)而設(shè)定的,它的產(chǎn)生是完全隨機(jī)的。為了使中斷信號的時間能夠被預(yù)測,將中斷信號的產(chǎn)生與時鐘中斷掛鉤:中斷信號只能與時鐘中斷同時產(chǎn)生。時鐘中斷由系統(tǒng)計時硬件以周期性間隔產(chǎn)生。這個間隔由內(nèi)核根據(jù)Hz值設(shè)定。Hz是一個與體系結(jié)構(gòu)有關(guān)的常數(shù),在文件中定義。當(dāng)前的Linux為大多數(shù)平臺定義的Hz值是100,亦即時鐘中斷周期是10ms。顯然這是達(dá)不到實(shí)時系統(tǒng)定時精度要求的。提高Hz值能夠帶來系統(tǒng)性能提升,但卻是以增加系統(tǒng)開銷為代價。這就必須仔細(xì)權(quán)衡實(shí)時性要求和系統(tǒng)開銷的平衡。一種方法是通過大量的測試確定的實(shí)時任務(wù)中斷請求發(fā)生的時間間隔和進(jìn)程在臨界區(qū)中的執(zhí)行時間,取一個稍大于大多數(shù)實(shí)時任務(wù)中斷間隔和臨界區(qū)執(zhí)行時間的數(shù)值。

Linux提供了一些機(jī)制讓我們得以計算函數(shù)的執(zhí)行時間,gettimefoday()函數(shù)是其中之一。函數(shù)的原型及需要使用的一個數(shù)據(jù)結(jié)構(gòu)如下:



其中,gettimeofday()將當(dāng)前時間保存在tv結(jié)構(gòu)中,tz一般不需要用到,可用NULL代替。使用示例如下:



如此即可得出進(jìn)程在臨界區(qū)function_in_critical_section()所耗費(fèi)的時間,以供參考。將Hz值設(shè)定在2000,此時系統(tǒng)時鐘中斷周期為0.5ms,精度提高了20倍。

如圖1、圖2所示,當(dāng)進(jìn)程進(jìn)入臨界區(qū)之前,它比較自身的平均執(zhí)行時間T(NP)和T(REMAIN)的值,當(dāng)T(NP)≤T(REMAIN)的時候,進(jìn)程才被允許進(jìn)入臨界區(qū),否則進(jìn)程進(jìn)入工作隊列等待下一次判斷。



本文嘗試用數(shù)學(xué)方法來分析采用這種機(jī)制對實(shí)時性能的提高。首先給出一個定義:當(dāng)預(yù)定在時刻t時執(zhí)行的實(shí)時任務(wù)推遲到時刻t‘時才執(zhí)行,則t‘-t稱作系統(tǒng)延遲,用Lat(OS)表示。在普通Linux中,Lat(OS)如下:

Lat(OS)=T(NP)+ T(SHED)

設(shè)任意時刻 ,T(NP)≤T(REMAIN)的機(jī)率為ρ,則普通Linux中的平均Lat(OS)為

AvLat(OS)=ρ[T(NP)+ T(SHED)] +(1-ρ)[T(NP)+ 2T(SHED)]

引入前述機(jī)制后,由于總是優(yōu)先保證實(shí)時任務(wù)的執(zhí)行,Lat(RT-OS)固定式為:

Lat(RT-OS)=T(SHED)

采用該機(jī)制前后系統(tǒng)廷遲的變化為

δ=AvLat(NOR-OS)-Lat(RT-OS)=T(NP)+(2-ρ)T(SHED)

在一個特定系統(tǒng)里,ρ是固定的,而在Linux 2.6中,采用O(1)算法后T(SHED)也是固定的,由前式可得出結(jié)論:在臨界區(qū)的進(jìn)程執(zhí)行時間長的系統(tǒng)中,引入該機(jī)制前后平均系統(tǒng)廷遲下降的越大,系統(tǒng)實(shí)時性能的改善越明顯。

3.2 優(yōu)先級量頂

試描述一個如下場景:低優(yōu)先級的任務(wù)L和高優(yōu)先級H任務(wù)需要占用同一共享資源,低優(yōu)先級任務(wù)開始后不久,高優(yōu)先級任務(wù)也準(zhǔn)備就緒,發(fā)現(xiàn)所需共享資源被占用后,任務(wù)H被掛起,等待任務(wù)L結(jié)束釋放該資源。此時一個不需要該資源的中優(yōu)先級任務(wù)M 出現(xiàn),調(diào)度器依據(jù)優(yōu)先原則轉(zhuǎn)而執(zhí)行任務(wù)M。這就進(jìn)一步廷長了任務(wù)H的等待時間,如圖3所示。更加惡劣的情況是,如果出現(xiàn)了更多的類似任務(wù)M0,M1,M2,...,將有可能使任務(wù)H錯過臨界期限(Critical Deadline),而導(dǎo)致系統(tǒng)崩潰。

在一個不太復(fù)雜的實(shí)時系統(tǒng)中,可采用優(yōu)先級置頂?shù)姆椒ń鉀Q這一問題。該方案對每一個可能被共享的資源分配一個優(yōu)先級,該優(yōu)先級為有可能使用這個資源的最高優(yōu)先級的進(jìn)程的優(yōu)先級(如下偽代碼中的RESOURCE_X_PRIO)。由調(diào)度器將優(yōu)先級傳給使用該資源的進(jìn)程,進(jìn)程結(jié)束后其自身的優(yōu)先級(如下偽代碼中的TASK_A_PRIO)才恢復(fù)正常。這樣就避免了上面場景中任務(wù)L被任務(wù)M搶占,而導(dǎo)致任務(wù)H始終處于掛起狀態(tài)。優(yōu)先級置頂?shù)氖纠a如下:



 3.3 內(nèi)核線程

中斷服務(wù)程序(ISR)是不能被搶占的。一旦CPU 開始執(zhí)行ISR,除非程序結(jié)束,否則不可能轉(zhuǎn)而執(zhí)行其他的任務(wù)。Linux用自旋鎖(Spinlock)來實(shí)現(xiàn)ISR對CPU的獨(dú)占。采用了自旋鎖的ISR是不能進(jìn)入休眠的,而且此時系統(tǒng)的中斷也被完全禁止。內(nèi)核線程是由內(nèi)核創(chuàng)建和撤銷的,用來執(zhí)行一個指定的函數(shù)。內(nèi)核線程具有自己的內(nèi)核堆棧,能夠被單獨(dú)調(diào)用。我們用內(nèi)核線程代替ISR,并且用互斥量(Mutex)替換自旋鎖。內(nèi)核線程能夠進(jìn)入休眠,而且執(zhí)行時是不禁用外部中斷的。系統(tǒng)接到中斷信號后,喚醒相應(yīng)的內(nèi)核線程,內(nèi)核線程代替原來的ISR執(zhí)行完任務(wù)后繼續(xù)進(jìn)入休眠狀態(tài)。這樣中斷廷時就是可預(yù)測的,并且占用時間也很少。

根據(jù)LynuxWorks公司的測試數(shù)據(jù),在Pentium III 1GHz的PC上,Linux 2.4內(nèi)核的平均任務(wù)響應(yīng)時間為1133us,平均中斷響應(yīng)時間為252us;而Linux 2.6內(nèi)核的平均響應(yīng)時間為132us,平均中斷響應(yīng)時間僅為14us,比Linux 2.4內(nèi)核提高了一個數(shù)量級。在此基礎(chǔ)上,采用這種方法能夠針對具體的系統(tǒng)進(jìn)一步加快特定中斷的響應(yīng)時間,提高應(yīng)用系統(tǒng)的實(shí)時性能。

4 總結(jié)與展望

本文以Linux 2.6為基礎(chǔ)探討了提高Linux實(shí)時性的方法。引入了在實(shí)時系統(tǒng)中,只有當(dāng)進(jìn)入臨界區(qū)的進(jìn)程能在下一個實(shí)時任務(wù)開始之前結(jié)束時才被允許執(zhí)行的機(jī)制,保證實(shí)時任務(wù)總是優(yōu)先得到執(zhí)行;采用了優(yōu)先級置頂?shù)姆椒ū苊饬顺霈F(xiàn)優(yōu)先級倒置的情況;用內(nèi)核線程代替中斷服務(wù)程序,改變了了一般中斷服務(wù)程序執(zhí)行中不能進(jìn)入休眠狀態(tài)的情況,并且執(zhí)行時不禁用外部中斷,使系統(tǒng)的中斷廷時變得短小和可預(yù)測。本文所述方法的缺點(diǎn)在于,提高系統(tǒng)時鐘中斷頻率帶會增大系統(tǒng)開銷問題。為了在實(shí)時性能提升和系統(tǒng)開銷增大之間找到一個平衡點(diǎn),開發(fā)者不得不對具體系統(tǒng)做大量測試,具體問題具體分析,使得該方法在適用性上打了折扣。Linux因其免費(fèi)、性能強(qiáng)大、工具眾多的特點(diǎn),必將在嵌入式系統(tǒng)領(lǐng)域得到大量的應(yīng)用。我們應(yīng)該及時跟蹤國內(nèi)外Linux發(fā)展動態(tài),同時積累在此領(lǐng)域的開發(fā)經(jīng)驗(yàn),走出自己的路來。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉