從一般意義上來說,組件(Component)是系統中可以明確辨識的組成部分,一個不透明的功能實現體。軟件開發中,組件是對數據和方法的簡單封裝,它具有約定式規范的接口。組件具有面向對象的特征,具有功能獨立性、高度的可重用性、與語言和平台無關性等特點。軟件組件是軟件系統中具有一定意義的、相對獨立的構成部分,是一個通過規定的接口提供一組服務代碼的執行單元,這個執行單元的特點是高內聚、低偶合。組件的接口和組件的實現相分離,調用者只需要知道接口並訪問接口就可以使用組件。接口相對固定,組件功能和實現的變化不應該引起接口的變化。軟件組件是軟件復用的關鍵技術。
組件技術是90年代初出現的一種軟件開發技術,它是在結構化設計和面向對象技術的基礎上發展起的,是面向對象技術之後的軟件開發的標准方法系,是面向對象的開發技術的延伸。軟件組件開發主要是開發與維護系統構造過程中用到的組件。將軟件組件作為一個單獨的過程,目的是將組件作為構造軟件的“零部件”。有了組件的概念和組件技術,軟件開發就可以借鑒建築學和現代制造業中成功的實例,先構造出軟件的總體架構,然後根據組件重用技術,在架構上根據需要組裝上所需功能的組件,最後形成應用程序。版本更新只須用新的組件替換舊組件即可實現,而無須改動整個程序,也不需要對整個程序進行重新編譯。
Nucleus PLUS系統采用軟件組件的形式構成以增加系統的代碼清晰性、可靠性和可重用性,使系統模塊化、易於維護。Nucleus PLUS由多個軟件組件構成,每個組件都有唯一的用途和特定的外部接口。每個組件的使用通過這些接口的調用實現,而組件內部的數據結構絕大多數情況下都不可以被其他組件直接訪問。這種組件架構使得Nucleus PLUS的每個軟件組件可以被輕松的替換和重用。
每個軟件組件都由兩個頭文件和若干個源文件組成,其中源文件大多用C語言寫成,少數用匯編語言寫成。頭文件中一個用於數據類型定義和常量聲明,另外一個用於聲明組件的外部接口。下表是每個組件文件的概述,組件不一定還包含表中所有的文件,其中XX標示組件名縮寫。
在支持用戶模式和管理模式的處理器架構上,Nucleus PLUS 內核和所有應用任務都運行在管理模式。這種做法實現簡單、任務系統調用開銷小,但是每個任務都能訪問任何資源。
所有需要調用Nucleus PLUS系統服務或者使用Nucleus數據類型的用戶代碼源文件中都要包含頭文件“NUCLEUS.h”,該文件包含數據類型、常量定義以及Nucleus PLUS服務的所有函數聲明。事實上,“NUCLEUS.h”中所有以“NU_”開頭的函數實質上在Nucleus各組件源代碼中是不存在的。絕大多數Nucleus函數都有一個真正執行操作的函數(各組件中定義)和一個調用真正執行函數前對用戶調用進行錯誤檢查的“殼”函數。錯誤檢查功能是可以停用的,不定義宏標示“NU_NO_ERROR_CHECKING”即可。NU_NO_ERROR_CHECKING的定義與否決定”NU_“函數真正映射的組件函數。
Nucleus Plus 系統共16個組件,分別討論如下(主要描述組件的功能):
所有的Nucleus PLUS組件控制的控制數據結構采用的都是鏈表,CS即負責提供鏈接結構和鏈表操作函數,包括添加、刪除節點。
負責初始化和啟動Nucleus Plus 系統。初始化和啟動過程包含兩部分:具體硬件目標板依賴部分(處理器相關和板級初始化)先初始化,然後是Nucleus PLUS各組件和用戶程序的初始化。
INT_Initialize 子程序在Nucleus PLUS 系統中是最先運行的,負責所有與目標硬件板相關的初始化。INT_Initialize 完成後將控制權轉移到高級Nucleus PLUS 初始化子程序INC_Initialize上並不再返回。INC_Initialize調用所有的Nucleus plus組件初始化函數、調用Application_Initialize創建用戶任務等對象,最後將控制權交給調度函數TCT_schedule,系統啟動完畢。初始化具體過程參見博文”Nucleus PLUS的啟動、運行線程和中斷處理“。
負責Nucleus Plus的搶占式實時任務和HISR的調度管理。每個用戶應用由多個任務組成,一個任務就是具有特定目的的半獨立程序片段,任務處於五種狀態之一--運行、就緒、掛起、終止、完成。任務具有不同的優先級,高優先級任務能夠搶占低優先級任務,同優先級任務按照進入”就緒狀態“的順序調度,優先級從0-255遞減。
Nucleus PLUS每一個任務都有一個控制結構體稱為線程控制塊Thread Control Block(TCB)-TC_TCB,任務支持動態的創建和刪除,TC通過一個雙向鏈表TCD_Created_Tasks_List管理所有的任務,全局變量TCD_Total_Tasks表示已創建的總任務數。
TCD_Priority_List是一個大小為256的TCB指針數組(數組大小與Nucleus PLUS優先級數相同),每個數組指針是一個表的頭部(某元素為空則表示沒有該優先級的任務),該表的元素是具有相同優先級的進入就緒狀態的任務的TCB指針。即Nucleus PLUS維護一個指針數組來調度不同優先級的任務鏈表。
任務調度過程見博文”Nucleus PLUS任務調度“。
HISR是中斷處理例程的下半部分,能夠訪問絕大多數Nucleus PLUS任務(不可自動掛起)。HISR也是搶占式的,其優先級0-2遞減。HISR由LISR激活,因此必須事先創建並注冊。
HISR的管理和任務的管理是類似的,每個HISR都有一個控制結構TC_HCB和獨占的堆棧,TCD_Created_HISRs_List是一個存儲已創建HISR例程的雙向鏈表的表頭,TCD_Total_HISRs表示已創建的HISR總數。另外TC會維護兩個已激活的HISR表,表項分別是三個優先級已激活的HISR雙向鏈表的頭和尾。TC還通過鏈表維護LISR例程,包括中斷向量注冊和LISR入口函數。TC組件提供了HISR的創建、刪除、激活等函數。
負責管理所有的Nucleus Plus 定時器設備。Nucleus Plus 的基本定時單元為一個Tick,它相當於一次硬件定時器中斷。系統層面上,定時器用於任務管理-定時睡眠和喚醒等;用戶應用程序層面,定時器用於那些需要有超時處理機制的地方。
定時器支持動態創建/刪除,每個定時器都有一個控制結構TM_TCB、TMD_HISR或TM_APP_TCB,分別用於系統任務定時器、HISR定時器和應用程序專用計時器。TM通過鏈表維護已創建的、已激活的定時器列表。TM提供一個系統定時器TMD_System_Clock。
定時器函數包括創建、開始、停止、重置、刪除、超時處理等。
負責管理Nucleus Plus 所有的郵箱服務,提供一種低開銷的進程間通信機制。每個郵箱包含一個長度為4個32-bit字的消息。郵箱可以由用戶動態創建/刪除,支持任務的掛起和恢復。
每個郵箱都有一個控制塊Mailbox Control Block (MCB) MB_MCB,MB通過雙向鏈表維護已創建的郵箱。郵箱的任務掛起/喚醒支持FIFO順序和任務優先級順序進行,也是通過維護一個雙向鏈表進行,每有一個任務掛起在郵箱上就會創建一個控制塊MB_SUSPEND結構體。
MB提供了郵箱的創建、刪除、消息發送/獲取、重置、清空、廣播等函數。
分別負責管理所有的Nucleus Plus 隊列服務,管理所有的Nucleus Plus 管道服務。兩部件的管理與MB是類似的,區別在於:隊列的消息是一個或者多個32-bit字,管道的消息是一個或者多個8-bit字節。
負責管理所有的Nucleus Plus 信號量服務,用於多個任務間的同步。信號量支持動態創建/刪除,SM可提供的信號量計數范圍是0-4,294,967,294,其管理與MB類似。
負責管理所有的Nucleus Plus 事件組服務,每個事件組包含32個事件標示(event flag),即32位無符號整型數的每個位即是一個event flag(為1表示事件發生,0表示未發生)。其管理與MB類似。
負責管理所有的Nucleus Plus 分區內存,分區內存的內存池指的是由用戶指定的內存總數目固定、每個分區(partition)的字節數也確定的內存。分區內存支持動態創建和任務的掛起/喚醒(FIFO或者任務優先級順序)。
每個分區內存都需要一個控制塊Partition Memory Control Block (PCB)-PM_PCB(額外占據內存,不包含在分區內存內),PM通過雙向鏈表維護所有創建的分區內存。每個分區內存的可用分區由一個null結尾的單鏈表控制,每個可用分區由頭結構體PM_HEADER開始。
負責管理所有的Nucleus Plus 動態內存服務,動態內存池的起始位置和長度由用戶指定,支持動態創建/刪除和任務掛起/喚醒。動態內存的分配按照first fit算法分配,沒有固定字節數的分區。DM的管理與PM類似。
負責管理所有的Nucleus Plus 輸入/輸出設備的驅動服務,提供了一種通用的、相似的s驅動服務接口,包括初始化、分配、釋放、輸入/輸出、設備狀態獲取和服務申請終止等服務。
負責管理所有的Nucleus Plus 系統錯誤。
負責Nucleus Plus的歷史設備管理。
負責Nucleus Plus的許可證管理。
負責Nucleus Plus 的版本管理。