劉洲洲,李 賀
(1.西安航空技術(shù)高等專(zhuān)科學(xué)校電氣工程系,西安 710077;2.中國(guó)電子科技集團(tuán)公司第四十七研究所,沈陽(yáng) 110032)
隨著嵌入式系統(tǒng)的飛速發(fā)展,嵌入式實(shí)時(shí)操作系統(tǒng)廣泛地應(yīng)用在制造工業(yè)、過(guò)程控制、通訊、儀器儀表、汽車(chē)、船舶、航空航天、軍事、裝備、消費(fèi)類(lèi)產(chǎn)品等方面。今天嵌入式系統(tǒng)帶來(lái)的工業(yè)年產(chǎn)值超過(guò)了1 萬(wàn)億美元。當(dāng)前嵌入式操作系統(tǒng)有數(shù)百種,比較流行的有Nucleus Plus,QNX,Lynx OS,Psos,VRTX,VXWorks,Windows CE 等。它們各有特色,用戶可以根據(jù)自身的軟硬件環(huán)境要求,選擇合適的操作系統(tǒng)。Nucleus 已經(jīng)成為嵌入式應(yīng)用的潮流和方向,剖析Nucleus 中多進(jìn)程控制的實(shí)現(xiàn)方法具有重要的意義[1]。
嵌入式實(shí)時(shí)操作系統(tǒng)Nucleus是美國(guó)著名RTOS 廠商ATI(AcceleratedTechnologyInc)公司,為實(shí)時(shí)嵌入式應(yīng)用而設(shè)計(jì)的一個(gè)搶先式多任務(wù)操作系統(tǒng)內(nèi)核。只需一次性購(gòu)買(mǎi)Licenses,就可以獲得操作系統(tǒng)的源碼。
Nucleus 對(duì)于各層協(xié)議都提供源碼,其95%的代碼是用ANSIC 寫(xiě)成的,非常便于移植并支持當(dāng)前流行的大多數(shù)RISC、CISC、DSP 處理器,比如:80x86(實(shí)時(shí)、保護(hù)模式)、68xxx、PowerPC、i960、MIPS、SH、ARM、ColdFire 等。Nucleus 系統(tǒng)對(duì)于不同的處理器,操作系統(tǒng)的源碼大部分是相同的,只有5%的源碼是用匯編寫(xiě)的跟CPU 有關(guān)。如果使用另外的CPU,則只用修改5、6個(gè)匯編程序就可以進(jìn)行移植。但是對(duì)于不同系列的處理器,它們的Compiler、Linker、Debugger是不同的,而且編譯預(yù)處理的過(guò)程也是不一樣的,這就要投入一部分力量去進(jìn)行操作系統(tǒng)的移植[2]。
Nucleus 不用寫(xiě)板支持軟件包(BSP),因?yàn)椴僮飨到y(tǒng)已經(jīng)開(kāi)放,不同的目標(biāo)板在操作系統(tǒng)BOOT時(shí)可以通過(guò)修改源碼進(jìn)行不同的配置,同時(shí)調(diào)試時(shí)也可以跟蹤到中斷、寄存器那一級(jí),簡(jiǎn)化了硬件調(diào)試。Nucleus PLUS是一組C 函數(shù)庫(kù),應(yīng)用程序代碼與核心函數(shù)連接在一起,生成一個(gè)目標(biāo)代碼,下載到目標(biāo)板的RAM 中或直接燒錄到目標(biāo)板的ROM 中執(zhí)行。在典型的目標(biāo)環(huán)境中,Nucleus PLUS 核心代碼區(qū)一般不超過(guò)20K 字節(jié)大小,內(nèi)核規(guī)模非常小。
Nucleus 系統(tǒng)結(jié)構(gòu)如圖1 所示。
圖1 Nucleus 系統(tǒng)結(jié)構(gòu)框圖
系統(tǒng)復(fù)位時(shí),系統(tǒng)從驅(qū)動(dòng)引導(dǎo),開(kāi)始對(duì)硬件的Register、端口、中斷、clock 及必要的外設(shè)進(jìn)行初始化。
驅(qū)動(dòng)初始化成功后,進(jìn)入Nucleus 系統(tǒng)層,將整個(gè)控制權(quán)交給操作系統(tǒng)。
在操作系統(tǒng)層,開(kāi)始也是進(jìn)行一些操作系統(tǒng)的初始化工作,重載操作系統(tǒng)所需的中斷服務(wù)程序(ISR),啟動(dòng)操作系統(tǒng)所需的時(shí)鐘,調(diào)用Application_Initialize()函數(shù)。Application_Initialize()函數(shù)是操作系統(tǒng)為Application 提供的接口,圖形系統(tǒng)、驅(qū)動(dòng)、文件系統(tǒng)、GUI、啟動(dòng)Desktop 任務(wù)等初始化工作都在這個(gè)函數(shù)中進(jìn)行。最后進(jìn)入OS的控制中心,進(jìn)行任務(wù)調(diào)度管理。將控制權(quán)交給操作系統(tǒng)之前,驅(qū)動(dòng)層不能調(diào)用任何操作系統(tǒng)層的函數(shù)。由于Nucleus 操作系統(tǒng)調(diào)用的模塊增多,會(huì)導(dǎo)致__main()函數(shù)中啟動(dòng)SWI 中斷,從而導(dǎo)致系統(tǒng)異常。因此,在bios模塊中不能把retarget.c 文件連接到目標(biāo)碼中,但是這樣做又會(huì)導(dǎo)致程序的全局變量初始化失敗,解決的方法是在BIOS 啟動(dòng)后,不調(diào)用__main(),改調(diào)用
Init_SysData()。
(1)啟動(dòng)部分
中斷向量表位于系統(tǒng)空間的邏輯地址0x0 處,具有如下結(jié)構(gòu):
(2)BIOS 層應(yīng)該提供如上所述的中斷向量表、系統(tǒng)啟動(dòng)代碼、中斷服務(wù)程序,來(lái)保證系統(tǒng)的基本運(yùn)行。處理器復(fù)位后即進(jìn)入系統(tǒng)啟動(dòng)入口(0x0),執(zhí)行BIOS 所提供的啟動(dòng)程序。在這里BIOS 應(yīng)該初始化或重新設(shè)置MCU/DSP的狀態(tài)或參數(shù);另外,BIOS 應(yīng)該提供可供OS 重載的中斷服務(wù)程序功能。BIOS 啟動(dòng)完畢即進(jìn)入NUCLEUS 操作系統(tǒng)的啟動(dòng)部分(OsStartup()),將控制權(quán)交給OS,OS 會(huì)通過(guò)BIOS提供的中斷服務(wù)重載功能將中斷入口切換到自己的中斷服務(wù)程序中。同時(shí)BIOS 還需要告訴OS系統(tǒng)RAM 空間的offset 和size,OS 將據(jù)此進(jìn)行資源分配等,BIOS 應(yīng)該為OS 分配一個(gè)專(zhuān)用的定時(shí)器Timer,供Nucleus OS 使用;同時(shí)返回此定時(shí)器的中斷向量號(hào)。
(3)中斷部分:如上所述,驅(qū)動(dòng)應(yīng)該提供可供操作系統(tǒng)重載的中斷服務(wù)功能。驅(qū)動(dòng)向操作系統(tǒng)提供接口:Extern void ReloadIntEntry(void*handler);功能:載入Nucleus OS的中斷服務(wù)跳轉(zhuǎn)表。操作成功后,硬件的所有中斷都進(jìn)入Nucleus OS 中斷管理中心,然后,由Nucleus OS 中斷管理中心調(diào)度該中斷的低級(jí)中斷服務(wù)子程序LISR。
(4)LISR(低級(jí)中斷服務(wù)程序)和HISR(高級(jí)中斷服務(wù)程序)部分:Nucleus的中斷服務(wù)是一種管理式的服務(wù),分為L(zhǎng)ISR 和HISR。每一種中斷都需要向操作系統(tǒng)注冊(cè)該中斷向量,中斷產(chǎn)生后通過(guò)該中斷向量注冊(cè)的低級(jí)中斷服務(wù)程序(LISR)來(lái)激活高級(jí)的中斷服務(wù)程序(HISR)。LISR 主要完成硬件中斷的處理及激活HISR。HISR的調(diào)度類(lèi)似于任務(wù),具有優(yōu)先級(jí),可以使用大多數(shù)Nucleus的系統(tǒng)調(diào)用。OS 封裝了中斷過(guò)程中的現(xiàn)場(chǎng)保護(hù)、恢復(fù)和調(diào)度等,向BIOS 層提供如下接口:STATUS OS_Register_LISR(U8 vector,void (*new_lisr)(INT));功能:向Nucleus OS 注冊(cè)一個(gè)低級(jí)中斷服務(wù)程序(LISR)。用戶每打開(kāi)一個(gè)新的硬件中斷,都必須先調(diào)用此功能函數(shù)向Nucleus OS 注冊(cè),否則,將出錯(cuò)。
(5)操作系統(tǒng)定時(shí)器:驅(qū)動(dòng)應(yīng)該為操作系統(tǒng)分配一個(gè)專(zhuān)用的定時(shí)器Timer,供Nucleus OS 使用;同時(shí)返回此定時(shí)器的中斷向量號(hào)。驅(qū)動(dòng)向操作系統(tǒng)提供的接口:Extern U32 OpenOsTimer(U16 ms);功能:打開(kāi)操作系統(tǒng)專(zhuān)用的定時(shí)器。Extern void ClearOsTimerPnd(void);功能:進(jìn)入Timer 中斷后,清除Timer 中斷的狀態(tài)位,使Timer 中斷復(fù)位。
(6)UART 驅(qū)動(dòng):UART 應(yīng)該向OS 提供UART設(shè)備的初始化、參數(shù)的設(shè)置等功能。OS 內(nèi)置了I/O設(shè)備的統(tǒng)一管理模塊,包含兩個(gè)I/O 緩沖,通信事件處理等等。操作系統(tǒng)為每個(gè)UART 設(shè)備分配一個(gè)設(shè)備號(hào),對(duì)應(yīng)如下:
通信設(shè)備驅(qū)動(dòng)管理為UART 提供下列接口:
Extern BOOLEAN commdev_read(U8_T dev_id,U8_T code);功能:設(shè)備接收到一個(gè)字符后,交給OS的通信設(shè)備驅(qū)動(dòng)管理;
Extern BOOLEAN commdev_write(U8_T dev_id,U8_T *pCode);功能:設(shè)備發(fā)送一個(gè)字符前,從OS的隊(duì)列管理模塊中取出下一個(gè)要發(fā)送的字節(jié);
(7)驅(qū)動(dòng)的初始化Nucleus OS 啟動(dòng)后,會(huì)回調(diào)一個(gè) 驅(qū)動(dòng)提供的初始化所有Driver的函數(shù),該函數(shù)接口如下所示:void DriverInit(void);驅(qū)動(dòng)中的所有初始化工作都必須在此回調(diào)函數(shù)中完成,否則系統(tǒng)異常。
Nucleus是一種實(shí)時(shí)、多任務(wù)的嵌入式操作系統(tǒng)。它可以管理各種系統(tǒng)資源,調(diào)度任務(wù)的運(yùn)行。Nucleus 使嵌入式多任務(wù)開(kāi)發(fā)省時(shí)、省力,并且提高效率。它已成為嵌入式應(yīng)用的潮流和方向。深入剖析Nucleus 驅(qū)動(dòng)通信接口的實(shí)現(xiàn)機(jī)理,對(duì)于嵌入式實(shí)時(shí)操作系統(tǒng)的開(kāi)發(fā)具有重要意義。
[1]Nucleus Plus Reference Manual[M].Unites States:AcceleratedTechnology,Inc.,2000.
[2]魏振華.嵌入式實(shí)時(shí)操作系統(tǒng)Nucleus 中線程控制部件的實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與研究,2003,16(4);97-99.