熟女俱乐部五十路二区av,又爽又黄禁片视频1000免费,国产卡一卡二卡三无线乱码新区,中文无码一区二区不卡αv,中文在线中文a

新聞中心

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

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

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

本文引用地址:http://www.bjwjmy.cn/article/201610/305786.htm

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

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

strut timeval{

long tv_sec; //second

long tv_usec;//microsecond};

其中,gettimeofday()將當前時間保存在tv結構中,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);}

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

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

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

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

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

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

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

Lat(RT-OS)=T(SHED)

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

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

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

3.2 優(yōu)先級量頂

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

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

void task_a(void)

{……

set_task_priority(RESOURCE_X_PRIO);

…… //Accessing shared resource x

set_task_priority(TASK_A_PRIO);……}

3.3 內核線程

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

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

4 總結與展望

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



關鍵詞:

評論


相關推薦

技術專區(qū)

關閉