<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內核底層的臨界資源是不可搶占的,使用mutex替換spinlock的過(guò)程中,這部分可以保留,仍由不可搶占的 spinlock保護,如:保護硬件寄存器的鎖、調度器的運行隊列鎖等。不可搶占的spinlock被重新命名為raw_spinlock_t。 spin_lock被宏定義為:

#define spin_lock(lock) PICK_OP(raw_spinlock_t,spin,_lock,lock)

函數PICK_OP支持兩種鎖共存機制,PICK_OP在編譯階段將鎖操作轉化為mutex或者spinlock:

#define PICK_OP(type, optype, op, lock)

do {

if (TYPE_EQUAL((lock), type))

_raw_##optype##op((type *)(lock));

else if (TYPE_EQUAL(lock, spinlock_t))

//調用gcc的內嵌函數__builtin_types_compatible_p()

_spin##op((spinlock_t *)(lock));

else __bad_spinlock_type();

} while (0)

#define TYPE_EQUAL(lock, type)

__builtin_types_compatible_p(typeof(lock), type *)

gcc的內嵌函數__builtin_types_compatible_p用于判斷一個(gè)變量的類(lèi)型是否為某指定的類(lèi)型,如果類(lèi)型為 spinlock_t,將運行函數_spin_lock;類(lèi)型為raw_spinlock_t,將運行函數_raw_spin_lock。

實(shí)時(shí)rt_mutex在具體應用中,一個(gè)高優(yōu)先級任務(wù)搶占該鎖的同時(shí),把先前的鎖擁有者添加到互斥鎖等待隊列中,并在當前擁有該鎖的任務(wù) task_struct中標記等待該鎖的所有任務(wù);反之,不能得到該鎖就把當前任務(wù)添加到鎖的優(yōu)先級等待隊列中,直到喚醒執行。為了防止優(yōu)先級逆轉,可以改變鎖的當前擁有者的優(yōu)先級為鎖的等待隊列中任務(wù)的最高優(yōu)先級。

rt_mutex可以使高優(yōu)先級任務(wù)利用搶占鎖進(jìn)入臨界區,這樣內核不可搶占區的數量和范圍大大縮小,內核可搶占性有了很大的提高,且降低了實(shí)時(shí)高優(yōu)先級任務(wù)的搶占延遲,改善了系統的實(shí)時(shí)性能。

2.3 可搶占大內核鎖設計

大內核鎖BKL(Big Kernel Lock)實(shí)質(zhì)上也是spinlock,它用于保護整個(gè)內核,該鎖保持時(shí)間較長(cháng),對系統的實(shí)時(shí)性能影響很大[6]。采用Ingo Molnar的實(shí)時(shí)化方法,BKL使用semaphore實(shí)現,結構定義如下代碼:

struct semaphore {

atomic_t count;

struct rt_mutex lock; //實(shí)時(shí)互斥鎖的使用

};

由結構體發(fā)現,在BKL實(shí)現中利用了實(shí)時(shí)互斥鎖rt_mutex,在改進(jìn)后的spinlock結構體spinlock_t中也利用了實(shí)時(shí)互斥鎖 rt_mutex,因此可搶占大內核鎖和新的spinlock共用了低層的處理代碼。使用semaphore之后,大內核鎖就可搶占了。

3 內核實(shí)時(shí)性測試

針對Linux2.6內核,本文并沒(méi)有作出對內核調度算法的修正,只是探討了中斷運行機制、自旋鎖及大內核鎖技術(shù)在系統實(shí)時(shí)性能上的局限性,所以實(shí)驗測試主要測試中斷延遲時(shí)間和任務(wù)響應時(shí)間。實(shí)驗環(huán)境: Intel 2 GHz CPU,256 DDR內存,Kernel 2.6.22版本。測試結果如表1所示。
1.jpg

由表可知,在中斷服務(wù)程序中寫(xiě)入標記,測試中斷觸發(fā)至中斷服務(wù)程序執行平均響應時(shí)間,標準Linux2.6內核平均中斷響應時(shí)間為182 μs,改進(jìn)后Linux2.6內核為14 μs。采用開(kāi)源軟件LMbench3.0 測試系統任務(wù)調度延遲時(shí)間,標準Linux2.6內核平均任務(wù)響應時(shí)間為1 260 μs,改進(jìn)后Linux2.6內核為162μs。由此可見(jiàn),改進(jìn)策略在一定程度上大大減小了中斷延遲和任務(wù)調度時(shí)間,有利于改善移動(dòng)機器人任務(wù)處理的實(shí)時(shí)性能。

本文基于Linux2.6內核的關(guān)中斷、中斷優(yōu)先級、內核的不可搶占性以及大內核鎖保持時(shí)間過(guò)長(cháng)等問(wèn)題進(jìn)行了實(shí)時(shí)性分析,提出了相應的改進(jìn)方法。利用中斷線(xiàn)程化、互斥鎖的應用及大內核鎖的改進(jìn)等技術(shù)提高了系統的實(shí)時(shí)性能,降低了內核中斷延遲和調度延遲。改進(jìn)后的內核在移動(dòng)機器人控制器平臺中有很好的應用價(jià)值,提高了機器人控制的實(shí)時(shí)性能。

本文引用地址:http://dyxdggzs.com/article/151096.htm
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>