賀翔,胡俊祥,戴鈺
(1.廣州海格通信集團股份有限公司,廣東廣州,510000;2.廣東廣播電視臺,廣東廣州,510000)
VxWorks操作系統作為常用的高性能實時操作系統之一,在衛星通信系統中有著其獨特的優勢。其開放式結構和對工業標準的支持,使得開發人員更易于設計高效的嵌入式系統,并可以以很小的工作量移植到其它不同的處理器上;該操作系統軟件為程序員提供了高效的任務調度、中斷管理、實時的系統資源以及實時的任務間通信,使得程序員可以將盡可能多的精力放在應用程序本身,而不再關心系統資源的管理[1]。
Nor Flash及Nand Flash是嵌入式系統中主流的兩種Flash類型。Nor Flash的優點在于支持芯片內執行(XIP,eXecute In Place),這樣應用程序就可以直接在 fl ash閃存內運行,而不必把代碼讀到系統RAM中。Nor Flash的傳輸效率很高,但是很低的寫入和擦除速度大大影響了它的性能。另外,由于其容量小,同等容量下價格貴,一般情況下往往配合Nand Flash一同使用。Nand Flash的單元尺寸幾乎是Nor器件的一半,由于生產過程更為簡單,Nand 結構可以在給定的模具尺寸內提供更高的容量,也就相應地降低了價格。但是Nand 器件使用復雜的I/O口來串行地存取數據,只有8個引腳用來傳送控制、地址和數據信息,不支持芯片內執行。故Nor Flash一半用于存儲程序,而Nand Flash一般用于存儲數據。
s3c2440是samsung公司的一款常用的ARM9系列處理器,由于該處理器里有一個內置的SRAM,叫做stepping stone,系統啟動加電后,能夠把Nand Flash上的起始4KB的內容拷貝到SRAM里執行,這樣就可以實現從Nand Flash啟動。本文采用該款處理器,以及K9F2G08U0B型號的Nand Flash、K4S561632N型號的SDRAM、DM9000網卡芯片等作為硬件平臺,并在該平臺下完成VxWorks操作系統的移植,改造了VxWorks啟動過程,實現了采用Nand Flash啟動該操作系統。本嵌入式系統方案對于提升綜合性能、減少硬件復雜度、節約硬件成本有著重要意義。
VxWorks的啟動流程如圖1所示。系統上電之后,從romInit.S開始運行。首先調用的函數就是romInit( ),該函數主要完成以下功能:
(1)禁止中斷;
(2)初始化堆棧;
(3)保存啟動類型(冷/熱啟動);
(4)初始化CPU相關寄存器;
(5)跳轉到bootInit.c中的romStart()函數;

圖1 Vxworks啟動流程
函數romStart()主要完成以下功能:
把代碼段和數據段復制到RAM當中;
如果映像是壓縮版本的,則需要完成程序映像的解壓縮。
跳轉到bootCon fi g.c的usrInit( )函數。
函數usrInit( )設置cache的工作模式,完成板級硬件初始化后,調用sysHwInit( )、usrKernelInit( )、KernelInit( ),初始化內核,產生根任務usrRoot( )。在usrRoot根任務中解析Bootline,產生bootCmdLoop任務,用于啟動、加載VxWorks映像。
在加載VxWorks映像完成后,程序跳轉到sysAlib.S文件中的VxWorks image的入口點_sysInit。此時系統再次進行了一次初始化,進入了第二階段啟動過程[2-4]。本文主要對第一階段啟動過程進行改造,以實現在啟動時能夠調用NandFlash上的程序完成VxWorks操作系統的正常啟動過程。
由于s3c2440處理器內置的SRAM僅能拷貝Nand Flash上的前4k代碼運行,根據上述VxWorks啟動過程分析可知,程序必須在romInit( )函數完成硬件初始化之后,在romStart( )函數完成映像解壓縮之前完成把Nand Flash上程序拷貝到內存中的過程,即修改替換原romStart( )函數中完成把程序拷貝到RAM中的過程。系統在Make fi le和con fi g.h中通過三個宏定義來確定系統在什么內存地址運行BOOTROM,分別是:ROM _TEXT _ADRS(ROM起始地址)、ROM_LOW_ADRS(VxWorks啟動地址)和RAM_HIGH_ADRS(Bootrom程序入口地址)。這里需要添加從Nand Flash把程序拷貝入內存的函數[5],定義在nand.c文件中。定義該函數:

該函數的部分主要代碼如下:


在完成該部分函數的添加修改之后,為了在編譯中把RdNF2SDRAM函數一同編譯進去,需要在make fi le文件中加入:

由于SRAM空間只有4k,為了保證在前4k代碼內完成程序的復制,需要保證該段拷貝程序在前4k代碼內,這就需要通過修改rules.bsp文件修改編譯順序,如:

修改使$(BOOT_EXTRA)較先編譯,鏈接到程序靠前的位置,或者也可以直接使nand.o較先編譯、鏈接,可保證在前4k代碼內完成程序的復制。
完成上述過程后,進行通過移植相應的外設驅動程序完成BSP開發。VxWorks下支持兩個形式的網卡驅動,一種是兼容BSD4.4的網卡驅動,另一種是END(Enhanced Network Drivers)網卡驅動,由于后者使用比較簡單而且VxWorks對該種驅動支持性好[6],本文采用END網卡驅動。本系統可通過網卡下載VxWorks映像。
如圖2所示,使用Tornado生成好boorom,然后通過H-JTAG燒寫到NandFlash上,跳線設置S3C2440從NandFlash啟動。
打開服務器端WFTPD,設置好VxWorks鏡像的路徑、用戶名及密碼后,重新上電啟動S3C2440,打開超級終端,修改啟動引導行,主要包括板子IP地址、主機IP地址、FTP用戶名及密碼、VxWorks鏡像文件路徑等。然后輸入@啟動,在WFTPD窗口上看到VxWorks鏡像下載的信息,如圖3所示。
VxWorks鏡像下載完成后,超級終端上變顯示了熟悉的VxWorks啟動畫面,如圖4所示。至此,完成了整個啟動過程。

圖3 VxWorks鏡像下載

圖4 VxWorks啟動畫面
本文分析了VxWorks啟動過程,提出了使用Nand Flash啟動Vxworks的設計思路,按照上述步驟進行代碼編寫與調試,從網絡下載VxWorks映像,實現了VxWorks的正常啟動。相比傳統的Nor Flash用于存儲程序、Nand Flash用于存儲數據的系統,降低了硬件設計復雜度、提高了穩定性、節約了開發成本。
* [1]Wind River System Inc.VxWorks 6.0 Device Driver Develop—er’s Guide [Z].2004
* [2]孔祥營,柏桂枝.嵌入式實時操作系統VxWorks及其開發環境Tornado[M].北京:中國電力出版社.2002
* [3]徐少毅,李君龍. 基于VxWorks的BSP概念與開發[J].電子產品世界,2002,03(B)
* [4]馮榮尉.基于ARM9的嵌入式硬件設計和VxWorks操作系統移植[D].北京理工大學,2008
* [5] Samsung Electronics Co.LTD. K9XXG08 U0B User’s Manu—al[Z].2005
* [6] 周啟平,張揚.VxWorks下設備驅動程序及BSP開發指南[M].北京:中國電力出版社,2004