歡迎您光臨本站 登入註冊首頁

Nucleus Plus的讀書筆記

admin @ 2014-03-25 , reply:0

概述

以前用過Vxworks,由於工作需要,接觸到Nucleus,隨手寫的一個讀書筆記,主要注重NucleusPlus(NP)和其他EmbeddedOS的差別。1.1   &n……

以前用過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有個激活計數器。該計數器用於保證每個激活都被執行一次。

1.16    I/O驅動
(略)
2004/4
(後來懶,就沒有寫下去了,:)


[admin via 研發互助社區 ] Nucleus Plus的讀書筆記已經有3278次圍觀

http://cocdig.com/docs/show-post-42197.html