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