實(shí)時(shí)操作系統(tǒng)
設(shè)計(jì)理念
通常,實(shí)時(shí)操作系統(tǒng)分為兩大類:
事件驅(qū)動(dòng)型。當(dāng)一個(gè)高優(yōu)先級(jí)的任務(wù)需要執(zhí)行時(shí),系統(tǒng)會(huì)自動(dòng)切換到這個(gè)任務(wù)。這種根據(jù)優(yōu)先級(jí)調(diào)度任務(wù)的方式稱為搶占式任務(wù)處理。
時(shí)間觸發(fā)型。每個(gè)任務(wù)在各自設(shè)定好的的時(shí)間間隔內(nèi)重復(fù)、輪流調(diào)度。
時(shí)間觸發(fā)型設(shè)計(jì)往往比較嚴(yán)格地調(diào)度任務(wù),具有更好的多任務(wù)處理能力。多個(gè)任務(wù)被不停地輪流調(diào)度,在宏觀上,就相當(dāng)于一個(gè)CPU同時(shí)執(zhí)行多個(gè)任務(wù)。
在過(guò)去,CPU在切換任務(wù)時(shí)往往需要多個(gè)機(jī)器周期,在這段時(shí)間內(nèi),CPU不能處理其他任何任務(wù)。例如,一個(gè)20 MHz的摩托羅拉68000處理器(1980年代后期),在切換任務(wù)時(shí)需要花費(fèi)20微秒。(相比之下,一個(gè)100 MHz的ARM架構(gòu)的處理器(2008年之后的)只需要3微秒。) 因此,早期的實(shí)時(shí)操作系統(tǒng)通過(guò)減少任務(wù)切換次數(shù)來(lái)避免消耗過(guò)多CPU時(shí)間。
任務(wù)調(diào)度
在典型的設(shè)計(jì)中,一個(gè)任務(wù)有以下三種狀態(tài):
正在運(yùn)行(Running,正在CPU中執(zhí)行)
待命(Ready,等待執(zhí)行)
阻塞(Blocked,任務(wù)暫停,等待一個(gè)事件的發(fā)生,例如接收一組數(shù)據(jù))
由于CPU在某個(gè)時(shí)間只能執(zhí)行一個(gè)任務(wù),大部分任務(wù),在大部分時(shí)間,處于阻塞或待命狀態(tài)??赡軙?huì)有大量項(xiàng)目在待命列表里等待執(zhí)行,這取決于系統(tǒng)所需的任務(wù)數(shù)量以及調(diào)度器的類型。
通常情況下,對(duì)于簡(jiǎn)單的時(shí)間觸發(fā)式調(diào)度器來(lái)說(shuō),待命任務(wù)列表的數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)要盡可能縮短最壞情況下,程序在調(diào)度器關(guān)鍵部分的執(zhí)行時(shí)間,以防止其他任務(wù)一直在待命列表中,無(wú)法及時(shí)執(zhí)行。因此,在這種調(diào)度器中,應(yīng)盡可能避免搶占式任務(wù),甚至應(yīng)該關(guān)閉調(diào)度器之外的所有中斷。當(dāng)然,待命任務(wù)列表的數(shù)據(jù)結(jié)構(gòu)也應(yīng)根據(jù)這個(gè)系統(tǒng)需要的最大任務(wù)數(shù)量做進(jìn)一步的優(yōu)化。
如果待命任務(wù)列表中的任務(wù)較多,雙向鏈表是一個(gè)比較好的選擇。如果待命任務(wù)列表通常包含少量任務(wù),但偶爾會(huì)出現(xiàn)較多任務(wù),任務(wù)應(yīng)該根據(jù)優(yōu)先級(jí)排序。這樣一來(lái),要尋找最高優(yōu)先級(jí)的任務(wù),就不必要在整個(gè)列表中一個(gè)一個(gè)地尋找。而插入任務(wù)需要從列表中的第一個(gè)任務(wù)開始,向后尋找,直到找到比要插入的任務(wù)優(yōu)先級(jí)低的任務(wù),然后插入到該任務(wù)之前;如果沒(méi)有找到優(yōu)先級(jí)更低的任務(wù),就插入到任務(wù)列表末尾。
在尋找任務(wù)列表,準(zhǔn)備插入任務(wù)的過(guò)程中,應(yīng)該注意避免搶占。長(zhǎng)的關(guān)鍵部分應(yīng)分為多個(gè)小的部分分別執(zhí)行。如果在尋找任務(wù)列表,要插入低優(yōu)先級(jí)任務(wù)的時(shí)候,一個(gè)中斷發(fā)生使高優(yōu)先級(jí)任務(wù)進(jìn)入待命狀態(tài),高優(yōu)先級(jí)任務(wù)應(yīng)該在低優(yōu)先級(jí)任務(wù)被插入之前立馬被插入列表和執(zhí)行。
在更先進(jìn)的系統(tǒng)中,實(shí)時(shí)任務(wù)和許多非實(shí)時(shí)任務(wù)共享運(yùn)算資源,這時(shí)候待命任務(wù)列表會(huì)變得很長(zhǎng)。在這種系統(tǒng)中,待命任務(wù)列表可能不適合用鏈表的結(jié)構(gòu)。
調(diào)度算法
一些實(shí)時(shí)操作系統(tǒng)中常用的算法:
合作式調(diào)度
搶占式調(diào)度
Earliest Deadline First approach
Stochastic digraphs with multi-threaded graph traversal
RTOS舉例
WinCE、VxWorks、μC/OS-Ⅱ等運(yùn)用較廣。Linux是作為通用操作系統(tǒng)開發(fā)的,其內(nèi)核在實(shí)時(shí)處理能力上先天不足,部分網(wǎng)絡(luò)開發(fā)社區(qū)將其經(jīng)過(guò)改造能在一定程度上成為實(shí)時(shí)操作系統(tǒng)。
開放源代碼&免費(fèi)
Raw-OS[1]
CoOS[2]
開放源代碼
RT-Thread[3]
eCos
Fiasco (L4 clone)[4]
FreeRTOS
Phoenix-RTOS
Nut/OS[5]
Prex
RTAI
RTEMS
RTLinux
SHaRK[6]
TRON Project
Xenomai[7]
CoOS[8]
非開放源代碼
Ardence RTX
BeOS
ChorusOS
DNIX
DMERT
e-Tkernel
HOPEN OS
embOS (Segger)
INTEGRITY
ITRON
LynxOS
MERT
MicroC/OS-II
MQX RTOS[9]
Nucleus
OS-9
OSE
OSEK/VDX
OSEKtime
PDOS
Phar Lap ETS
PikeOS
Portos
pSOS
QNX
RMX
RSX-11
RT-11
RTOS-UH
RTXC
Salvo RTOS[10]
SIAN III
Symbian OS
ThreadX
VRTX
VxWorks
Windows CE
μnOS
UNIX-RTR
REX
HP-1000/RTE[11]
免責(zé)聲明:以上內(nèi)容版權(quán)歸原作者所有,如有侵犯您的原創(chuàng)版權(quán)請(qǐng)告知,我們將盡快刪除相關(guān)內(nèi)容。感謝每一位辛勤著寫的作者,感謝每一位的分享。
- 有價(jià)值
- 一般般
- 沒(méi)價(jià)值
{{item.userName}} 舉報(bào)
{{item.time}} {{item.replyListShow ? '收起' : '展開'}}評(píng)論 {{curReplyId == item.id ? '取消回復(fù)' : '回復(fù)'}}
{{_reply.userName}} 舉報(bào)
{{_reply.time}}