RTLinux的介紹
時(shi)間:2018-08-16 來(lai)源:未(wei)知
RTLinux是由美國新(xin)墨西哥州的(de)fsmlabs(finite state machine labs, 有限狀(zhuang)態機(ji)實驗室)公(gong)司開發(fa)的(de)、利(li)用linux開發(fa)的(de)面向實時和嵌入式應用的(de)操作系統。在rtlinux宣言(yan)中,這樣(yang)描述rtlinux : rtlinux is the hard realtime variant of linux that makes it possible to control robots, data acquisition systems, manufacturing plants, and other time-sensitive instruments and machines。
到目前為止,RT-Linux已經成功(gong)地應用于航天(tian)(tian)飛機的(de)(de)(de)(de)空間數據采(cai)集、科學儀器(qi)測控和(he)電影(ying)特技(ji)圖(tu)像處理等(deng)廣泛領(ling)域(yu),在電信(xin)、工業(ye)(ye)自(zi)動化和(he)航空航天(tian)(tian)等(deng)實時(shi)領(ling)域(yu)也有成熟應用。隨(sui)著信(xin)息技(ji)術的(de)(de)(de)(de)飛速發(fa)展,實時(shi)系統已經滲透(tou)到日常生(sheng)活(huo)的(de)(de)(de)(de)各個層面,包(bao)括(kuo)傳統的(de)(de)(de)(de)數控領(ling)域(yu)、軍事、制(zhi)造業(ye)(ye)和(he)通信(xin)業(ye)(ye),甚至連潛力(li)巨大的(de)(de)(de)(de)信(xin)息家電、媒體廣播系統和(he)數字影(ying)像設備都對實時(shi)性提出了愈來愈高(gao)的(de)(de)(de)(de)要(yao)求。
RT-Linux開發(fa)(fa)者(zhe)并(bing)沒有針對(dui)實(shi)時(shi)操(cao)作(zuo)(zuo)系統的(de)特性而重寫Linux的(de)內(nei)(nei)核(he),因為(wei)這(zhe)樣(yang)做(zuo)的(de)工作(zuo)(zuo)量非常(chang)(chang)大,而且要保證(zheng)兼(jian)容性也非常(chang)(chang)困難(nan)。將linux的(de)內(nei)(nei)核(he)代碼做(zuo)一(yi)(yi)些(xie)修改,將linux本身(shen)的(de)任務(wu)(wu)以及linux內(nei)(nei)核(he)本身(shen)作(zuo)(zuo)為(wei)一(yi)(yi)個優(you)先級(ji)很(hen)低(di)的(de)任務(wu)(wu),而實(shi)時(shi)任務(wu)(wu)作(zuo)(zuo)為(wei)優(you)先級(ji)高的(de)任務(wu)(wu)。即在(zai)(zai)實(shi)時(shi)任務(wu)(wu)存在(zai)(zai)的(de)情況(kuang)下(xia)運(yun)行(xing)實(shi)時(shi)任務(wu)(wu),否則才運(yun)行(xing)linux本身(shen)的(de)任務(wu)(wu)。TRLinux能夠(gou)創(chuang)建精確運(yun)行(xing)的(de)符合POSIX.1b標準的(de)實(shi)時(shi)進(jin)程;并(bing)且作(zuo)(zuo)為(wei)一(yi)(yi)種遵循GPL v2協(xie)議(yi)的(de)開放軟件,可以達(da)GPL v2協(xie)議(yi)許可范(fan)圍內(nei)(nei)自由地、免費地使用(yong)、修改和再發(fa)(fa)生。
它(ta)(ta)是Linux在實時(shi)(shi)性方(fang)面(mian)(mian)的(de)擴展,采用(yong)已(yi)獲(huo)得專利的(de)雙核(he)(he)技(ji)術(shu):一(yi)個(ge)微型的(de)RTLinux內(nei)核(he)(he)把原(yuan)始的(de)Linux內(nei)核(he)(he)作為它(ta)(ta)在空閑(xian)時(shi)(shi)的(de)一(yi)個(ge)線程來運(yun)(yun)行。這(zhe)開(kai)啟了在兩個(ge)不同(tong)的(de)內(nei)核(he)(he)層面(mian)(mian)上――實時(shi)(shi)的(de)RTLinux內(nei)核(he)(he)和常用(yong)的(de),非實時(shi)(shi)的(de)Linux內(nei)核(he)(he)――運(yun)(yun)行不同(tong)程序的(de)新方(fang)式。原(yuan)始的(de)Linux內(nei)核(he)(he)通過(guo)RTLinux內(nei)核(he)(he)訪問硬件。這(zhe)樣,所有(you)硬件實際上都是由RTLinux來進行管(guan)理的(de)。目前,有(you)兩種不同(tong)的(de)RTLinux版本:RTLinux/Free(或者RTLinux/Open)和RTLinux/Pro. RTLinux/Pro是一(yi)個(ge)由FSMLabs開(kai)發(fa)的(de)完(wan)全商(shang)業版本的(de)實時(shi)(shi)linux。RTLinux/Free是一(yi)個(ge)由社(she)區開(kai)發(fa)的(de)開(kai)源版本。
2.標準Linux影響實時性的機制
現(xian)有(you)的(de)Linux是(shi)一(yi)(yi)個通用(yong)的(de)操作(zuo)系(xi)統(tong)(tong),雖(sui)然它采用(yong)了許(xu)多技術來提高系(xi)統(tong)(tong)的(de)運行和反應速度,但它本質上不是(shi)一(yi)(yi)個實時操作(zuo)系(xi)統(tong)(tong),應用(yong)于嵌(qian)入式(shi)環境中還(huan)存在(zai)諸多的(de)不足。具體表現(xian)如(ru)下(xia):
1.關中斷(duan)問題
在(zai)系統調用中(zhong),為了保護臨(lin)界(jie)區(qu)資(zi)源,Linux處于內(nei)核(he)臨(lin)界(jie)區(qu)時(shi),中(zhong)斷會被系統屏蔽(bi),這就意味(wei)著(zhu)如果(guo)當前進程正處于臨(lin)界(jie)區(qu),即使它的(de)優(you)先級(ji)較低(di),也(ye)會延遲(chi)高優(you)先級(ji)的(de)中(zhong)斷請求。在(zai)實時(shi)應(ying)用中(zhong),這是一個十分(fen)嚴重的(de)問題。
2.進程調度問(wen)題
Linux采用(yong)(yong)標準的(de)(de)(de)UNIX技術使得內核是(shi)不可搶占(zhan)的(de)(de)(de)。采用(yong)(yong)基于(yu)固(gu)定時(shi)間(jian)片的(de)(de)(de)可變優(you)先(xian)級調度(du),不論進(jin)程(cheng)的(de)(de)(de)優(you)先(xian)級多么低(di),Linux總會在某個時(shi)候分給(gei)該進(jin)程(cheng)一個時(shi)間(jian)片運行,即使同時(shi)有可以運行的(de)(de)(de)高優(you)先(xian)級進(jin)程(cheng),它也必須等待低(di)優(you)先(xian)級進(jin)程(cheng)的(de)(de)(de)時(shi)間(jian)片用(yong)(yong)完,這(zhe)對一些要(yao)求(qiu)高優(you)先(xian)級進(jin)程(cheng)立即搶占(zhan)CPU的(de)(de)(de)實時(shi)應用(yong)(yong)是(shi)不能滿足(zu)要(yao)求(qiu)的(de)(de)(de)。
3.時鐘問題
Linux為(wei)了提高系(xi)統的(de)(de)平均吞(tun)吐(tu)率,將時(shi)鐘中斷(duan)的(de)(de)小(xiao)(xiao)間(jian)(jian)隔設置為(wei)10ms,這對于一(yi)個周(zhou)期(qi)性的(de)(de)實(shi)(shi)時(shi)任(ren)(ren)務,間(jian)(jian)隔要(yao)求小(xiao)(xiao)于10ms時(shi),就(jiu)不能滿足實(shi)(shi)時(shi)任(ren)(ren)務的(de)(de)需要(yao)。如(ru)果要(yao)把時(shi)鐘 的(de)(de)間(jian)(jian)隔改小(xiao)(xiao)以滿足周(zhou)期(qi)性的(de)(de)實(shi)(shi)時(shi)任(ren)(ren)務的(de)(de)需要(yao),由于Linux的(de)(de)進程切換比較費(fei)時(shi),時(shi)鐘中斷(duan)越頻(pin)繁,而花在中斷(duan)處理(li)上的(de)(de)時(shi)間(jian)(jian)就(jiu)越多,系(xi)統的(de)(de)大部分時(shi)間(jian)(jian)是調(diao)(diao)用(yong)進程調(diao)(diao)度(du)程序(xu)進行(xing)進程調(diao)(diao)度(du)而不能進行(xing)正(zheng)常(chang)的(de)(de)處理(li)。
3.RTLinux的特點
在(zai)Linux 操作(zuo)系統(tong)中,調(diao)度算法(其(qi)于大(da)吞吐(tu)量準則(ze))、設備驅(qu)動、不可中斷的(de)(de)(de)(de)(de)(de)系統(tong)調(diao)用、中斷屏(ping)蔽以及虛(xu)擬(ni)內存的(de)(de)(de)(de)(de)(de)使用等因素,都會(hui)導(dao)致(zhi)系統(tong)在(zai)時(shi)間(jian)上的(de)(de)(de)(de)(de)(de)不可預(yu)測性,決(jue)定了Linux操作(zuo)系統(tong)不能處理硬實時(shi)任務。RTLinux為避免這(zhe)些問題(ti),在(zai)Linux內核與(yu)硬件(jian)之間(jian)增加了一(yi)個虛(xu)擬(ni)層(通常稱作(zuo)虛(xu)擬(ni)機),構筑了一(yi)個小的(de)(de)(de)(de)(de)(de)、時(shi)間(jian)上可預(yu)測的(de)(de)(de)(de)(de)(de)、與(yu)Linux內核分(fen)開(kai)的(de)(de)(de)(de)(de)(de)實時(shi)內核,使得在(zai)其(qi)中運行(xing)的(de)(de)(de)(de)(de)(de)實時(shi)進程(cheng)滿(man)足(zu)硬實時(shi)性。并且RTLinux和Linux構成一(yi)個完備的(de)(de)(de)(de)(de)(de)整體(ti),能夠完成既包括(kuo)實時(shi)部分(fen)又包括(kuo)非實時(shi)部分(fen)的(de)(de)(de)(de)(de)(de)復雜(za)任務。
4.RTLinux的實現機理
RT-Linux對Linux內(nei)核進行改造,將Linux內(nei)核工作環境做了一些變化,如圖1所示:

圖(tu)1 RTLinux對Linux內核改(gai)變
RTLinux有兩種中(zhong)(zhong)斷(duan):硬(ying)中(zhong)(zhong)斷(duan)和軟中(zhong)(zhong)斷(duan)。軟中(zhong)(zhong)斷(duan)是(shi)(shi)常規(gui)Linux內核(he)中(zhong)(zhong)斷(duan)。它的(de)優點在(zai)于(yu)可無限制地使用Linux內核(he)調用。硬(ying)中(zhong)(zhong)斷(duan)是(shi)(shi)安裝實時Linux的(de)前提。依賴于(yu)不(bu)同的(de)系(xi)統,實時Linux下硬(ying)中(zhong)(zhong)斷(duan)的(de)延遲是(shi)(shi)15μs。
它(ta)在Linux內核的(de)(de)(de)下層實現了(le)一個簡單的(de)(de)(de)實時(shi)內核,而Linux本(ben)身作為這(zhe)個實時(shi)內核的(de)(de)(de)優先(xian)(xian)級低(di)的(de)(de)(de)任務,所有(you)的(de)(de)(de)實時(shi)任務的(de)(de)(de)優先(xian)(xian)級都高于Linux系統本(ben)身的(de)(de)(de)以及Linux系統下的(de)(de)(de)一般(ban)任務。RTLinux的(de)(de)(de)體系結構如圖2所示。

圖2 RTLinux的體系結構
RTLinux的設(she)計(ji)思想(xiang)是:應(ying)用硬(ying)件的實(shi)時約束(shu)將實(shi)時程序分(fen)(fen)割成短小簡單的部(bu)(bu)分(fen)(fen),較大(da)部(bu)(bu)分(fen)(fen)承(cheng)擔較復雜的任(ren)務。根據這(zhe)一(yi)原則,將應(ying)用程序分(fen)(fen)為硬(ying)實(shi)時和軟實(shi)時(即程序)2個部(bu)(bu)分(fen)(fen)。
硬實時(shi)的實現(xian):
硬件(jian)實(shi)(shi)(shi)(shi)時部分(fen)被(bei)作為(wei)實(shi)(shi)(shi)(shi)時任務(wu)來執行(xing),并(bing)從外(wai)部設備拷貝(bei)數(shu)據(ju)(ju)到一個叫做實(shi)(shi)(shi)(shi)時有(you)名管道(RTFIFO)的特殊(shu)I/O端口;程序主要部分(fen)作為(wei)標(biao)準Linux進程來執行(xing)。它將從RTFIFO中(zhong)讀取數(shu)據(ju)(ju),然后顯示(shi)并(bing)存儲到文件(jian)中(zhong),實(shi)(shi)(shi)(shi)時部分(fen)將被(bei)寫入內核。設計實(shi)(shi)(shi)(shi)時有(you)名管道是為(wei)了使實(shi)(shi)(shi)(shi)時任務(wu)在讀和(he)寫數(shu)據(ju)(ju)時不被(bei)阻塞(sai)。圖(tu)3所示(shi)的是RTFIFO結(jie)構圖(tu)。

圖(tu)3 RT-FIFO結構(gou)圖(tu)
RTLinux將標準(zhun)Linux內(nei)(nei)核(he)(he)作(zuo)為(wei)簡單(dan)(dan)實時操作(zuo)系統(RTOS)(或叫子內(nei)(nei)核(he)(he))里優先權低(di)的(de)線程來運行,從而(er)避開(kai)了Linux內(nei)(nei)核(he)(he)性能的(de)問題。 從圖3可以看(kan)出(chu),RTLinux擁有兩(liang)個(ge)(ge)內(nei)(nei)核(he)(he)。這(zhe)就意味著有兩(liang)組單(dan)(dan)獨的(de)API,一個(ge)(ge)用(yong)于Linux環(huan)境,另(ling)一個(ge)(ge)用(yong)于實時環(huan)境。此外,為(wei)保證實時進(jin)程與非(fei)實時Linux進(jin)程不順序進(jin)行數據交換,RTLinux引入了RT-FIFO隊列。RT-FIFO被Linux視為(wei)字符設(she)備,多可達150個(ge)(ge),分(fen)別命名為(wei)/der/rtf0、/dev/rtf1……/dev/rtf63。大的(de)RT-FIFO數量在系統內(nei)(nei)核(he)(he)編譯時設(she)定。
RTLinux程序運行于用戶空間和內核態兩個空間。RTLinux提供了應用程序接口。借助這些API函數將實時處理部分編寫成內核模塊,并裝載到RTLinux內核中,運行于RTLinux的內核態。非實時部分的應用程序則在Linux下的用戶空間中執行。這樣可以發揮Linux對網絡和數據庫的強大支持功能。
軟實時的實現:
RTLinux通過(guo)一(yi)個(ge)高效的(de)、可(ke)搶先(xian)(xian)的(de)實(shi)(shi)(shi)時(shi)(shi)調度核心來全面接管中斷,并把(ba)Linux作為(wei)此實(shi)(shi)(shi)時(shi)(shi)核心的(de)一(yi)個(ge)優先(xian)(xian)級低的(de)進(jin)程(cheng)運行(xing)。當有實(shi)(shi)(shi)時(shi)(shi)任務(wu)(wu)需要處理(li)時(shi)(shi),RTLinux運行(xing)實(shi)(shi)(shi)時(shi)(shi)任務(wu)(wu);無實(shi)(shi)(shi)時(shi)(shi)任務(wu)(wu)時(shi)(shi),RTLinux運行(xing)Linux的(de)非實(shi)(shi)(shi)時(shi)(shi)進(jin)程(cheng)。其系統結構見(jian)圖1。

圖4 RTLinux系統結構(gou)圖
在(zai)(zai)Linux進(jin)程和硬件中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan)之(zhi)間,本來由Linux內(nei)核(he)完全控制(zhi),現在(zai)(zai)在(zai)(zai)Linux內(nei)核(he)和硬件中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan)的(de)(de)(de)(de)地方加上(shang)了(le)一(yi)個RTLinux內(nei)核(he)的(de)(de)(de)(de)控制(zhi)。Linux的(de)(de)(de)(de)控制(zhi)信號(hao)都要(yao)先交給RTLinux內(nei)核(he)進(jin)行處理(li)。在(zai)(zai)RTLinux內(nei)核(he)中(zhong)(zhong)(zhong)實現了(le)一(yi)個虛擬中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan)機制(zhi),Linux本身永遠(yuan)不能屏蔽(bi)中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan),它發(fa)出的(de)(de)(de)(de)中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan)屏蔽(bi)信號(hao)和打(da)(da)開(kai)中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan)信號(hao)都修改(gai)成向(xiang)RTLinux發(fa)送一(yi)個信號(hao)。如在(zai)(zai)Linux里面(mian)使用(yong)“SI”和“CLI”宏指令,讓RTLinux里面(mian)的(de)(de)(de)(de)某(mou)些標(biao)記做了(le)修改(gai)。也(ye)就是說將(jiang)所有的(de)(de)(de)(de)中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan)分成Linux中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan)和實時中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan)兩(liang)類。如果RTLinux內(nei)核(he)接收到(dao)的(de)(de)(de)(de)中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan)信號(hao)是普(pu)通Linux中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan),那(nei)就設(she)置(zhi)一(yi)個標(biao)志位;如果是實時中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan),就繼(ji)續向(xiang)硬件發(fa)出中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan)。在(zai)(zai)RTLinux中(zhong)(zhong)(zhong)執(zhi)行STI將(jiang)中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan)打(da)(da)開(kai)之(zhi)后,那(nei)些設(she)置(zhi)了(le)標(biao)志位表(biao)示的(de)(de)(de)(de)Linux中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan)就繼(ji)續執(zhi)行,因此,CLI并不能禁(jin)止RTLinux內(nei)核(he)的(de)(de)(de)(de)運行,卻可(ke)以(yi)用(yong)來中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan)Linux。Linux不能中(zhong)(zhong)(zhong)斷(duan)(duan)(duan)(duan)自己,而RTLinux可(ke)以(yi)。
RTLinux在默認的(de)情況下采用(yong)(yong)優(you)(you)先(xian)(xian)(xian)級(ji)(ji)(ji)的(de)調度(du)策(ce)(ce)略(lve)(lve),即系統(tong)調度(du)器根據各個(ge)實(shi)時(shi)(shi)任務(wu)的(de)優(you)(you)先(xian)(xian)(xian)級(ji)(ji)(ji)來確(que)定(ding)(ding)執(zhi)行(xing)的(de)先(xian)(xian)(xian)后次序。優(you)(you)先(xian)(xian)(xian)級(ji)(ji)(ji)高(gao)的(de)先(xian)(xian)(xian)執(zhi)行(xing),優(you)(you)先(xian)(xian)(xian)級(ji)(ji)(ji)低(di)的(de)后執(zhi)行(xing),這樣就(jiu)保證了實(shi)時(shi)(shi)進程的(de)迅速調度(du)。同時(shi)(shi)RTLinux也支持其(qi)它的(de)調度(du)策(ce)(ce)略(lve)(lve),如短時(shi)(shi)限先(xian)(xian)(xian)調度(du)(EDP)、確(que)定(ding)(ding)周(zhou)期(qi)調度(du)(RM)(周(zhou)期(qi)段的(de)實(shi)時(shi)(shi)任務(wu)具有高(gao)的(de)優(you)(you)先(xian)(xian)(xian)級(ji)(ji)(ji))。RTLinux將任務(wu)調度(du)器本身設計成一(yi)個(ge)可裝載的(de)內核模塊,用(yong)(yong)戶可以(yi)根據自己的(de)實(shi)際需要,編寫適合(he)自己的(de)調度(du)算法。
對于一個操作系統而言,精確的(de)(de)定(ding)(ding)時(shi)(shi)(shi)(shi)(shi)(shi)機(ji)制(zhi)雖然可以提高任(ren)務調(diao)度器(qi)的(de)(de)效率,但(dan)會增加CPU處(chu)理(li)定(ding)(ding)時(shi)(shi)(shi)(shi)(shi)(shi)中(zhong)斷(duan)的(de)(de)時(shi)(shi)(shi)(shi)(shi)(shi)間(jian)開銷(xiao)。RTLinux對時(shi)(shi)(shi)(shi)(shi)(shi)間(jian)精度和時(shi)(shi)(shi)(shi)(shi)(shi)鐘(zhong)中(zhong)斷(duan)處(chu)理(li)的(de)(de)時(shi)(shi)(shi)(shi)(shi)(shi)間(jian)開銷(xiao)進(jin)行了折中(zhong)考慮(lv)。不(bu)是像Linux那樣(yang)將(jiang)8254定(ding)(ding)時(shi)(shi)(shi)(shi)(shi)(shi)器(qi)設(she)計(ji)成10ms產生一次定(ding)(ding)時(shi)(shi)(shi)(shi)(shi)(shi)中(zhong)斷(duan)的(de)(de)固定(ding)(ding)模式(shi),而是將(jiang)定(ding)(ding)時(shi)(shi)(shi)(shi)(shi)(shi)器(qi)芯片(pian)設(she)置為終端(duan)計(ji)時(shi)(shi)(shi)(shi)(shi)(shi)中(zhong)斷(duan)方式(shi)。根據近的(de)(de)進(jin)程的(de)(de)時(shi)(shi)(shi)(shi)(shi)(shi)間(jian)需要(yao),不(bu)斷(duan)調(diao)整定(ding)(ding)時(shi)(shi)(shi)(shi)(shi)(shi)器(qi)的(de)(de)定(ding)(ding)時(shi)(shi)(shi)(shi)(shi)(shi)間(jian)隔。這(zhe)樣(yang)不(bu)僅可以獲得高定(ding)(ding)時(shi)(shi)(shi)(shi)(shi)(shi)精度,同(tong)時(shi)(shi)(shi)(shi)(shi)(shi)中(zhong)斷(duan)處(chu)理(li)的(de)(de)開銷(xiao)又(you)小。
5.RTLinux的主要功能
RTLinux提供(gong)了一(yi)整套對(dui)硬實(shi)時進程的支持(chi)函(han)數(shu)集。在此,對(dui)在嵌入式系統(tong)中(zhong)的實(shi)現加(jia)以闡述。
a.中斷仿真
在中(zhong)斷(duan)控制硬件(jian)(jian)與LINUX核心之間放置一個軟件(jian)(jian)仿真(zhen)層(ceng)。具體(ti)做法是,在LINUX源(yuan)碼中(zhong)出現cli、sti和iret的所有地方(fang)都(dou)用仿真(zhen)宏:S_CLI、S_STI和S_IRET來替換。所有的硬件(jian)(jian)中(zhong)斷(duan)就都(dou)被仿真(zhen)器(qi)所截獲(huo)。
當需要關中(zhong)(zhong)斷(duan)(duan)時,就(jiu)(jiu)將仿(fang)(fang)真(zhen)器中(zhong)(zhong)的(de)(de)一個(ge)變量(liang)置(zhi)(zhi)0。不論何時若有中(zhong)(zhong)斷(duan)(duan)發生,仿(fang)(fang)真(zhen)器就(jiu)(jiu)檢(jian)查這(zhe)個(ge)變量(liang)。如果是1(LINUX已開中(zhong)(zhong)斷(duan)(duan)),就(jiu)(jiu)立即調用LINUX的(de)(de)中(zhong)(zhong)斷(duan)(duan)處理(li)程(cheng)序;否則,LINUX中(zhong)(zhong)斷(duan)(duan)被禁止,中(zhong)(zhong)斷(duan)(duan)處理(li)程(cheng)序不會被調用,而是在保存著所有掛起(qi)中(zhong)(zhong)斷(duan)(duan)的(de)(de)信(xin)息的(de)(de)變量(liang)的(de)(de)相應(ying)位置(zhi)(zhi)1。當LINUX重(zhong)新(xin)開中(zhong)(zhong)斷(duan)(duan),所有掛起(qi)中(zhong)(zhong)斷(duan)(duan)的(de)(de)處理(li)程(cheng)序都會被執行。這(zhe)種(zhong)仿(fang)(fang)真(zhen)方式(shi)可以稱(cheng)之為"軟中(zhong)(zhong)斷(duan)(duan)"。
b.實時任務
實(shi)時(shi)任務是在一(yi)個由核心控(kong)制的調度程(cheng)(cheng)序的調度下執行的用戶定義的程(cheng)(cheng)序。
RT-LINUX初將(jiang)實時(shi)任務(wu)設計(ji)成ELF格式的(de)(de)目標文(wen)件。這(zhe)一(yi)設計(ji)方案(an)的(de)(de)大缺點(dian)就是性(xing)能比較差。原因(yin)在于,第一(yi),486的(de)(de)緩(huan)存(cun)是虛擬(ni)的(de)(de)。所以(yi)(yi)每當頁表目錄的(de)(de)基(ji)址(zhi)寄(ji)存(cun)器改(gai)變時(shi),TLB(轉換(huan)后備(bei)緩(huan)沖器)就會(hui)失效。由于實時(shi)任務(wu)的(de)(de)上下文(wen)轉換(huan)頻繁,所以(yi)(yi)TLB的(de)(de)頻繁失效就導致系(xi)統性(xing)能的(de)(de)嚴(yan)重下降。第二,486的(de)(de)保護級別變換(huan)耗時(shi)不少。比如,陷入更高級別時(shi)需要(yao)71個循環(huan),而其它指令一(yi)般少于10個循環(huan)。
解(jie)決的(de)辦法就是使用可(ke)加(jia)載模組技術,所有(you)的(de)實(shi)時任(ren)務(wu)都(dou)同處(chu)于一個地址空間(jian)-內(nei)核地址空間(jian),不(bu)僅避(bi)免了(le)頻(pin)繁(fan)的(de)TLB失效,同時也(ye)消(xiao)除了(le)變(bian)換保(bao)護級別的(de)消(xiao)耗(hao),而(er)且任(ren)務(wu)轉換也(ye)變(bian)得相當容易。
c.進程調度
實時(shi)(shi)系統的進程(cheng)調度(du)的主(zhu)要(yao)任務就(jiu)是(shi)滿足實時(shi)(shi)任務在(zai)時(shi)(shi)間上的要(yao)求。調度(du)算法的種類(lei)很多,沒有一個(ge)策略是(shi)放之四(si)海而皆準的,因此采用(yong)哪種算法要(yao)取決于(yu)具體應(ying)用(yong)。
RT-LINUX采用的方法(fa)是允許用戶編寫自己的調度程(cheng)序(xu),并可以編譯成(cheng)模組(zu)的形式。這樣就(jiu)可以方便地(di)試驗不同的策(ce)略和算法(fa)對于某一特定(ding)應(ying)用的適(shi)合性(xing),從中選出優。
RT-LINUX自帶的(de)(de)(de)是一個基于(yu)優先數的(de)(de)(de)搶占式調(diao)度(du)程(cheng)序。此(ci)調(diao)度(du)程(cheng)序將LINUX當(dang)作(zuo)具(ju)有低優先數的(de)(de)(de)實時(shi)(shi)任(ren)務。因此(ci),LINUX只在實時(shi)(shi)系統(tong)無任(ren)何實時(shi)(shi)任(ren)務是才運行。在從LINUX切換到實時(shi)(shi)任(ren)務時(shi)(shi),系統(tong)記下軟(ruan)中(zhong)斷的(de)(de)(de)狀(zhuang)態(tai)并禁止軟(ruan)中(zhong)斷。在切換回來實,再(zai)恢(hui)復軟(ruan)中(zhong)斷的(de)(de)(de)狀(zhuang)態(tai)。
d.時鐘
調(diao)度(du)程序需要精(jing)確的(de)(de)時(shi)鐘才(cai)能(neng)準確操作。調(diao)度(du)通常是在特定的(de)(de)時(shi)刻進行任務切換。時(shi)鐘的(de)(de)偏差會引起預定調(diao)度(du)的(de)(de)偏差,導致產生被稱為任務發布(bu)抖動(dong)的(de)(de)現象(xiang)。這(zhe)是一種(zhong)應該盡(jin)量避免的(de)(de)不良現象(xiang)。
RT-LINUX的(de)解決辦法是,將IBM PC兼容(rong)機中(zhong)的(de)時鐘(zhong)芯(xin)片Intel 8254設置(zhi)為中(zhong)斷開啟(qi)終端計數模式。在這種模式下,精度(du)可以達到1毫(hao)秒(miao)。這樣(yang)在降低中(zhong)斷處理(li)的(de)影響的(de)同時,獲得了較高的(de)時鐘(zhong)精度(du)。
由(you)于標準LINUX核心可以(yi)被實時任務在任意時刻搶占,所(suo)以(yi)實時任務無(wu)法(fa)安全地(di)調用(yong)LINUX的(de)程序。但是(shi)總(zong)要有一個信(xin)息(xi)交換的(de)機制。
在RT-LINUX中(zhong)所(suo)用的(de)信(xin)息(xi)交(jiao)換方式(shi)是RT-FIFO(實時隊列(lie))。它與UNIX的(de)管(guan)道非(fei)常相似,都是一個(ge)無結構的(de)數(shu)據流(liu)。通(tong)過RT-FIFO,LINUX的(de)進(jin)程之(zhi)間,實時進(jin)程之(zhi)間,以及LINUX的(de)核心與實時進(jin)程之(zhi)間可以交(jiao)換信(xin)息(xi)。
對于(yu)一個普通(tong)的進程(cheng)來說(shuo),RT-FIFO就是一個特(te)殊(shu)的字符文件(jian)。這些文件(jian)必須自建:
# for i in 0 1 2 3; do mknod /dev/rtf$i c 63 $i; done

