新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 嵌入式Linux下的實(shí)時性增強(qiáng)方案

嵌入式Linux下的實(shí)時性增強(qiáng)方案

作者: 時間:2011-01-13 來源:網(wǎng)絡(luò) 收藏

摘 要: 分析了Linux在實(shí)時性方面的不足,針對Linux2.6內(nèi)核的中斷運(yùn)行機(jī)制、內(nèi)核不可搶占性、自旋鎖及大內(nèi)核鎖等問題進(jìn)行研究,提出相應(yīng)的實(shí)時性改進(jìn)方法。測試表明,改進(jìn)后的Linux實(shí)時性效果較好。

Linux以其功能強(qiáng)大、源代碼開放、支持多種硬件平臺、模塊化設(shè)計方案以及豐富的開發(fā)工具支持等特點(diǎn)廣泛應(yīng)用在系統(tǒng)領(lǐng)域。作為嵌入式產(chǎn)品的操作系統(tǒng)平臺,具有較好的實(shí)時性、系統(tǒng)可靠性、任務(wù)處理隨機(jī)性是系統(tǒng)追求的目標(biāo),目前商業(yè)嵌入式操作系統(tǒng)實(shí)時性能可以滿足嵌入式領(lǐng)域的需求,但由于其價格昂貴,應(yīng)用受到了限制[1]。而嵌入式Linux以其非常低廉的價格,可以大大地降低成本,逐漸成為嵌入式操作系統(tǒng)的首選。但由于其在實(shí)時應(yīng)用領(lǐng)域的技術(shù)障礙,要應(yīng)用在嵌入式領(lǐng)域,還必須對Linux內(nèi)核作必要的改進(jìn)。本文以S3C2410+Linux作為移動機(jī)器人操作平臺,為了提高機(jī)器人任務(wù)處理的實(shí)時性,針對影響Linux OS實(shí)時性能的若干方面進(jìn)行研究,并利用相應(yīng)的解決方法基于標(biāo)準(zhǔn)Linux2.6內(nèi)核加以實(shí)現(xiàn),最后通過測試,驗(yàn)證了此改進(jìn)方法的效果。

1 Linux內(nèi)核實(shí)時性分析

1.1 Linux內(nèi)核制約實(shí)時性的因素

衡量操作系統(tǒng)實(shí)時性的指標(biāo)主要有中斷延遲和搶占延遲。嵌入式系統(tǒng)中很多實(shí)時任務(wù)是靠中斷驅(qū)動的,中斷事件必須在限定的時限內(nèi)處理,否則將產(chǎn)生災(zāi)難性的后果。大多數(shù)實(shí)時系統(tǒng)都是處理一些周期性的或非周期性的重復(fù)事件,事件產(chǎn)生的頻度就確定了任務(wù)的執(zhí)行時限,因此每次事件發(fā)生時,相應(yīng)的處理任務(wù)必須及時響應(yīng)處理,否則將無法滿足時限[2]。搶占延遲就反映了系統(tǒng)的響應(yīng)及時程度。針對Linux內(nèi)核,中斷關(guān)閉及中斷優(yōu)先級執(zhí)行機(jī)制、內(nèi)核不可搶占性、自旋鎖(spinlock)及大內(nèi)核鎖及一些O(n)的任務(wù)調(diào)度算法影響了系統(tǒng)的實(shí)時性能。

1.2 現(xiàn)存增強(qiáng)Linux內(nèi)核實(shí)時性的技術(shù)

多年來,Linux實(shí)時性改進(jìn)技術(shù)的發(fā)展主要有兩種技術(shù)方案:(1)直接修改Linux內(nèi)核。針對內(nèi)核數(shù)據(jù)結(jié)構(gòu)、調(diào)度函數(shù)、中斷方式進(jìn)行改動,重新設(shè)計一個由優(yōu)先級驅(qū)動的實(shí)時調(diào)度器,替換原有Linux內(nèi)核中的進(jìn)程調(diào)度器sched.c。這一方案主要是針對中斷機(jī)制、任務(wù)調(diào)度算法進(jìn)行改進(jìn)的,較為成功的案例為Kansas大學(xué)開發(fā)的Kurt-Linux。Kurt提高了Linux系統(tǒng)中的實(shí)時精度,將時鐘芯片設(shè)置為單觸發(fā)狀態(tài)。對于實(shí)時任務(wù)的調(diào)度,Kurt-Linux采用基于時間的靜態(tài)實(shí)時CPU調(diào)度算法。實(shí)時任務(wù)在設(shè)計階段就需要明確地說明其實(shí)時事件要發(fā)生的時間。這種調(diào)度算法對于那些循環(huán)執(zhí)行的任務(wù)能夠取得較好的調(diào)度效果;(2)在Linux內(nèi)核之外進(jìn)行實(shí)時性擴(kuò)展,添加一個實(shí)時內(nèi)核。實(shí)時內(nèi)核接管硬件所有中斷,并依據(jù)是否為實(shí)時任務(wù)給予響應(yīng)。Fsm Labs公司開發(fā)的RTLinux就是依據(jù)這種策略開發(fā)設(shè)計的[3]。以上論述的兩種技術(shù)方案有其可借鑒之處,但如果綜合考慮任務(wù)響應(yīng)、內(nèi)核可搶占性、實(shí)時調(diào)度策略等都將影響操作系統(tǒng)的實(shí)時性能,因此,這兩種技術(shù)還不能很好地滿足實(shí)時性要求。為了增強(qiáng)嵌入式Linux實(shí)時性能,下面將介紹中斷機(jī)制、內(nèi)核的搶占性以及大內(nèi)核鎖等相關(guān)問題。

2 Linux實(shí)時性改進(jìn)方法

Linux2.4及以前版本內(nèi)核是不可搶占的,在Linux2.6中,內(nèi)核已經(jīng)可以搶占,實(shí)時性有所增強(qiáng)。但是內(nèi)核中仍然有不可搶占的區(qū)域,如自旋鎖spinlock保護(hù)的臨界區(qū)等。另外,影響內(nèi)核實(shí)時性能的因素還有中斷運(yùn)行機(jī)制、大內(nèi)核鎖機(jī)制以及調(diào)度算法等。

2.1 中斷運(yùn)行機(jī)制改進(jìn)

在Linux標(biāo)準(zhǔn)內(nèi)核中,中斷是最高優(yōu)先級的執(zhí)行單元,硬件架構(gòu)決定了硬件中斷到來的時候在該中斷沒有被屏蔽的條件下必須處理。不管內(nèi)核當(dāng)時處理什么,即便是Linux中最高優(yōu)先級的實(shí)時進(jìn)程,只要有中斷發(fā)生,系統(tǒng)將立即響應(yīng)該事件并執(zhí)行相應(yīng)的中斷處理程序,這就大大削弱了Linux的實(shí)時性能。特別是系統(tǒng)有嚴(yán)重的網(wǎng)絡(luò)或I/O負(fù)載時,中斷將非常頻繁,實(shí)時任務(wù)將很難有機(jī)會運(yùn)行,這對于Linux的實(shí)時應(yīng)用來說是不可接受的。Linux采用的關(guān)中斷技術(shù)在關(guān)中斷區(qū)域使相應(yīng)實(shí)時任務(wù)得不到響應(yīng),增加了實(shí)時任務(wù)的中斷延遲。Linux實(shí)時化后自旋鎖變?yōu)榛コ怄i的技術(shù),但由于自旋鎖的中斷處理不能及時響應(yīng),降低了系統(tǒng)的實(shí)時性能。因此,借鑒Ingo Molnar實(shí)時補(bǔ)丁的實(shí)時化方法,采用中斷線程化技術(shù)改進(jìn)中斷運(yùn)行機(jī)制,中斷將作為內(nèi)核線程運(yùn)行而且賦予不同的實(shí)時優(yōu)先級,實(shí)時任務(wù)可以有比中斷線程更高的優(yōu)先級,這樣,實(shí)時任務(wù)就可以作為最高優(yōu)先級的執(zhí)行單元來運(yùn)行了,即使在嚴(yán)重負(fù)載下仍有實(shí)時性保證。另一方面,中斷處理線程也可以因?yàn)樵趦?nèi)核同步中得不到鎖而掛載到鎖的等待隊列中,很多關(guān)中斷就不必真正的禁止硬件中斷了,而是禁止內(nèi)核進(jìn)程搶占,從而減小了中斷延遲[4]。

在初始化階段,常規(guī)中斷初始化和中斷線程化的初始化在STart_kernel( )函數(shù)中都調(diào)用trap_init( )和init_IRQ( )兩個函數(shù)來初始化irq_desc_t結(jié)構(gòu)體,區(qū)別主要體現(xiàn)在內(nèi)核初始化創(chuàng)建init線程時,中斷線程化的中斷在init( )函數(shù)中還將調(diào)用init_hardirqs(kernel/irq/manage.c)來為每一個IRQ創(chuàng)建一個內(nèi)核線程,最高實(shí)時優(yōu)先級為50,依次類推直到25。因此,任何IRQ線程的最低實(shí)時優(yōu)先級為25,具體實(shí)現(xiàn)是通過kthread_create函數(shù)創(chuàng)建的。功能實(shí)現(xiàn)等同于如下代碼:

void __init init_hardirqs(void)

{ ……

for (i = 0; i NR_IRQS; i++) {

//對于每一個中斷建立一個中斷線程

irq_desc_t *desc = irq_desc + i;

if(desc->actiON !(desc->status IRQ_NODELAY))

//有IRQ_NODELAY標(biāo)志的中斷不允許線程化

desc->thread = kthread_create(do_irqd,

desc, IRQ %d, irq); //建立線程

……

}

}

static int do_irqd(void * __desc)

//分配中斷線程優(yōu)先級50~25

{ ……

/*Scale irq thread priorities from prio 50 to prio 25 */

param.sched_priority = curr_irq_prio;

if (param.sched_priority > 25)

curr_irq_prio = param.sched_priority - 1;

……

}

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

上一頁 1 2 3 下一頁

關(guān)鍵詞: 嵌入式

評論


相關(guān)推薦

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

關(guān)閉