在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 應(yīng)用中的嵌入式Linux實(shí)時(shí)優(yōu)化

            應(yīng)用中的嵌入式Linux實(shí)時(shí)優(yōu)化

            作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò) 收藏
            中定義。當(dāng)前的Linux為大多數(shù)平臺(tái)定義的Hz值是100,亦即時(shí)鐘中斷周期是10ms。顯然這是達(dá)不到實(shí)時(shí)系統(tǒng)定時(shí)精度要求的。提高Hz值能夠帶來(lái)系統(tǒng)性能提升,但卻是以增加系統(tǒng)開銷為代價(jià)。這就必須仔細(xì)權(quán)衡實(shí)時(shí)性要求和系統(tǒng)開銷的平衡。一種方法是通過(guò)大量的測(cè)試確定的實(shí)時(shí)任務(wù)中斷請(qǐng)求發(fā)生的時(shí)間間隔和進(jìn)程在臨界區(qū)中的執(zhí)行時(shí)間,取一個(gè)稍大于大多數(shù)實(shí)時(shí)任務(wù)中斷間隔和臨界區(qū)執(zhí)行時(shí)間的數(shù)值。

            本文引用地址:http://www.biyoush.com/article/201610/305786.htm

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

            int gettimeofday(struct timeval *tv,struct timezone *tz);

            strut timeval{

            long tv_sec; //second

            long tv_usec;//microsecond};

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

            main()

            { struct timeval start_time,end_time;

            float time_uesd;

            gettimeofday(start_time,NULL);

            function_in_critical_setion();

            gettimeofday(end_time,NULL);

            time_used =1000000 (start_time.tv_sec-end_time.tv_sec)+(start_time.tv_usec-end_time.tv_usec);

            time_used/=1000000;

            exit(0);}

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

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

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

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

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

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

            引入前述機(jī)制后,由于總是優(yōu)先保證實(shí)時(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)

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

            3.2 優(yōu)先級(jí)量頂

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

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

            void task_a(void)

            {……

            set_task_priority(RESOURCE_X_PRIO);

            …… //Accessing shared resource x

            set_task_priority(TASK_A_PRIO);……}

            3.3 內(nèi)核線程

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

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

            4 總結(jié)與展望

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



            關(guān)鍵詞:

            評(píng)論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉