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