<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

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

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

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

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

1.2 現存增強Linux內核實(shí)時(shí)性的技術(shù)

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

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

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

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

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

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

void __init init_hardirqs(void)

{ ……

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

//對于每一個(gè)中斷建立一個(gè)中斷線(xiàn)程

irq_desc_t *desc = irq_desc + i;

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

//有IRQ_NODELAY標志的中斷不允許線(xiàn)程化

desc->thread = kthread_create(do_irqd,

desc, IRQ %d, irq); //建立線(xiàn)程

……

}

}

static int do_irqd(void * __desc)

//分配中斷線(xiàn)程優(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操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

上一頁(yè) 1 2 3 下一頁(yè)

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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>