劉洲洲,李 賀
(1.西安航空技術高等專科學校電氣工程系,西安 710077;2.中國電子科技集團公司第四十七研究所,沈陽 110032)
隨著嵌入式系統的飛速發展,嵌入式實時操作系統廣泛地應用在制造工業、過程控制、通訊、儀器儀表、汽車、船舶、航空航天、軍事、裝備、消費類產品等方面。今天嵌入式系統帶來的工業年產值超過了1 萬億美元。當前嵌入式操作系統有數百種,比較流行的有Nucleus Plus,QNX,Lynx OS,Psos,VRTX,VXWorks,Windows CE 等。它們各有特色,用戶可以根據自身的軟硬件環境要求,選擇合適的操作系統。Nucleus 已經成為嵌入式應用的潮流和方向,剖析Nucleus 中多進程控制的實現方法具有重要的意義[1]。
嵌入式實時操作系統Nucleus是美國著名RTOS 廠商ATI(AcceleratedTechnologyInc)公司,為實時嵌入式應用而設計的一個搶先式多任務操作系統內核。只需一次性購買Licenses,就可以獲得操作系統的源碼。
Nucleus 對于各層協議都提供源碼,其95%的代碼是用ANSIC 寫成的,非常便于移植并支持當前流行的大多數RISC、CISC、DSP 處理器,比如:80x86(實時、保護模式)、68xxx、PowerPC、i960、MIPS、SH、ARM、ColdFire 等。Nucleus 系統對于不同的處理器,操作系統的源碼大部分是相同的,只有5%的源碼是用匯編寫的跟CPU 有關。如果使用另外的CPU,則只用修改5、6個匯編程序就可以進行移植。但是對于不同系列的處理器,它們的Compiler、Linker、Debugger是不同的,而且編譯預處理的過程也是不一樣的,這就要投入一部分力量去進行操作系統的移植[2]。
Nucleus 不用寫板支持軟件包(BSP),因為操作系統已經開放,不同的目標板在操作系統BOOT時可以通過修改源碼進行不同的配置,同時調試時也可以跟蹤到中斷、寄存器那一級,簡化了硬件調試。Nucleus PLUS是一組C 函數庫,應用程序代碼與核心函數連接在一起,生成一個目標代碼,下載到目標板的RAM 中或直接燒錄到目標板的ROM 中執行。在典型的目標環境中,Nucleus PLUS 核心代碼區一般不超過20K 字節大小,內核規模非常小。
Nucleus 系統結構如圖1 所示。

圖1 Nucleus 系統結構框圖
系統復位時,系統從驅動引導,開始對硬件的Register、端口、中斷、clock 及必要的外設進行初始化。
驅動初始化成功后,進入Nucleus 系統層,將整個控制權交給操作系統。
在操作系統層,開始也是進行一些操作系統的初始化工作,重載操作系統所需的中斷服務程序(ISR),啟動操作系統所需的時鐘,調用Application_Initialize()函數。Application_Initialize()函數是操作系統為Application 提供的接口,圖形系統、驅動、文件系統、GUI、啟動Desktop 任務等初始化工作都在這個函數中進行。最后進入OS的控制中心,進行任務調度管理。將控制權交給操作系統之前,驅動層不能調用任何操作系統層的函數。由于Nucleus 操作系統調用的模塊增多,會導致__main()函數中啟動SWI 中斷,從而導致系統異常。因此,在bios模塊中不能把retarget.c 文件連接到目標碼中,但是這樣做又會導致程序的全局變量初始化失敗,解決的方法是在BIOS 啟動后,不調用__main(),改調用
Init_SysData()。
(1)啟動部分
中斷向量表位于系統空間的邏輯地址0x0 處,具有如下結構:


(2)BIOS 層應該提供如上所述的中斷向量表、系統啟動代碼、中斷服務程序,來保證系統的基本運行。處理器復位后即進入系統啟動入口(0x0),執行BIOS 所提供的啟動程序。在這里BIOS 應該初始化或重新設置MCU/DSP的狀態或參數;另外,BIOS 應該提供可供OS 重載的中斷服務程序功能。BIOS 啟動完畢即進入NUCLEUS 操作系統的啟動部分(OsStartup()),將控制權交給OS,OS 會通過BIOS提供的中斷服務重載功能將中斷入口切換到自己的中斷服務程序中。同時BIOS 還需要告訴OS系統RAM 空間的offset 和size,OS 將據此進行資源分配等,BIOS 應該為OS 分配一個專用的定時器Timer,供Nucleus OS 使用;同時返回此定時器的中斷向量號。
(3)中斷部分:如上所述,驅動應該提供可供操作系統重載的中斷服務功能。驅動向操作系統提供接口:Extern void ReloadIntEntry(void*handler);功能:載入Nucleus OS的中斷服務跳轉表。操作成功后,硬件的所有中斷都進入Nucleus OS 中斷管理中心,然后,由Nucleus OS 中斷管理中心調度該中斷的低級中斷服務子程序LISR。
(4)LISR(低級中斷服務程序)和HISR(高級中斷服務程序)部分:Nucleus的中斷服務是一種管理式的服務,分為LISR 和HISR。每一種中斷都需要向操作系統注冊該中斷向量,中斷產生后通過該中斷向量注冊的低級中斷服務程序(LISR)來激活高級的中斷服務程序(HISR)。LISR 主要完成硬件中斷的處理及激活HISR。HISR的調度類似于任務,具有優先級,可以使用大多數Nucleus的系統調用。OS 封裝了中斷過程中的現場保護、恢復和調度等,向BIOS 層提供如下接口:STATUS OS_Register_LISR(U8 vector,void (*new_lisr)(INT));功能:向Nucleus OS 注冊一個低級中斷服務程序(LISR)。用戶每打開一個新的硬件中斷,都必須先調用此功能函數向Nucleus OS 注冊,否則,將出錯。
(5)操作系統定時器:驅動應該為操作系統分配一個專用的定時器Timer,供Nucleus OS 使用;同時返回此定時器的中斷向量號。驅動向操作系統提供的接口:Extern U32 OpenOsTimer(U16 ms);功能:打開操作系統專用的定時器。Extern void ClearOsTimerPnd(void);功能:進入Timer 中斷后,清除Timer 中斷的狀態位,使Timer 中斷復位。
(6)UART 驅動:UART 應該向OS 提供UART設備的初始化、參數的設置等功能。OS 內置了I/O設備的統一管理模塊,包含兩個I/O 緩沖,通信事件處理等等。操作系統為每個UART 設備分配一個設備號,對應如下:

通信設備驅動管理為UART 提供下列接口:
Extern BOOLEAN commdev_read(U8_T dev_id,U8_T code);功能:設備接收到一個字符后,交給OS的通信設備驅動管理;
Extern BOOLEAN commdev_write(U8_T dev_id,U8_T *pCode);功能:設備發送一個字符前,從OS的隊列管理模塊中取出下一個要發送的字節;
(7)驅動的初始化Nucleus OS 啟動后,會回調一個 驅動提供的初始化所有Driver的函數,該函數接口如下所示:void DriverInit(void);驅動中的所有初始化工作都必須在此回調函數中完成,否則系統異常。
Nucleus是一種實時、多任務的嵌入式操作系統。它可以管理各種系統資源,調度任務的運行。Nucleus 使嵌入式多任務開發省時、省力,并且提高效率。它已成為嵌入式應用的潮流和方向。深入剖析Nucleus 驅動通信接口的實現機理,對于嵌入式實時操作系統的開發具有重要意義。
[1]Nucleus Plus Reference Manual[M].Unites States:AcceleratedTechnology,Inc.,2000.
[2]魏振華.嵌入式實時操作系統Nucleus 中線程控制部件的實現[J].計算機應用與研究,2003,16(4);97-99.