1. gzyueqian
      18078865874
      首頁 > 新聞中心 > > 正文

      采用雙內(nèi)核機(jī)制基于uClinux的實時操作系統(tǒng)分析與實現(xiàn)

      更新時間: 2005-12-30 14:40:36來源: 粵嵌教育瀏覽量:4037

        引言:本文提出了一種基于uClinux的實時操作系統(tǒng),在對于資源要求苛刻而應(yīng)用場合多變的嵌入式領(lǐng)域很有優(yōu)勢。該系統(tǒng)采用了雙內(nèi)核機(jī)制、借助實時硬件抽象層(RTHAL)概念、利用模塊動態(tài)加載,對普通uClinux進(jìn)行了實時性改進(jìn),實驗表明完全滿足實時系統(tǒng)的時限約束。

        嵌入式Linux以代碼開放、價格低廉、功能強(qiáng)大又易于移植的特性正在被廣泛應(yīng)用,為嵌入式操作系統(tǒng)提供了一個極具吸引力的選擇。uClinux是專門針對無存儲器管理單元(MMU)處理器設(shè)計的嵌入式Linux,非常適合中低端嵌入式系統(tǒng)的需求,在工業(yè)控制領(lǐng)域有著廣闊的應(yīng)用前景。

        但許多實際應(yīng)用要求對外部事件在限定的時間內(nèi)做出反應(yīng),而普通uClinux并不是一種實時操作系統(tǒng),所以本文提出了一種基于uClinux的實時性解決方案,經(jīng)測試可以嚴(yán)格滿足實時應(yīng)用的時限約束,有良好的應(yīng)用價值。

        基于uClinux的實時方案分析

        1.uClinux實時性缺陷

        uClinux雖然符合POSIX1003.1b關(guān)于實時擴(kuò)展部分的標(biāo)準(zhǔn),例如支持SCHED_FIFO和SCHED_RR實時調(diào)度策略、實時信號等實時功能,但由于其初的設(shè)計目標(biāo)為通用分時操作系統(tǒng),因此在實時性支持方面,uClinux仍存在如下缺陷:

        a.非搶占式內(nèi)核。uClinux有用戶態(tài)和核心態(tài)兩種模式,當(dāng)進(jìn)程運(yùn)行在用戶態(tài)時,可以被優(yōu)先級更高的進(jìn)程搶占;在內(nèi)核中,一個進(jìn)程可以通過schedule()函數(shù)自愿地啟動一次調(diào)度。除此之外,非自愿的強(qiáng)制調(diào)度只能發(fā)生在每次從系統(tǒng)調(diào)用返回前,或每次從中斷或異常處理返回到用戶空間前。

        B.公平的調(diào)度算法。普通uClinux作為一個分時系統(tǒng),其調(diào)度算法的目標(biāo)是提供一種公平的調(diào)度機(jī)制,平衡系統(tǒng)響應(yīng)時間和吞吐量,這與實時應(yīng)用要求的低延遲和高度的可預(yù)測性相矛盾。實時操作系統(tǒng)必須保證目前運(yùn)行的任務(wù)的優(yōu)先級是可運(yùn)行任務(wù)中的。

        C.頻繁地關(guān)中斷操作。uClinux為了保證核心數(shù)據(jù)的完整性,在對關(guān)鍵數(shù)據(jù)結(jié)構(gòu)進(jìn)行修改前,通常采用"關(guān)中斷"的方式。而非周期實時任務(wù)大多是由中斷作出響應(yīng),周期性實時任務(wù)也需要調(diào)度模塊來調(diào)度運(yùn)行,而調(diào)度模塊的執(zhí)行也要由時鐘中斷觸發(fā)。所以,頻繁的關(guān)中斷會導(dǎo)致實時任務(wù)不能被及時調(diào)度執(zhí)行。

        D.時鐘粒度粗糙。時鐘管理是操作系統(tǒng)的脈搏,是進(jìn)程調(diào)度的重要依據(jù)。普通uClinux的時鐘粒度被設(shè)置為10ms,而實時應(yīng)用一般都需要微秒級的響應(yīng)精度。

        2. uClinux實時解決方案

        uClinux支持硬實時性的策略有以下兩種:

        a. 直接修改內(nèi)核法

        將內(nèi)核中的進(jìn)程調(diào)度、中斷處理、時鐘等部分遵循POSIX標(biāo)準(zhǔn)進(jìn)行改寫,在源代碼級的基礎(chǔ)上使uClinux變成一個實時操作系統(tǒng)。這種策略雖然可以獲得高的執(zhí)行效率,但實現(xiàn)難度大、周期比較長,而且對原有內(nèi)核太強(qiáng)的依賴性使得升級工作繁重而不方便。

        b. 雙內(nèi)核方法

        在同一硬件平臺上采用了兩個相互配合、共同工作的系統(tǒng)內(nèi)核,一個內(nèi)核提供精確的實時多任務(wù)管理,另一個內(nèi)核提供復(fù)雜的非實時通用功能。由于uClinux支持內(nèi)核模塊動態(tài)加載,因此實時內(nèi)核可在需要時以模塊的形式載入。雙內(nèi)核機(jī)制避免了大規(guī)模結(jié)構(gòu)改造,以較小的代價提供了強(qiáng)實時性,新系統(tǒng)可使用幾乎所有常規(guī)uClinux操作系統(tǒng)提供的功能。

        本文提出的嵌入式實時操作系統(tǒng)采用雙內(nèi)核的設(shè)計思想,在普通uClinux基礎(chǔ)上,通過增加一個實時內(nèi)核實現(xiàn)了調(diào)度的可搶占性,同時在系統(tǒng)中實現(xiàn)了硬件抽象層RTHAL,避免了頻繁關(guān)中斷所導(dǎo)致的實時任務(wù)不能被及時調(diào)度執(zhí)行的缺陷。,對系統(tǒng)時鐘進(jìn)行了改進(jìn),滿足了實時應(yīng)用微秒級的響應(yīng)精度。

        基于uClinux的實時操作系統(tǒng)設(shè)計

        1. 搶占式實時內(nèi)核

        實時內(nèi)核完全掌握了硬件層,而把非實時內(nèi)核作為一個優(yōu)先級的普通任務(wù)運(yùn)行于自己之上。實時內(nèi)核采用了搶占式調(diào)度算法,非實時內(nèi)核也通過RTHAL獲得實時內(nèi)核所用的替代函數(shù),這就為應(yīng)用雙內(nèi)核機(jī)制實現(xiàn)可搶占式內(nèi)核奠定了基礎(chǔ)。

        實時內(nèi)核將各種功能以模塊形式實現(xiàn),在系統(tǒng)運(yùn)行時可以方便地加載、卸載,從而大大減少核心代碼的規(guī)模,節(jié)省內(nèi)核空間并方便進(jìn)行動態(tài)配置。圖1是雙內(nèi)核結(jié)構(gòu)的嵌入式實時uClinux的體系結(jié)構(gòu)圖。可以看出,在RTHAL架構(gòu)下實時內(nèi)核主要由中斷分發(fā)器和實時調(diào)度器構(gòu)成,這是實時內(nèi)核基本的功能。同時還將實時SHM、實時FIFO、RTCOM和SFLIB設(shè)計成模塊的形式,可以靈活地根據(jù)應(yīng)用需求進(jìn)行加載。

        實時SHM和實時FIFO是實時內(nèi)核任務(wù)和非實時內(nèi)核任務(wù)之間的通信橋梁。SFLIB是浮點運(yùn)算軟件模擬的功能模塊,為了解決處理器不支持內(nèi)核浮點運(yùn)算而設(shè)計的。RTCOM則可以提供實時串口通信功能。

        搶占式內(nèi)核提供多種實時調(diào)度策略,包括FIFO、RR、RM、EDF算法,同時還允許使用者根據(jù)應(yīng)用需要編寫自己的調(diào)度算法。任務(wù)調(diào)度的時機(jī)有兩種,一種是主動調(diào)度,即在程序中主動調(diào)用rt_schedule()函數(shù)來讓出運(yùn)行權(quán);另一種是被動調(diào)度,即在時鐘中斷處理函數(shù)rt_timer_handler()中進(jìn)行調(diào)度。以上兩個函數(shù)的算法基本相同,故僅給出rt_schedule()的流程圖(圖2)。

        2.RTHAL

        從Linux2.1版開始提出了實時硬件抽象層(RTHAL)的概念,而uClinux本身并不具有RTHAL。這里借鑒RTHAL的思想,對uClinux核心進(jìn)行改動,將其與中斷控制器隔離,核心中的所有中斷操作指令都被替換成相應(yīng)的宏。可以簡單地理解為,這時的開中斷、關(guān)中斷指令實際上僅僅變更一個中斷狀態(tài)標(biāo)志的值,并不真正改變中斷狀態(tài)。通過RTHAL這一機(jī)制,避免了頻繁關(guān)中斷所導(dǎo)致的實時任務(wù)不能被及時調(diào)度執(zhí)行的缺陷。

        1.RTHAL數(shù)據(jù)結(jié)構(gòu)

        將所有需要的內(nèi)部數(shù)據(jù)及函數(shù)的指針集成為一個結(jié)構(gòu)體RTHAL,這樣就能方便地捕獲全部與實時應(yīng)用緊密相關(guān)的內(nèi)核函數(shù)。當(dāng)需要響應(yīng)硬實時事件時,實時內(nèi)核可以動態(tài)地把這些函數(shù)切換到相應(yīng)的軟件模擬函數(shù)上。

        2.RTHAL作用

        為了更好地說明RTHAL的作用,下面詳細(xì)說明實時模塊加載前后內(nèi)核所發(fā)生的變化。

        A.實時模塊加載前

        首先解釋一下硬件支撐層(HSL)的概念:在linux代碼樹中HSL一般是由匯編語言編寫的與底層硬件密切相關(guān)的部分,它的作用是在中斷發(fā)生時保存現(xiàn)場并跳轉(zhuǎn)到內(nèi)核中相應(yīng)的中斷處理函數(shù)入口,在中斷返回時恢復(fù)現(xiàn)場,同時還起著進(jìn)程切換的作用。

        如圖3所示,改動前uClinux內(nèi)核可以通過開/關(guān)中斷操作直接打開或關(guān)閉所有中斷,也可以通過屏蔽/解屏蔽操作關(guān)閉和打開特定的中斷。由于中斷處理、系統(tǒng)調(diào)用和異常處理需要經(jīng)常關(guān)閉中斷,頻繁的關(guān)中斷會導(dǎo)致實時任務(wù)不能被及時調(diào)度執(zhí)行,從而使系統(tǒng)響應(yīng)時間增長,實時性降低。

        這時uClinux直接與硬件層打交道,例如關(guān)中斷指令cli的宏定義為:

        #define __cli() __asm__ __volatile__("cli": : :"memory")

        即uClinux內(nèi)核直接通過cli匯編指令控制硬件。

        B.實時內(nèi)核加載后

        當(dāng)系統(tǒng)實現(xiàn)了RTHAL后,如圖4所示,uClinux的開/關(guān)中斷操作被分別指向RTHAL的disint( )和enint( )函數(shù)。disint( )指向?qū)崟r模塊的_linux _cli( )函數(shù),作用是設(shè)置中斷標(biāo)志位為關(guān)中斷狀態(tài);enint( )函數(shù)指向?qū)崟r模塊的_linux_sti( )函數(shù),作用是設(shè)置中斷標(biāo)志位為開中斷狀態(tài),并處理掛起的uClinux中斷請求;而屏蔽/解屏蔽操作被分別指向?qū)崟r模塊的linux_irq_mask( )函數(shù)和linux_irq_unmask()函數(shù)。

        當(dāng)中斷通過HSL調(diào)用RTHAL中的do_IRQ( )函數(shù),這個函數(shù)指向?qū)崟r模塊的dispatch_irq( )函數(shù)。其作用是判斷當(dāng)前中斷是否是實時中斷,如果是實時中斷,則實時模塊處理這個中斷;如果是非實時的,則將這個中斷掛到uClinux中斷請求隊列中,由uClinux內(nèi)核的來處理非實時中斷。

        例如,linux_cli()函數(shù)在加載實時內(nèi)核后被改寫為:

        static void linux_cli(void)

        {

        processor[hard_cpu_id()].intr_flag = 0;

        }

        即當(dāng)uClinux要關(guān)中斷時,實時模塊的處理只是僅僅設(shè)置了中斷標(biāo)志位,并沒有真正的去關(guān)硬件中斷。由此,實時模塊實現(xiàn)了對硬件層的接管,而把非實時內(nèi)核作為一個優(yōu)先級的普通任務(wù)運(yùn)行,這樣就可以充分保證實時中斷的及時響應(yīng),從而保證了系統(tǒng)的實時性。

        3. 細(xì)粒度時鐘的實現(xiàn)

        對于時鐘機(jī)制的改造,可以通過提高系統(tǒng)時鐘精度來增強(qiáng)系統(tǒng)的實時性,特別是對外部中斷的響應(yīng)。在系統(tǒng)中引入兩種定時器模式:Periodic(周期性)和Oneshot(一次性)。

        A.Periodic模式

        對于周期性實時任務(wù)應(yīng)用這種模式,只需要在初始化時對定時器進(jìn)行設(shè)置,保證了處理效率。

        B.Oneshot模式

        對于非周期實時任務(wù)應(yīng)用這種模式。在任何時刻,時鐘的下一次中斷間隔由所有定時器中到期早的一個來決定。一旦定時器到期,內(nèi)核便能夠立刻響應(yīng),因此內(nèi)核的響應(yīng)開銷只由中斷服務(wù)的時間所決定,大約只有幾個微秒。

        在i386體系結(jié)構(gòu)中,有TSC(時間標(biāo)簽計數(shù)器)計數(shù)器,這個計數(shù)器是64位的寄存器,可以精確到1/主頻。在s3c4510b處理器上沒有這個寄存器,但精確計時又是必要的,為了解決這一問題,可以采用計時器2(timer1)來模擬TSC的功能。每來一個時鐘脈沖,timer1的TCNT1寄存器減1,減到零后產(chǎn)生時鐘中斷,再從TDATA1中讀TCNT1的值,往復(fù)運(yùn)行。由于TCNT1寄存器僅32位,s3c4510b的主頻為50MHz,置TDATA的值為0xffffffff時,僅運(yùn)行8分多鐘就溢出了。于是設(shè)置一個32位全局變量tsc.hltsc,timer1每次中斷到來時將這個全局變量加1,為了使系統(tǒng)更精確,必須將timer1中斷設(shè)置為優(yōu)先級,這樣就可以模擬64位的TSC寄存器。

        實驗結(jié)果及結(jié)論

        該系統(tǒng)平臺為:以ARM7TDMI為核心的Samsung4510B處理器、2M閃存和16M RAM,處理器運(yùn)行頻率為50MHz。經(jīng)驗證,未加載實時內(nèi)核前,中斷延遲雖大多數(shù)在30us(1500個時鐘脈沖@50MHz)以下,但是并不十分穩(wěn)定,有時超過200us(10000時鐘脈沖@50MHz),的甚至達(dá)到430us(21525個時鐘脈沖@50MHz)。實時系統(tǒng)以中斷延遲作為衡量指標(biāo),因此這對于實時應(yīng)用來講是不能忍受的。加載了實時模塊后,中斷延遲時間大約為10us~30us,而且結(jié)果十分穩(wěn)定,完全滿足實時系統(tǒng)的相關(guān)要求。

        本文小結(jié)

        本文提出的嵌入式實時操作系統(tǒng)采用雙內(nèi)核機(jī)制、實現(xiàn)了RTHAL的概念,使得直接修改內(nèi)核的部分減至小。同時實時內(nèi)核充分利用模塊動態(tài)加載機(jī)制,在系統(tǒng)運(yùn)行時方便地加添加、刪除各個功能模塊,從而大大減少核心代碼的規(guī)模、節(jié)省內(nèi)核空間、方便進(jìn)行動態(tài)配置,對于資源要求苛刻而應(yīng)用場合多變的嵌入式領(lǐng)域很有優(yōu)勢。

      免費(fèi)預(yù)約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲精品高清Av在线播放 | 在线免费在线观看的a | 亚洲精品第一国产野狼 | 在线a天堂亚洲 | 亚洲中文自拍另类 | 亚洲尤物精品自产拍在线观看 |