1. gzyueqian
      13352868059

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

      更新時(shí)間: 2005-12-30 14:40:36來(lái)源: 粵嵌教育瀏覽量:3912

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

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

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

        基于uClinux的實(shí)時(shí)方案分析

        1.uClinux實(shí)時(shí)性缺陷

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

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

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

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

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

        2. uClinux實(shí)時(shí)解決方案

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

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

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

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

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

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

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

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

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

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

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

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

        2.RTHAL

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

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

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

        2.RTHAL作用

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

        A.實(shí)時(shí)模塊加載前

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

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

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

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

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

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

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

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

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

        static void linux_cli(void)

        {

        processor[hard_cpu_id()].intr_flag = 0;

        }

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

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

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

        A.Periodic模式

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

        B.Oneshot模式

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

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

        實(shí)驗(yàn)結(jié)果及結(jié)論

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

        本文小結(jié)

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

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

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

      
      

      1. 亚洲欧美在线视频播放 | 一区二区三区在线性爱视频 | 亚洲欧美网站在线观看 | 免费国产a深夜影院 | 亚洲一区日韩精品中文字幕亚洲 | 婷婷的五月天在线视频观看 |