<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于APIC時(shí)鐘的嵌入式Linux內(nèi)核實(shí)時(shí)化研究

          基于APIC時(shí)鐘的嵌入式Linux內(nèi)核實(shí)時(shí)化研究

          作者: 時(shí)間:2010-10-05 來源:網(wǎng)絡(luò) 收藏

          引言
          是指對進(jìn)行剪裁后,將其固化在單片機(jī)或者存儲器中,應(yīng)用于特定場合的專用系統(tǒng)。系統(tǒng)要求性能高,但Linux為分時(shí)系統(tǒng)設(shè)計(jì)的操作系統(tǒng),盡管最新的性能方面有所提高,但它仍然不是一個(gè)系統(tǒng),在很多場合不能滿足實(shí)時(shí)性要求。一般地,通過改造Linux的以提高其實(shí)時(shí)性能有2種策略:一種是采用底層編程的方法對Linux進(jìn)行修改(如調(diào)度算法、修改等),典型的系統(tǒng)有Kansas大學(xué)開發(fā)的KURT。文獻(xiàn)提出了搶占式內(nèi)核調(diào)度算法,容易引起內(nèi)核優(yōu)先級翻轉(zhuǎn),文獻(xiàn)針對非搶占式內(nèi)核,增加搶占點(diǎn),該方法需要優(yōu)秀的調(diào)度算法。另一種途徑是Linux的外部實(shí)時(shí)性擴(kuò)展,在原有Linux基礎(chǔ)上再設(shè)計(jì)一個(gè)用于專門處理實(shí)時(shí)進(jìn)程的內(nèi)核,典型的系統(tǒng)有RTLinux、RTAI等。此方法的不足是RTLinux現(xiàn)在已經(jīng)停止了更新,目前的開源版本僅支持2.4內(nèi)核,RTAI的設(shè)計(jì)原理和RTLinux類似,也是一個(gè)實(shí)時(shí)性應(yīng)用接口。本文采用修改的方法對Linux內(nèi)核進(jìn)行實(shí)時(shí)化改造,修改中斷函數(shù),將中斷和8254中斷排序,使得硬實(shí)時(shí)中斷的優(yōu)先級大于普通8254中斷。通過多組仿真實(shí)驗(yàn),驗(yàn)證了該改造方法是有效的。

          1 Linux的實(shí)時(shí)性分析
          Linux設(shè)計(jì)的初衷是系統(tǒng)吞吐量的平衡,其內(nèi)核試圖通過一種公平分配的策略來實(shí)現(xiàn)各進(jìn)程平均地共享系統(tǒng)資源:
          (1)內(nèi)核的不可搶占性:Linux的內(nèi)核在單處理器上不可搶占,當(dāng)一個(gè)任務(wù)進(jìn)入內(nèi)核態(tài)運(yùn)行時(shí),一個(gè)具有更高優(yōu)先級的進(jìn)程,只有等待處于核心態(tài)的系統(tǒng)調(diào)用返回后方能執(zhí)行,這將導(dǎo)致優(yōu)先級逆轉(zhuǎn)。
          (2)進(jìn)程調(diào)度的不可搶占性:Linux作為一個(gè)分時(shí)系統(tǒng),采用多級反饋輪轉(zhuǎn)調(diào)度算法,它保證了每一個(gè)進(jìn)程都有一種調(diào)度策略,但是都放在同一個(gè)隊(duì)列中運(yùn)行,這也是Linux作為實(shí)時(shí)操作系統(tǒng)的一個(gè)弱點(diǎn)。圖1是Linux調(diào)度機(jī)制框圖。
          (3)中斷的精度不高:Linux 2.4.X內(nèi)核的時(shí)鐘中斷周期為10 ms,時(shí)鐘粒度太過于粗糙,不能滿足實(shí)時(shí)性要求。
          (4)Linux的虛擬存儲管理:Linux采用段和頁機(jī)制的虛擬存儲管理技術(shù),進(jìn)程在硬盤和內(nèi)存間的換入換出必然帶來額外的開銷,造成很大的延遲。

          本文引用地址:http://www.ex-cimer.com/article/151459.htm


          由此可見,要將Linux應(yīng)用于嵌入式系統(tǒng),必須對其進(jìn)行實(shí)時(shí)化改造,以適應(yīng)嵌入式領(lǐng)域要求。

          2 時(shí)鐘修改的內(nèi)核改造方案
          在單CPU系統(tǒng)中,與時(shí)間有關(guān)的活動都是由8254時(shí)鐘芯片來驅(qū)動的,8254產(chǎn)生0號中斷。直接修改內(nèi)核定時(shí)參數(shù)HZ的初值就可構(gòu)造細(xì)粒度定時(shí)器。這種方式實(shí)現(xiàn)起來很簡單,但是由此帶來頻繁的定時(shí)中斷使得系統(tǒng)的開銷很大,當(dāng)然隨著硬件速度的提高,這種開銷會逐步降低。
          簡單地修改赫茲參數(shù)HZ進(jìn)行實(shí)時(shí)化的方法顯然并不可取。Linux 2.6內(nèi)核的時(shí)鐘粒度是1 ms,但仍然與嵌入式領(lǐng)域的實(shí)時(shí)化要求差距較遠(yuǎn),因此需要更高精度的時(shí)鐘。目前常見的修改時(shí)鐘系統(tǒng)達(dá)到實(shí)時(shí)化的方法都是從軟件層面著手,這方面己獲得較大進(jìn)展,但是從時(shí)鐘系統(tǒng)的硬件結(jié)構(gòu)分析并開展實(shí)時(shí)化工作也是一個(gè)值得注意的方向。本文利用先進(jìn)的APIC時(shí)鐘實(shí)現(xiàn)一個(gè)高精度時(shí)鐘系統(tǒng),提供了高精度的中斷響應(yīng),從而以較少的改動獲得較高的實(shí)時(shí)性。
          APIC以總線頻率工作,可立即執(zhí)行所有的定時(shí)器操作,目前x86都有片內(nèi)APIC,用戶可在單CPU內(nèi)使用APIC。APIC除了能提供高精度的時(shí)鐘外還具有一個(gè)重要的優(yōu)點(diǎn),是由于它位于片內(nèi),對其編程只需幾個(gè)CPU指令周期,而對IntelX86的8254存取需要若干慢速的ISA總線指令。
          在100MHz的CPU系統(tǒng)中,處理一個(gè)中斷的時(shí)間不到10μs,因此高速CPU完全可在更短的時(shí)間內(nèi)處理更多的APIC中斷。理論上APIC可實(shí)現(xiàn)10 ns左右的系統(tǒng)時(shí)鐘,但實(shí)際上在處理中斷時(shí)要耗費(fèi)一些時(shí)間,因此中斷的響應(yīng)時(shí)間要大于10 ns。
          APIC本身提供了中斷處理函數(shù)apic_timer_interrupt,該函數(shù)包括Irq_enter(),Run_realtimer_queue()和irq_exit(),其中函數(shù)irq_ exit通常負(fù)責(zé)判斷當(dāng)前是否有8254產(chǎn)生的軟中斷存在,如果存在,就會觸發(fā)8254軟中斷,這樣會造成APIC硬中斷處理延遲。本文的思路就是修改irq_exit,在其中將各軟中斷線程和硬中斷線程進(jìn)行排序,使APIC硬中斷的優(yōu)先級高于軟中斷,此時(shí)硬中斷線程得到優(yōu)先處理,從而提高內(nèi)核的實(shí)時(shí)性能。Irp_exit函數(shù)的核心代碼如下:

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
          光電開關(guān)相關(guān)文章:光電開關(guān)原理

          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();