教你如何把Linux變?yōu)閷?shí)時(shí)操作系統(tǒng)[1]

字號:

過去很多嵌入式系統(tǒng)不是一個(gè)操作系統(tǒng),或者是提供商的專有核心,或者是DOS操作系統(tǒng)的擴(kuò)展。顯然這些方法并不能適應(yīng)今天嵌入式系統(tǒng)開發(fā)的要求!現(xiàn)有的一些商業(yè)實(shí)時(shí)操作系統(tǒng),盡管提供了很小的核心和多任務(wù)開發(fā)環(huán)境,但性能并不理想,也不符合現(xiàn)在實(shí)時(shí)嵌入式市場的需求。
    因此,人們把目光投向了通用操作系統(tǒng)(例如Windows、Solaris、Linux),希望把它們“改造”為實(shí)時(shí)操作系統(tǒng)。通常這些操作系統(tǒng)功能強(qiáng)大,結(jié)構(gòu)復(fù)雜,易于軟件的二次開發(fā),實(shí)用性強(qiáng),并且提供編程人員熟悉的標(biāo)準(zhǔn)API。此外,這些操作系統(tǒng)也提供了一些對實(shí)時(shí)軟件開發(fā)的支持。然而,這些操作系統(tǒng)用于嵌入式系統(tǒng)的開發(fā)還存在不足。嵌入式系統(tǒng)要求具備高可靠性,滿足應(yīng)用需求的可剪裁性,以及比通用操作系統(tǒng)要求更高的實(shí)時(shí)性。
    做為嵌入式系統(tǒng)開發(fā)的解決方案,Linux在眾多通用操作系統(tǒng)中具有獨(dú)一無二的優(yōu)勢。
    首先,Windows和Solaris等專有商業(yè)操作系統(tǒng)的剪裁受到商家的嚴(yán)格控制。這大大限制了開發(fā)者的剪裁深度。而Linux遵循GPL協(xié)議,開放所有系統(tǒng)源代碼,非常易于剪裁。
    其次,同其它開放源碼的通用操作系統(tǒng)(如FreeBSD)相比,Linux在多種處理器、開發(fā)板支持和軟件開發(fā)工具支持上有很強(qiáng)的優(yōu)勢。
    Linux最初也是作為通用操作系統(tǒng)而設(shè)計(jì)開發(fā)的,但提供了一些實(shí)時(shí)處理的支持。這包括支持大部分POSIX標(biāo)準(zhǔn)中的實(shí)時(shí)功能,支持多任務(wù)、多線程,具有豐富的通信機(jī)制等。
    Linux還提供符合了POSIX標(biāo)準(zhǔn)的調(diào)度策略,包括FIFO調(diào)度策略、時(shí)間片輪轉(zhuǎn)調(diào)度策略和靜態(tài)優(yōu)先級搶占式調(diào)度策略。其默認(rèn)的調(diào)度策略是第三種。Linux還提供了內(nèi)存鎖定功能,以避免在實(shí)時(shí)處理中存儲(chǔ)頁被換出,也提供了符合POSIX 標(biāo)準(zhǔn)的實(shí)時(shí)信號機(jī)制。
    一個(gè)致命問題是,Linux在用戶態(tài)支持可搶占調(diào)度策略,而在核心態(tài)卻不支持搶占式調(diào)度策略。這樣運(yùn)行在Linux核心態(tài)的任務(wù)(或系統(tǒng)調(diào)用)是不能被其它優(yōu)先級更高的任務(wù)所搶占的,這樣就會(huì)引起優(yōu)先級逆轉(zhuǎn)問題。另外,Linux操作系統(tǒng)的中斷處理句柄是不可調(diào)度的,不能依優(yōu)先級高低調(diào)度。而在實(shí)時(shí)系統(tǒng)中,卻希望中斷處理句柄同實(shí)時(shí)任務(wù)一樣,可以有優(yōu)先級來被系統(tǒng)的調(diào)度程序所調(diào)度。
    此外,我們還關(guān)心和任務(wù)響應(yīng)時(shí)間相關(guān)的時(shí)鐘精度,以及由于資源共享而帶來的優(yōu)先級逆轉(zhuǎn)問題。Linux中硬件時(shí)鐘中斷的默認(rèn)時(shí)間間隔是10ms,所有的軟件時(shí)鐘都是靠硬件來觸發(fā)的。而簡單同步機(jī)制(互斥)不支持優(yōu)先級繼承又很可能導(dǎo)致優(yōu)先級逆轉(zhuǎn)。
    獨(dú)立核方法
    Linux作為實(shí)時(shí)系統(tǒng)的獨(dú)立核方法是指設(shè)計(jì)一種完全獨(dú)立的實(shí)時(shí)核心,但其API 與Linux核心相兼容。這種方法的理論基礎(chǔ)是一款優(yōu)秀的實(shí)時(shí)操作系統(tǒng)必須在其設(shè)計(jì)之初就充分考慮到系統(tǒng)實(shí)時(shí)性的要求,并能夠提供符合標(biāo)準(zhǔn)的API。這種實(shí)現(xiàn)方法對很多與POSIX 兼容的專有實(shí)時(shí)系統(tǒng)提供商很有吸引力。
    這種方法的局限性是由于設(shè)計(jì)了一個(gè)完全獨(dú)立的實(shí)時(shí)核心而沒有使用原有Linux核心,導(dǎo)致Linux系統(tǒng)的一些優(yōu)勢難以繼承,尤其是與Linux核心相關(guān)的一些優(yōu)勢無法獲得。比如Linux核心對大量硬件的廣泛支持,Linux核心超群的可靠性、穩(wěn)定性等。另外,由于這種方法并沒有通過修改Linux核心代碼來開發(fā)實(shí)時(shí)核心,而是在Linux系統(tǒng)之上重新設(shè)計(jì)了一個(gè)實(shí)時(shí)核心,這樣的開發(fā)并不要求源代碼開放。因此,Linux一些基于開放源代碼的優(yōu)勢也勢必受損。最后一點(diǎn),任何基于Linux核心的開發(fā)成果也無法方便地應(yīng)用到實(shí)時(shí)核心中。
    當(dāng)然這種實(shí)現(xiàn)方法也從Linux系統(tǒng)中得到了很多好處。由于Linux系統(tǒng)的支撐,實(shí)時(shí)核心就并不需要“真”的去實(shí)現(xiàn)。而且熟悉Linux系統(tǒng)的開發(fā)人員也可以很快地熟悉這種方法開發(fā)出的實(shí)時(shí)系統(tǒng)。人們也會(huì)自然地想到用Linux系統(tǒng)做嵌入式系統(tǒng)的開發(fā)平臺。此外,如果這種實(shí)時(shí)系統(tǒng)的API是Linux系統(tǒng)API子集的話,我們還可以只在Linux主機(jī)上仿真,進(jìn)行應(yīng)用程序的開發(fā)和調(diào)試,免去了遠(yuǎn)程調(diào)試之苦!
    與Linux API的兼容程度是評估這類實(shí)時(shí)系統(tǒng)的一個(gè)重要指標(biāo)。如果一個(gè)實(shí)時(shí)系統(tǒng)兼容了所有Linux API,那么就允許所有Linux上的應(yīng)用程序和庫在其上運(yùn)行使用。因此,這將會(huì)帶來一個(gè)巨大的好處,所有在Linux上可用的第三方軟件均可以在其上使用。當(dāng)然,開發(fā)一款這樣兼容所有Linux API的實(shí)時(shí)系統(tǒng)決不是件容易的事,尤其是對于單個(gè)開發(fā)商來說。
    所以,大量的第三方軟件并不能很容易地移植到實(shí)時(shí)系統(tǒng)中來,這點(diǎn)不足,也使Linux的優(yōu)勢大打折扣!