《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 業(yè)界動(dòng)態(tài) > 面向多媒體應(yīng)用的嵌入式Linux實(shí)時(shí)性研究

面向多媒體應(yīng)用的嵌入式Linux實(shí)時(shí)性研究

2008-06-10
作者:王建強(qiáng)1,,陳建安1,,劉鑰婷2

  摘 要: 首先對(duì)Linux系統(tǒng)的實(shí)時(shí)機(jī)制作了分析,然后根據(jù)多媒體應(yīng)用" title="多媒體應(yīng)用">多媒體應(yīng)用的特點(diǎn),,通過改進(jìn)Linux系統(tǒng)的實(shí)時(shí)性" title="實(shí)時(shí)性">實(shí)時(shí)性,,構(gòu)建了面向多媒體應(yīng)用的嵌入式" title="的嵌入式">的嵌入式Linux系統(tǒng),。實(shí)驗(yàn)結(jié)果表明,該系統(tǒng)在實(shí)時(shí)性方面完全可以滿足多媒體應(yīng)用的需求,。
  關(guān)鍵詞: 嵌入式系統(tǒng) 實(shí)時(shí)性 Linux 多媒體應(yīng)用


  當(dāng)今信息社會(huì),,以多媒體為特征的信息技術(shù)和信息產(chǎn)業(yè)的發(fā)展及應(yīng)用對(duì)人類社會(huì)產(chǎn)生的影響和作用愈來愈明顯,愈來愈重要,。多媒體技術(shù)的發(fā)展在很大程度上依賴于多媒體軟件開發(fā)的水平,。目前不管是支撐多媒體的系統(tǒng)軟件,還是應(yīng)用軟件,,都在能力和數(shù)量上難以滿足多媒體飛速發(fā)展的需要,。特別是多媒體系統(tǒng)軟件的缺乏,一直是制約多媒體產(chǎn)業(yè)發(fā)展的瓶頸問題之一,。
  Linux從1991年誕生之日起至今不過十來年,,卻已發(fā)展成為一個(gè)功能強(qiáng)大、設(shè)計(jì)完善的操作系統(tǒng),。在嵌入式領(lǐng)域,,Linux同樣獲得了飛速發(fā)展。Linux具有以下特點(diǎn):
  (1)Linux操作系統(tǒng)的開放源碼易于定制剪裁,,在價(jià)格上有竟?fàn)幜Γ?BR>  (2)Linux操作系統(tǒng)的內(nèi)核小,、功能強(qiáng)大、運(yùn)行穩(wěn)定,、系統(tǒng)強(qiáng)壯,、效率高;
  (3)Linux操作系統(tǒng)不僅支持X86 CPU,,還可以支持其他數(shù)十種CPU芯片,;
  (4)Linux支持所有標(biāo)準(zhǔn)的因特網(wǎng)協(xié)議,幾乎所有的協(xié)議和網(wǎng)絡(luò)接口都定制在其中,。
  因此,,Linux系統(tǒng)是多媒體終端操作系統(tǒng)的首選,。
1 通用Linux實(shí)時(shí)性分析及其在實(shí)時(shí)性方面的不足
  雖然目前Linux內(nèi)核在實(shí)時(shí)性方面有所增強(qiáng),但由于Linux系統(tǒng)本身是一個(gè)面向桌面的系統(tǒng),,所以將它應(yīng)用于多媒體終端時(shí),,在實(shí)時(shí)性方面仍存在一些問題。
1.1 通用Linux系統(tǒng)的調(diào)度策略
  通用Linux系統(tǒng)支持實(shí)時(shí)和非實(shí)時(shí)兩種進(jìn)程,,實(shí)時(shí)進(jìn)程相對(duì)于普通進(jìn)程具有絕對(duì)的優(yōu)先級(jí),。對(duì)應(yīng)地,實(shí)時(shí)進(jìn)程采用SCHED_FIFO或者SCHED_RR調(diào)度策略" title="調(diào)度策略">調(diào)度策略,,普通的進(jìn)程采用SCHED_OTHER調(diào)度策略,。
  SCHED_OTHER調(diào)度策略本質(zhì)上是一種比例共享的調(diào)度策略,它的這種設(shè)計(jì)方法能夠保證進(jìn)程調(diào)度時(shí)的公平性:一個(gè)低優(yōu)先級(jí)的進(jìn)程在每一個(gè)epoch中也會(huì)得到自己應(yīng)得的那些CPU執(zhí)行時(shí)間,,另外它也提供了不同進(jìn)程的優(yōu)先級(jí)區(qū)分,,具有高priority值的進(jìn)程能夠獲得更多的執(zhí)行時(shí)間。
  對(duì)于實(shí)時(shí)進(jìn)程來說,,它們使用基于實(shí)時(shí)優(yōu)先級(jí)rt_priority的優(yōu)先級(jí)調(diào)度策略,,但根據(jù)不同的調(diào)度策略,同一實(shí)時(shí)優(yōu)先級(jí)的進(jìn)程之間的調(diào)度方法有所不同,。
  Linux調(diào)度時(shí),,要遍歷運(yùn)行隊(duì)列,對(duì)隊(duì)列中的每一個(gè)進(jìn)程計(jì)算goodness值,,goodness 最大的進(jìn)程將被選中運(yùn)行,。根據(jù)調(diào)度策略的不同,進(jìn)程的goodness值也要做不同的計(jì)算,。普通進(jìn)程的goodness值是在該進(jìn)程計(jì)數(shù)值counter基礎(chǔ)上略有浮動(dòng),,其范圍是0~999。實(shí)時(shí)進(jìn)程的goodness值是將該進(jìn)程實(shí)時(shí)優(yōu)先級(jí)rt_priority 加上1000,。所以實(shí)時(shí)進(jìn)程的goodness 總是大于非實(shí)時(shí)進(jìn)程,,從而保證了實(shí)時(shí)進(jìn)程的優(yōu)先調(diào)度權(quán)。函數(shù)goodness( )如下:
  static inline int goodness(struct task_struct*p,,int
  this_cpu,,struct mm_struct*this _ mm)
  {int weight,;
  weight=-1,;
  if(P->policy&SCHED_YIELD) goto out;/*非實(shí)時(shí)進(jìn)程*/
  if (p-> policy= =SCHED_OTHER)
  { weight=p一>counter,;
  if(! weight)goto out,;
  if(P一>mm= =this _ mm!!!p一>mm)
  weight +=1;
  weight +=20一P一>nice,;
  goto out,;
  }/*軟實(shí)時(shí)進(jìn)程*/
  weight= 1000+P一>rt_priority;
  goto out;
  return weight,;
  }一
  從上面的goodness()函數(shù)可以看出普通Linux內(nèi)核的進(jìn)程調(diào)度算法只是軟實(shí)時(shí)的,,并不是硬實(shí)時(shí)的。
1.2 通用Linux實(shí)時(shí)性方面的缺陷
  (1)Linux系統(tǒng)中的調(diào)度單位為10ms,,所以它不能夠提供精確的定時(shí),;
  (2)當(dāng)一個(gè)進(jìn)程調(diào)用系統(tǒng)調(diào)用進(jìn)入內(nèi)核態(tài)運(yùn)行時(shí),它是不可被搶占的,;
  (3)Linux內(nèi)核實(shí)現(xiàn)使用了大量的封中斷操作會(huì)造成中斷的丟失,;
  (4)由于使用虛擬內(nèi)存技術(shù),當(dāng)發(fā)生頁出錯(cuò)時(shí),,需要從硬盤中讀取交換數(shù)據(jù),,但硬盤讀寫由于存儲(chǔ)位置的隨機(jī)性會(huì)導(dǎo)致隨機(jī)的讀寫時(shí)間,這在某些情況下會(huì)影響一些實(shí)時(shí)任務(wù)的截止期限,;
  (5)雖然Linux進(jìn)程調(diào)度也支持實(shí)時(shí)優(yōu)先級(jí),,但缺乏有效的實(shí)時(shí)任務(wù)調(diào)度" title="任務(wù)調(diào)度">任務(wù)調(diào)度機(jī)制和調(diào)度算法;其網(wǎng)絡(luò)子系統(tǒng)的協(xié)議處理和其他設(shè)備的中斷處理都沒有與它對(duì)應(yīng)的進(jìn)程的調(diào)度關(guān)聯(lián)起來,,并且其自身也沒有明確的調(diào)度機(jī)制,。
2 面向多媒體應(yīng)用的Linux實(shí)時(shí)性改進(jìn)
  提高Linux的實(shí)時(shí)性一般有兩種方法:一種是對(duì)普通的Linux內(nèi)核的數(shù)據(jù)結(jié)構(gòu)、調(diào)度函數(shù),、中斷方式等進(jìn)行修改,,使其能夠處理實(shí)時(shí)進(jìn)程。另一種是在Linux內(nèi)核之外,,進(jìn)行實(shí)時(shí)性擴(kuò)展,。也就是在普通Linux的基礎(chǔ)之上再設(shè)計(jì)一個(gè)用于專門處理實(shí)時(shí)進(jìn)程的內(nèi)核。為了提高Linux的實(shí)時(shí)性,,并且使之能夠更好地滿足多媒體應(yīng)用系統(tǒng)的需求,,本文采用第一種方法來提高系統(tǒng)的實(shí)時(shí)性。
2.1 提高系統(tǒng)所支持的時(shí)鐘精度
  為了提高Linux系統(tǒng)的實(shí)時(shí)特性,,必須提高系統(tǒng)所支持的時(shí)鐘精度,。但如果僅僅簡單地提高時(shí)鐘頻率,會(huì)引起調(diào)度負(fù)載的增加,,從而嚴(yán)重降低系統(tǒng)的性能,。為了解決這個(gè)矛盾, 本文將時(shí)鐘芯片設(shè)置為單次觸發(fā)狀態(tài),,即每次給時(shí)鐘芯片設(shè)置一個(gè)超時(shí)時(shí)間,,然后到該超時(shí)事件發(fā)生時(shí)在時(shí)鐘中斷處理程序中再次根據(jù)需要給時(shí)鐘芯片設(shè)置一個(gè)超時(shí)時(shí)間。其基本思想是:一個(gè)精確的定時(shí)意味著時(shí)鐘中斷在一個(gè)比較精確的時(shí)間發(fā)生,,但并非一定需要系統(tǒng)時(shí)鐘頻率達(dá)到此精度,。它利用CPU的時(shí)鐘計(jì)數(shù)器來提供精度可達(dá)CPU主頻的時(shí)間精度,。
2.2 可搶占式內(nèi)核設(shè)計(jì)
  (1)搶占式內(nèi)核給task struct數(shù)據(jù)結(jié)構(gòu)增加一個(gè)數(shù)據(jù)項(xiàng):preempt_count。該數(shù)據(jù)項(xiàng)由宏preempt_disable(),、preempt_enable(),、以及preempt_enable_no_resched()所使用。preempt_disable對(duì)preempt_count計(jì)數(shù)進(jìn)行遞增,,preempt_enable對(duì)preempt_count進(jìn)行遞減,。preempt_enable宏查看當(dāng)前進(jìn)程的preempt_count和need_resched域的內(nèi)容,如果 preempt_count為0并且need_resched為1,,則調(diào)用preempt_schedule()函數(shù),。該函數(shù)將給當(dāng)前進(jìn)程的preempt_count項(xiàng)增加一個(gè)很大的值,然后調(diào)用進(jìn)程調(diào)度函數(shù)schedule(),,在schedule函數(shù)返回后從該進(jìn)程preempt_count中再減去該值,,從而實(shí)現(xiàn)內(nèi)核可搶占。
  (2)修改schedule函數(shù),,使它檢測進(jìn)程的preempt_co-unter是否很大(這是為了屏蔽一些普通調(diào)度流程中對(duì)于搶占式調(diào)度來說是冗余的那些操作),,然后執(zhí)行搶占式調(diào)度。同時(shí)修改spinlock的代碼,。在spin_lock()和spin_try_lock中增加了對(duì)于preempt_disable的調(diào)用,,在spin_unlock()中增加了對(duì)于preempt_enable的調(diào)用。修改中斷返回的代碼,,在其中增加了對(duì)于preempt_enable的調(diào)用,。
  由以上可看出內(nèi)核的搶占式調(diào)度發(fā)生在如下情況:在釋放spinlock時(shí),或者當(dāng)中斷返回時(shí),,如果當(dāng)前執(zhí)行進(jìn)程的need_resched被標(biāo)記,,則進(jìn)行搶占式調(diào)度。
2.3 實(shí)時(shí)任務(wù)調(diào)度的實(shí)現(xiàn)
  在任務(wù)切換方面限制Linux不能進(jìn)入RTOS行列的主要原因是:內(nèi)核無法及時(shí)進(jìn)行進(jìn)程調(diào)度,,即任務(wù)調(diào)度器schedule()函數(shù)不能及時(shí)被執(zhí)行,;當(dāng)中斷返回到內(nèi)核態(tài)時(shí),Linux內(nèi)核禁止進(jìn)行進(jìn)程調(diào)度,,只有中斷返回到用戶態(tài)時(shí),,Linux內(nèi)核才允許進(jìn)行進(jìn)程調(diào)度。針對(duì)這兩點(diǎn),,對(duì)Linux內(nèi)核的相關(guān)函數(shù)作如下修改:
  (1)當(dāng)系統(tǒng)從中斷返回到內(nèi)核態(tài)時(shí),,強(qiáng)制調(diào)用調(diào)度函數(shù)preemp_schedule(),為此,,在arch/i386/kernel/Entry.S中修改如下代碼:
  ……
  #ifdef CONFIG PREEMPT
  cli
  decl preempt count(%ebx)/*恢復(fù)內(nèi)核搶占標(biāo)志*/
  #endif
  ……
  incl preempt count(%ebx)
  sti
  call SYMBOL_ NAME(preempt_schedule)
  jmp ret_from_intr/*新進(jìn)程返回ret_from_intr恢復(fù)搶占標(biāo)志后再返回*/
  ……
  (2)對(duì)于內(nèi)核態(tài)搶占的任務(wù)不要從運(yùn)行隊(duì)列刪除,,為此需要對(duì)文件kernel/schedule.c作修改,,關(guān)鍵代碼如下:
  ……
  #ifdef CONFIG PREEMPT
  ctx_sw_off(),;/*加鎖,,禁止內(nèi)核搶占*/
  #endif
  ……
  #ifdef CONFIG_PREEMPT
  if(prev->state & TASK_PREEMPTED)
  break;/*如果是內(nèi)核搶占調(diào)度,則保留運(yùn)行隊(duì)列*/
  #endif
  ……
  #ifdef CONFIG PREEMPT
  ctx_sw_on_no_preempt(),;/*解鎖,,允許內(nèi)核搶占*/
  #endif
  ……
  這樣可以解決當(dāng)中斷返回到內(nèi)核態(tài)時(shí),Linux內(nèi)核禁止進(jìn)行進(jìn)程調(diào)度,,只有中斷返回到用戶態(tài)時(shí),,Linux內(nèi)核才允許進(jìn)行進(jìn)程調(diào)度的問題,從而增強(qiáng)了任務(wù)調(diào)度的實(shí)時(shí)性,。
3 嵌入式Linux實(shí)時(shí)性能測試結(jié)果
  測試工具:Linux Trace ToolKit-0.8
  測試環(huán)境:Intel Celeron 1.2GHz CPU,、256MB SDRAM,通用Linux為Red Hat9.0,RT-Linux為3.0版,,Media-Linux即為本文實(shí)現(xiàn)的嵌入式Linux,。
  測試結(jié)果如表1所示。


  可以看出,,本文構(gòu)建的Linux系統(tǒng)的任務(wù)響應(yīng)時(shí)間處于十微秒級(jí),,完全可以滿足多媒體應(yīng)用終端的實(shí)時(shí)性需求。
  根據(jù)多媒體應(yīng)用的特點(diǎn),,在盡可能地保證系統(tǒng)性能的前提下,,本文通過提高系統(tǒng)所支持的時(shí)鐘精度、設(shè)計(jì)可搶占式內(nèi)核,、增強(qiáng)實(shí)時(shí)任務(wù)調(diào)度改進(jìn)了通用Linux的實(shí)時(shí)性(關(guān)鍵部分給出了源代碼及數(shù)據(jù)結(jié)構(gòu)),。實(shí)驗(yàn)結(jié)果表明,該系統(tǒng)在實(shí)時(shí)性方面完全可以滿足多媒體終端應(yīng)用的需求,,具有較好的應(yīng)用前景,。
參考文獻(xiàn)
1 李善平,劉文峰,,李程遠(yuǎn).Linux內(nèi)核2.4版源代碼分析大全[M].北京:機(jī)械工業(yè)出版社,,2001
2 鄒思鐵.嵌入式Linux設(shè)計(jì)與應(yīng)用[M].北京:清華大學(xué)出版社,2002
3 Yaghmour K著,,韓存兵,,龔波譯.構(gòu)建嵌入式Linux系統(tǒng)[M].北京:中國電力出版社,2004
4 Jeffay K.Scheduling Sporadic Tasks with Shared Resources in Hard-Real-Time Systems[J].in Proc.Of the 13th Real-Time Systems Symposuim.Phoenix,,Arizona,,1992;(12)
5 Embedded Linux nears real time.http://www.edn.com/article/CA450620.html

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章,、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容,、版權(quán)和其它問題,,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟(jì)損失,。聯(lián)系電話:010-82306118;郵箱:[email protected],。