以前用過Vxworks, 由于工作需要,接觸到Nucleus, 隨手寫的一個(gè)讀書筆記,主要注重Nucleus Plus (NP)和其他Embedded OS 的差別。
實(shí)時(shí)、搶占、多任務(wù)內(nèi)核,用于時(shí)間要求嚴(yán)格的嵌入式應(yīng)用;95%的Nuclear PLUS用ANSI C寫成;便于移植,能用于絕大多數(shù)微處理器架構(gòu)。
片上RTOS!
Nuclear PLUS常作為C庫(kù)來(lái)使用。其發(fā)布形式為源碼方式。
不用多說了,J
提供任務(wù)管理(調(diào)度),任務(wù)間通信,任務(wù)同步,時(shí)鐘,內(nèi)存管理。
將Nuclear PLUS當(dāng)成一個(gè)C庫(kù)來(lái)用。應(yīng)用軟件中用到的服務(wù)從Nuclear PLUS庫(kù)中獲取,和應(yīng)用目標(biāo)組合得到完整的映像(可執(zhí)行代碼)。映像被下載到目標(biāo)機(jī)系統(tǒng)或ROM中。
使用Nuclear PLUS的一般步驟:
1) 如果必要,可以修改地及初始化文件,INT.*
注意:該文件常為匯編語(yǔ)言形式,其擴(kuò)展名根據(jù)開發(fā)工具指定;
2) 定義Application_Initialize函數(shù),其在Nuclear PLUS引導(dǎo)系統(tǒng)前執(zhí)行。注意:為了進(jìn)行NP的系統(tǒng)調(diào)用,文件NUCLEUS.H必須被包含;
3) 定義應(yīng)用任務(wù)。如果使用了NP服務(wù),NULCEUS.H必須包含;
4) 編譯/匯編所有的應(yīng)用軟件,包括底層的系統(tǒng)初始化文件INT.*;
5) 連接INT,所有的應(yīng)用目標(biāo)文件以及NP庫(kù),以及任何必要的開發(fā)庫(kù);
6) 下載完整的應(yīng)用映像到目標(biāo)系統(tǒng),Run it!
典型結(jié)構(gòu):
#include
NP大小:CISC系統(tǒng)上最大20Kb,RISC系統(tǒng)上40Kb;需要1.5Kb RAM。以上不包括應(yīng)用程序,隊(duì)列,管道或其他NP對(duì)象用到的內(nèi)存。
NP不試圖改變?nèi)魏未嬖诘臄?shù)據(jù)元素,其容易被放在ROM中。對(duì)每個(gè)開發(fā)環(huán)境來(lái)說,NP都存在ROM可用的屬性。
目標(biāo)包括TRM(Target-Resident Monitor)的情況....
INT_INITIALIZE例程一般為NP中第一個(gè)執(zhí)行的。對(duì)大部分目標(biāo)環(huán)境,INT_INITIALIZE包含硬件復(fù)位向量,其負(fù)責(zé)所有目標(biāo)相關(guān)的初始化,如建立不同的處理器控制寄存器,中斷向量表,全局C數(shù)據(jù)變量,幾個(gè)NP變量,系統(tǒng)堆棧指針。
系統(tǒng)初始化完成后,控制流進(jìn)入NP高級(jí)初始化INC_INITIALIZE。注意,不會(huì)在返回系統(tǒng)初始化。
INC_INITIALIZE調(diào)用用戶初始化例程,Application_Initialize() (簡(jiǎn)稱AI)。AI負(fù)責(zé)初始化應(yīng)用環(huán)境,如初始化應(yīng)用任務(wù),郵箱(mailboxes),隊(duì)列,管道,信號(hào)燈,事件組,內(nèi)存池,其他NP變量。
AI完成后,INC_Initialize()初始化任務(wù)調(diào)度。
NP提供給應(yīng)用定制每個(gè)系統(tǒng)對(duì)象使用內(nèi)存的能力。系統(tǒng)對(duì)象包括:任務(wù),HISRs(硬件中斷??),隊(duì)列,管道,郵箱,信號(hào)燈,事件標(biāo)志組,內(nèi)存分區(qū)池,動(dòng)態(tài)內(nèi)存池,I/O驅(qū)動(dòng)。每個(gè)系統(tǒng)對(duì)象需要一個(gè)控制結(jié)構(gòu)(變量),某些對(duì)象需要附加的內(nèi)存。
分配系統(tǒng)對(duì)象內(nèi)存的幾種方法:1) 最簡(jiǎn)單的辦法,用C的全局?jǐn)?shù)據(jù)結(jié)構(gòu)來(lái)分配;2) 動(dòng)態(tài)分配內(nèi)存,可以從動(dòng)態(tài)內(nèi)存池,或分區(qū)內(nèi)存池;3) 從目標(biāo)系統(tǒng)的絕對(duì)物理地址分配內(nèi)存。
NP有8種線程執(zhí)行模式:初始化,系統(tǒng)錯(cuò)誤,調(diào)度循環(huán),任務(wù),信號(hào)處理,用戶ISR,LISR(Low-Level ISR), HISR(High-Level ISR)。
任務(wù)是一個(gè)有特定目的的半獨(dú)立程序?,F(xiàn)代實(shí)時(shí)應(yīng)用常為多任務(wù),而且任務(wù)的重要性常發(fā)生變化。
任務(wù)狀態(tài):執(zhí)行,準(zhǔn)備,懸掛,終止,完成
搶占、放棄(同優(yōu)先級(jí)輪轉(zhuǎn)),時(shí)間片,動(dòng)態(tài)創(chuàng)建(任務(wù)數(shù)量也許沒限制,每個(gè)任務(wù)需要控制塊和堆棧),確定性,堆棧檢測(cè),任務(wù)信息,優(yōu)先級(jí)(0~255,0最高)
"饑餓",高優(yōu)先級(jí)總"Ready",則低優(yōu)先級(jí)任務(wù)沒機(jī)會(huì)執(zhí)行。
用戶指定內(nèi)存池大?。怀缘膬?nèi)存為只有應(yīng)用程序決定;支持變長(zhǎng)度分配和釋放。
分配規(guī)則:First Fit
支持"延遲"分配,F(xiàn)IFO或優(yōu)先級(jí)確定順序。
內(nèi)存池可以動(dòng)態(tài)創(chuàng)建。
確定性問題:分配~不確定,釋放~確定
分區(qū)內(nèi)存池包含用戶指定固定大小的內(nèi)存區(qū)。其位置、大小有應(yīng)用程序決定。在分區(qū)池中進(jìn)行單個(gè)的分區(qū)的分配和釋放。需要一些附加工作!
延遲(懸掛):無(wú)條件,超時(shí),無(wú)懸掛
可以動(dòng)態(tài)創(chuàng)建和消除
確定性:無(wú)需搜索,分配和釋放分區(qū)的過程快速且固定(時(shí)間一定)。但其處理時(shí)間,受懸掛任務(wù)的優(yōu)先級(jí)順序等影響。
"郵箱"提供了低代價(jià)的簡(jiǎn)單信息傳遞機(jī)制。每個(gè)Mailbox能夠儲(chǔ)存4個(gè)32位的字(WORDS)。消息的發(fā)送和接收為值。發(fā)送消息時(shí),需要將消息Copy到"郵箱",接受消息需要將消息Copy出郵箱。
延遲:無(wú)條件延遲,超時(shí),無(wú)延遲
廣播:Mailbox消息可以是廣播的。
動(dòng)態(tài)創(chuàng)建和刪除
確定性:發(fā)送和接收消息的處理時(shí)間是常值的。但受懸掛任務(wù)的優(yōu)先級(jí)影響。
提供傳送多消息的機(jī)制。消息的發(fā)送和接收為值。。。。
消息可以放隊(duì)列頭或尾。
消息大?。喊?個(gè)或多個(gè)32位字;支持固定或變長(zhǎng)度的消息,隊(duì)列創(chuàng)建時(shí)定義消息格式,變長(zhǎng)度需要附加1個(gè)字。
提供多消息傳遞機(jī)制;值;Copy入,Copy出;消息可以放在管道前或后。
消息大?。?個(gè)或多字節(jié);固定或變長(zhǎng)的消息被支持;創(chuàng)建時(shí)定義。
信號(hào)燈提供應(yīng)用程序關(guān)鍵部分的控制執(zhí)行機(jī)制;NP提供的計(jì)數(shù)信號(hào)燈(可用信號(hào)燈)范圍為0~4,294,967,294.
信號(hào)燈兩個(gè)基本操作:獲取、釋放。
信號(hào)燈創(chuàng)建時(shí)指定初始值用于指示事件。
延遲:無(wú)條件,超時(shí),無(wú)延遲
死鎖:指當(dāng)兩個(gè)或更多的任務(wù)由于企圖獲取兩個(gè)或更多信號(hào)燈而永遠(yuǎn)死鎖。"阻止"(Prevention)是解決這個(gè)問題的好辦法,具體依賴于應(yīng)用,如每個(gè)任務(wù)不能占用1個(gè)以上的信號(hào)燈,或所有任務(wù)按相同順序去獲取多個(gè)信號(hào)燈,可選的"超時(shí)"設(shè)定等。
優(yōu)先級(jí)反轉(zhuǎn):當(dāng)高優(yōu)先級(jí)的任務(wù)懸掛在低優(yōu)先級(jí)擁有的信號(hào)燈上。該情況在不同優(yōu)先級(jí)共享相同的保護(hù)資源時(shí)是客觀存在的。此時(shí),反轉(zhuǎn)的時(shí)間有限或可估計(jì)時(shí),是可接受的。然而,如果在優(yōu)先級(jí)反轉(zhuǎn)期間,低優(yōu)先級(jí)任務(wù)被中等優(yōu)先級(jí)任務(wù)搶占,則反轉(zhuǎn)的時(shí)間則是不確定,該種情況應(yīng)該避免,可以通過使得所有使用相同信號(hào)燈的任務(wù)具有相同的優(yōu)先級(jí)。
(???這個(gè)和Vxworks有點(diǎn)不一樣??)
指示某確定系統(tǒng)事件發(fā)生。一個(gè)事件由事件組中的單個(gè)位表示,該位叫事件標(biāo)志位。每個(gè)事件組有個(gè)32個(gè)事件標(biāo)志位。
用AND/OR去設(shè)置或清除事件標(biāo)志。此外,當(dāng)事件被接收后,事件標(biāo)志可能被自動(dòng)復(fù)位。
信號(hào)在某些方面和事件類似,然而,在操作上大不相同。時(shí)間標(biāo)志的使用天生是同步的,任務(wù)指導(dǎo)指定的服務(wù)需要被給定后,才會(huì)去存取事件標(biāo)志,判斷其是否存在。信號(hào)操作為異步的,當(dāng)信號(hào)存在時(shí),任務(wù)預(yù)先指定的信號(hào)處理例程被執(zhí)行,而任務(wù)被懸掛。每個(gè)任務(wù)可以處理32個(gè)信號(hào)。每個(gè)信號(hào)由單個(gè)位表示。
信號(hào)處理例程:必須在任何信號(hào)被處理前,指定信號(hào)處理例程。在信號(hào)處理例程內(nèi)部遵守的約束和高級(jí)終端服務(wù)差不多。基本上,大部分NP服務(wù)都是可用的,但自身懸掛需要避免。
使能信號(hào)處理:缺省信號(hào)處理是Diable的。
信號(hào)清除:當(dāng)引用信號(hào)處理例程后,信號(hào)自動(dòng)被清除。信號(hào)處理例程不會(huì)被新的信號(hào)例程中斷。此外,對(duì)信號(hào)進(jìn)行懇求(solicited)請(qǐng)求,信號(hào)被清除。注意??!任務(wù)不能在信號(hào)懇求時(shí)懸掛。
多個(gè)信號(hào):一旦信號(hào)例程開始,該任務(wù)的信號(hào)就被清除。信號(hào)處理不會(huì)被新的信號(hào)請(qǐng)求終止,在當(dāng)前信號(hào)處理完成后處理新的信號(hào)。先前發(fā)送的相同信號(hào)被拋棄。
絕大部分實(shí)時(shí)系統(tǒng)需要周期時(shí)間間隔的處理。每個(gè)NP任務(wù)有一個(gè)內(nèi)建的時(shí)鐘,該時(shí)鐘用于提供任務(wù)睡眠或系統(tǒng)調(diào)用懸掛超時(shí)。
Ticks(嘀嗒):時(shí)間的基本單位。每個(gè)Tick對(duì)應(yīng)單個(gè)硬件時(shí)鐘中斷。每個(gè)Tick表示的實(shí)際時(shí)間量有用戶編程設(shè)定。
錯(cuò)誤邊界:時(shí)鐘請(qǐng)求可能比實(shí)際的時(shí)間早一個(gè)Tick,這是因?yàn)樵跁r(shí)鐘請(qǐng)求后,Tick可以馬上發(fā)生。
硬件需求:NP需要周來(lái)自迎接的周期時(shí)鐘中斷。如果沒有這個(gè)中斷,時(shí)鐘工具將不可用。然而,其他的NP工具不會(huì)因?yàn)槿鄙贂r(shí)鐘工具而被影響(!!強(qiáng),J)
連續(xù)時(shí)鐘:NP維護(hù)一個(gè)連續(xù)技術(shù)Tick時(shí)鐘,其最大值為4,294,967,294 (232),達(dá)到最大值后,自動(dòng)復(fù)位。該連續(xù)時(shí)鐘被保留,不用于其他應(yīng)用使用,可以被應(yīng)用在任何時(shí)候讀或?qū)憽?/p>
任務(wù)時(shí)鐘:每個(gè)任務(wù)有一個(gè)內(nèi)建時(shí)鐘能夠。用于任務(wù)睡眠或懸掛超時(shí),此外,對(duì)需要時(shí)間片的任務(wù),有個(gè)時(shí)間片時(shí)鐘可用。
應(yīng)用時(shí)鐘:NP提供給應(yīng)用可編程時(shí)鐘。當(dāng)該時(shí)鐘到時(shí),執(zhí)行用戶指定的例程。該例程作為高級(jí)中斷服務(wù)例程執(zhí)行。因此,自懸掛請(qǐng)求是不允許的。此外,處理時(shí)間應(yīng)該盡可能的短。
重新調(diào)度:當(dāng)時(shí)鐘過期,預(yù)先指定例程被執(zhí)行。執(zhí)行結(jié)束后,時(shí)鐘可以消失或重新調(diào)度。如果重新調(diào)度值為零,則初次過期后,時(shí)鐘消失。如果不為零,則重新調(diào)度時(shí)鐘,設(shè)定為這個(gè)調(diào)度值。
Enable/Disable:在創(chuàng)建期間時(shí)鐘被自動(dòng)使能??梢员粍?dòng)態(tài)的使能或Diable。
中斷是提供隊(duì)內(nèi)部或外部事件立刻反應(yīng)的機(jī)制。當(dāng)中斷發(fā)生時(shí),處理器懸掛當(dāng)前執(zhí)行路徑,把控制流轉(zhuǎn)移到中斷服務(wù)程序(ISR)。一個(gè)中斷的精確操作是跟處理器相關(guān)。
NP支持可管理或不可管理的ISRs??晒芾鞩SR是指那些不需要保存和恢復(fù)上下文的情況,而不可管理是指其負(fù)責(zé)保存和恢復(fù)所用泳道的寄存器。可管理的ISR可以用C或匯編寫成;而不可管理的ISR幾乎都是匯編寫成。
保護(hù):對(duì)于所有的實(shí)時(shí)內(nèi)核,中斷總是產(chǎn)生一些感興趣的問題。NP當(dāng)然也不例外。主要問題來(lái)自于ISRs需要存取的NP的服務(wù)。表面上,這個(gè)看起來(lái)不是個(gè)問題,然而,其需要在系統(tǒng)服務(wù)代用期間,防止同時(shí)被ISR存取。最簡(jiǎn)單的方法是在終端服務(wù)期間鎖住中斷。
對(duì)中斷響應(yīng)快速實(shí)時(shí)系統(tǒng)的基礎(chǔ)。因此,鎖住中斷來(lái)保護(hù)內(nèi)部數(shù)據(jù)是不被希望的。NP處理這個(gè)問題是通過把應(yīng)用ISR分為高級(jí)和低級(jí)部分。
低級(jí)ISR(LISR):LISR和正常ISR一樣,使用當(dāng)前的堆棧。NP在調(diào)用LISR前保存上下文,執(zhí)行LISR后恢復(fù)上下文。因此,LISR可用C寫,而且可以調(diào)用其他C例程。然而,僅有少量的NP服務(wù)對(duì)LISR可用。如果中斷處理例程需要其他的NP服務(wù),則高級(jí)ISR(HISR)被激活。NP支持多LISR嵌套。
高級(jí)ISR(HISR):HISR被動(dòng)態(tài)創(chuàng)建或刪除。每個(gè)HISR擁有自己的堆棧和自己的控制塊,其內(nèi)存有應(yīng)用提供。當(dāng)然,在LISR激活前,HISR必須被創(chuàng)建。
由于HISR有自己的堆棧和控制塊,當(dāng)其存取正在被存取的NP數(shù)據(jù)結(jié)構(gòu)時(shí),可以被臨時(shí)阻塞。
HISR可以存取絕大部分NP服務(wù),除了自懸掛服務(wù)。此外,由于HISR不能懸掛NP服務(wù),其懸掛參數(shù)必須總是被設(shè)定為NU_NO_SUSPEND。
HISR有3個(gè)優(yōu)先級(jí)可用,如果在處理低優(yōu)先級(jí)的HISR時(shí),高優(yōu)先級(jí)的HISRj激活,則低優(yōu)先級(jí)的被"搶占",這個(gè)任務(wù)搶占是一樣的。相同優(yōu)先級(jí)的HISR根據(jù)激活順序,依次執(zhí)行(注意!不是輪轉(zhuǎn)哦?。。┰谡5娜蝿?wù)調(diào)度以前,所有激活的HISR被執(zhí)行。
每個(gè)HISR有個(gè)激活計(jì)數(shù)器。該計(jì)數(shù)器用于保證每個(gè)激活都被執(zhí)行一次。
(略)
聯(lián)系客服