天天看點

VxWorks在S3C2410上的BSP設計

原文位址:http://www.cnblogs.com/b2tang/archive/2009/12/30/1636304.html

摘要:VxWorks是美國WindRiver公司設計開發的一種嵌入式實時作業系統,可移植性是對嵌入式作業系統的一個重要要求,VxWorks BSP(闆極支援包)正是實作可移植性的中間層軟體,使作業系統的應用代碼獨立于具體硬體.本文介紹了VxWorks BSP的開發,分析了VxWorks的啟動過程,給出了基于三星S3C2410處理器開發闆的BSP設計以及VxWorks的映像編譯下載下傳,其中重點介紹了BSP中幾個重要檔案和函數的設計,最後提出了開發調試過程中的幾個注意點。 

1 引言

VxWorks是美國WindRiver公司設計開發的一款嵌入式實時作業系統。能支援多種微處理器:PowerPC,x86,MIPS,ARM,SPARC等。它采用微核心結構,具有高可靠性、實時性、豐富的網絡協定、良好的相容性以及可裁減性等特點,同時具有友好的使用者開發環境。其中VxWorks很好的移植性通過BSP來實作,BSP使作業系統能夠獨立于具體硬體,對上層屏蔽具體的硬體,為系統元件以及應用程式提供統一的接口。

本文主要研究如何将VxWorks作業系統移植到基于三星S3C2410處理器硬體平台上,即BSP的設計。主要内容包括下面兩點:熟悉并掌握VxWorks映像種類,系統的啟動順序和過程,以及BSP軟體包中各檔案的組成和作用以及相應的設定檔案的修改;二是熟悉系統底層驅動,也就是要對開發闆的硬體環境有一個初步了解,這樣才可以結合具體硬體開發闆設計出相應的底層驅動程式。

2 BSP組成

2.1 BSP概念

對于嵌入式系統而言,并沒有像PC那樣的标準,存在着各種不同的嵌入式硬體平台,這就使得無法完全由作業系統來實作上層軟體與底層硬體的無關性。BSP正是采用當今嵌入式分層設計的介于作業系統和底層硬體的中間層。BSP通常是指針對具體的硬體平台,使用者所編寫的啟動代碼和部分裝置驅動程式的集合。它所實作的功能包括初始化,驅動部分裝置.最基本的BSP僅需要支援處理機複位,初始化,驅動序列槽和必要的時鐘處理。BSP的概念隻是針對嵌入式作業系統而言的,而像DOS,Windows,UNIX等BIOS作業系統是無BSP可言的。不過到目前為止,

嵌入式系統中也沒有對BSP有明确統一的定義,不同的嵌入式系統BSP實作的功能有所差别。在VxWorks系統中,對BSP描述為介于底層硬體環境和VxWorks之間的軟體接口,它的主要功能是系統加電後初始化目标機硬體,初始化作業系統及提供部分硬體的驅動程式。

2.2 BSP組成

其主要的兩部分組成為:初始化代碼,硬體驅動程式.

BSP的初始化部分是指從上電複位開始直到WIND核心和usrRoot()函數啟動的這段時間内系統的執行過程.具體包括:CPU初始化,裝置初始化以及系統初始化.CPU初始化CPU内部寄存器,裝置初始化智能I/O的寄存器,将闆上裝置打通;系統初始化為系統的運作準備資料結構,進行資料初始化.其初始化過程如圖1所示:

VxWorks在S3C2410上的BSP設計

圖1初始化過程

驅動程式就是一些包含I/O操作的子函數.VxWorks系統的驅動程式也可以抽象為三個層次:正常操作,與I/O的接口,以及與元件的接口.其抽象邏輯如圖2所示.驅動程式與I/O系統的接口使驅動具有更好的層次性,驅動程式與元件的接口使驅動具有更好的抽象性.

VxWorks在S3C2410上的BSP設計

圖2驅動程式抽象邏輯

3 VxWorks映像分類及啟動過程

VxWorks映像可以分為兩大類:可下載下傳映像和可引導映像。可加載型映像的執行首先由固化在目标機上的引導代碼,通過序列槽或者網口将系統映像從主控端上裝載到目标機RAM中,然後繼續執行;可引導型映像與可加載映像不同,它是将引導程式和VxWorks融為一體的映像,往往是最終産品,常常直接燒入ROM或者Flash。

兩種類型的映像都可以分成兩步,第一步為系統加電後對必要的硬體進行初始化,這一步目的就是為了加載系統映像,是以在這一步不需要做太多的工作;第二步為系統加載後首先就是對系統硬體作完整的初始化過程,然後完成系統核心初始化,這一切處理完之後跳入使用者應用程式。兩種類型的啟動過程如圖3所示。

VxWorks在S3C2410上的BSP設計

圖3 VxWorks映像啟動過程

可加載映像包括兩部分:boot ROM以及VxWorks。這兩部分是獨立建立的。加載型映像引導主要是用于開發調試階段。

可加載型映像引導過程如下:

1)引導代碼的裝入。系統加電後執行首段引導代碼,把引導代碼段和資料段從ROM或者Flash中裝入RAM中的RAM-HIGH-ADRS。Boot ROM可分為如下三種類型:被壓縮的boot ROM映像,非壓縮的boot ROM映像以及駐留ROM的boot ROM映像。對于壓縮型引導代碼,這種類型的引導代碼在拷貝時對它進行解壓操作;對于非壓縮型引導代碼,這種類型的引導代碼直接進行拷貝操作;駐留型引導代碼僅僅拷貝它的資料段到RAM中。

2)VxWorks映像的載入。引導代碼執行後,把VxWorks映像裝入到RAM中RAM-LOW-ADRS,然後跳轉到VxWorks映像裝入點.

3)系統初始化.由VxWorks映像中的系統初始化代碼來執行,完成系統初始化操作.

可引導型映像引導包括不駐留ROM的映像和駐留ROM的映像兩種類型.對于駐留ROM的VxWorks映像,引導程式隻把VxWorks映像的資料段和堆棧段複制到RAM的RAM-LOW-ADRS,代碼段則駐留在ROM中。駐留型VxWorks映像主要是為了節省RAM空間,以便應用程式有更大的空間運作,但缺點是運作速度慢。随着片外擴充RAM空間越來越大,不需要采用不駐留ROM映像。其引導過程與可加載型類似,主要不同在系統加電時候,首先執行的是romInit.s中的函數romInit(),完成最基本的初始化後跳入到bootInit.c中的romStart()函數,來完成裝載VxWorks映像的工作。接下來的啟動過程和上面所描述的可加載型一樣。

4 VxWorks在S3C2410上的BSP設計

4.1S3C2410開發闆硬體設計

開發闆采用三星S3C2410處理器,S3C2410處理器為ARM920T核心16/32位RISC CPU,擁有獨立的16KB指令和16KB資料CACHE,MMU記憶體管理單元,NAND Flash bootloader,系統管理單元(SDRAM控制器等),3通道UART,4通道DMA,4通道具備PWM功能的定時器,I/O口,RTC(實時時鐘),8通道10位精度.ADC和觸摸屏控制器,IIC總線接口,IIS數字音頻總線接口,USB主機,USB裝置,SD/MMC卡控制器,內建LCD控制器(支援STN和TFT),2通道SPI和PLL數字鎖相環,主頻最高可達203MHz.

S3C2410開發闆在此基礎上外擴:兩片32MB的三星SDRAM;共同組成64MB記憶體,一片Intel strata flash(16MB),用以存儲系統映像,一片Atmel的AT49LV1614A,2MB NOR flash,可以用來存放系統上電引導程式,即相當于PC的BIOS;通過以太網控制器晶片DM9000E擴充了一個網口。其硬體功能子產品結構圖如下:

    圖4 S3C2410開發闆功能結構圖

4.2 BSP中幾個重要檔案的修改

BSP檔案主要包含在Target/config下的目錄中;其中target/config/aU中包含如下檔案configAll.h,bootConfig.c,bootlnit.c,usrConfig.c等檔案,這些都是BSP通用檔案。我們一般不對這些通用檔案作修改;target/config/integrator920t是專為基于ARM920T核心的處理器設計的BSP模闆檔案,我們所選擇的S3C2410處理器是基于ARM920T核心的,是以我們主要的工作就是對這個檔案夾下面的檔案作修改。下面主要給出對該檔案夾下面的幾個重要檔案所作的修改。

1)修改config.h

Config.h檔案包含了所有頭檔案和與CPU闆子相關的特殊定義。config.h中主要修改的内容有:

定義引導行

#define DEFAULT-BOOT-LINE\

"fei(0,0)host:/tor2/target/config/integrator920t/vxWorks"\

"h=90.0.0.3 e=90.0.0.50:ffffff00 u=target tn=targetname"

Fei為傳輸協定;host後面為主機中存放VxWorks映像的路徑,h為主機IP,e為目标闆IP。

目标闆記憶體的配置,這一部分必須根據實際CPU以及外擴存儲器的大小來确定:

#define LOCAL-MEM-LOCAL-ADRS 0x00000000

#define LOCAL-MEM-BUS-ADRS 0x00000000

#define ROM-BASE-ADRS 0x24000000

#define ROM-TEXT-ADRS ROM-BASE-ADRS

#define ROM-SIZE 0x00100000

#define RAM-LOW-ADRS 0x00001000

#define RAM-HIGH-ADRS 0x00600000

VxWorks的預設配置是由configAll.h來确定的,使用者可通過config.h來改變預設配置,一般來說,預設配置是按照比較完備的方式進行系統配置,而實際的軟體、硬體環境往往不那麼完備,使用者必須檢視configAll.h,并在config.h中将不要的軟、硬體配置和初始化去掉.

2)修改romlnit.s

romlnit.s主要工作由函數romInit()完成,該函數是所有固化在ROM或者Flash裡VxWorks映像首先執行的代碼.主要完成的任務有;

禁止中斷,使處理器複位。通過設定CPSR的I-BIT和F-BIT都為1來實作。還要設定中斷寄存器為關模式同時将處理器切換到SVC32模式下,屏蔽AIC中斷。

代碼如下:

MRS r1,cpsr

BIC r1,r1,#MASK-MODE

ORR r1,r1,#MODE-SVC32 | I-BIT|F-BlT

MSR cpsr,r1

MOV r2,#IC-BASE

MVN r1,#0

STR r1,[r2,#FIQ-DISABLE-IC-BASE]

STR r1,[r2,#IRQ-DISABLE-IC-BASE]

儲存啟動類型,在跳至romlnit()函數的時候,傳遞啟動類型.

初始化緩存并屏蔽緩存。

設定記憶體系統以及片子的片選,重新整理周期,注意在配置重新整理周期時一定要與具體闆上擴充的SDRAM相一緻。否則片子無法正常工作.關閉緩存建立記憶體控制器。

在調試這段代碼的時候,由于序列槽網口都沒有啟動,是以隻能通過點燈程式來加跟蹤程式的執行情況。

另外,在romStart()跳轉到romInit()的C程式之前盡可能少地初始化硬體.硬體的初始化是sysHwInit()程式完成的任務.

3)修改sysLib.c

sysLib.c是BSP初始化的核心代碼,在這個檔案中必須複位所有的硬體,使其處于初始化狀态,以保證在後面中斷使能之後,不會産生沒有初始化的中斷。它提供了闆級接口,基于這些接口,VxWorks和應用程式的構造與系統無關。該檔案功能大緻包括:初始化功能;存儲器/位址映射功能;總線中斷功能;時鐘計數器功能等.如下是其中兩個重要的函數sysHwInit(),sysHwInit2()以及代碼注釋。

SysHwInit(),它由通用初始化函數usrInit()調用;

void sysHwInit(void)

{

fune-armIntStackSplit=sysIntStackSplit;

#if defined(INCLUDE-PCI)

sysV3Init(),

if(pciIomapLibInit(PCI-MECHANISM-3,CPU-PCI-CNFIG-ADRS,CPU-PCI-CNFG-ADRS,0) !=OK)

sysToMonitor(BOOT-NO-AUTOBOOT);

#endif

#ifdef INCLUDE-SERIAL

sysSerialHwInit();

#endif

}

序列槽裝置的初始化在sysSerial.c中完成初始化裝置描述符:設定裝置參數位址,波特率,以及裝置中斷級。

sysHwInit2(),連接配接系統中斷,初始化其它必須的配置,該函數由定時器驅動中的sysClkConnect()調用。

 void sysHwInit2(void)

{

static BOOL initialised=FALSE;

intLibInit(AMBA-INT-NUM-LEVELS,AMBA-INT-NUM-LEVELS,INT-MODE);

ambaIntDevInit();

(void)intConnect(INUM-TO-IVEC(SYS-TIMER-INT-VEC),sysClkInt,0);

(void)intConnect(INUM-TO-IVEC(AUX-TIMER-INT-VEC),sysAuxClkInt,0);

#ifdef INCLUDE-SERIAL   

sysSerialHwInit2();

#endif

initialised=TRUE;

}

4.3 VxWorks的編譯生成

對BSP包裡面的檔案修改好以後,需要對其進行編譯下載下傳調試,裝載到目标闆中的VxWorks映像取決于使用的下載下傳方法,主要映像有:

1)VxWorks

這是下載下傳型的VxWorks映像,從RAM開始執行,它由目标闆上的引導程式通過序列槽或者網口将它下載下傳到目标闆本地的RAM中運作.在Tornado開發環境中,這是一個預設的選項,主要在調試階段使用.使用主控端上的WindShell工具和符号表。

2)VxWorks.st

這也是基于RAM的映像,需要通過引導ROM将它下載下傳到目标機執行,但該對象檔案内置符号表。

3)VxWorks-rom

這是非壓縮,基于ROM的映像。在這個對象檔案執行前把自已拷貝到目标機RAM中。這種類型的映像通常在啟動階段比較慢,但其執行階段都在RAM中完成的,比駐留型的映像要快。

4)VxWorks.st-rom

這是ROM駐留的壓縮的VxWorks映像。它在執行前把自己解壓并拷貝到目标機RAM中執行。

5)VxWorks.res-rom

這是ROM駐留的非壓縮VxWorks.st的映像。它在執行前把自己資料段拷貝到目标機RAM中.S3C2410可以Strata flash NOR flash或者smart media card NAND flash兩種flash卡啟動,當系統映像下載下傳到某個flash,通過适當的跳線從指定的flash啟動.

 4.4調試中需要注意的幾個問題

在romlnit.s中初始化程式不要太多,它初始化的目的是為了載入VxWorks映像,實際初始化任務主要由sysHwInit()函數來完成。對于下載下傳型的VxWorks映像,sysAlib.s()中的sysInit()函數應該重複映像下載下傳前的所有初始化操作,否則在一些情況下可能會忽略存儲控制器的設定。

對特定的BSP驅動程式的修改,隻能在特定的BSP的目錄下,在這裡為target/config/integrator920t目錄下,不要直接在target/src/drv以及target/h/drv目錄下修改.

調試階段不要使用malloc()等緩沖區調用函數。如在前面所提到的函數intConnect()不能夠在sysHwInit()中被調用,這是因為在VxWorks未啟動之前,此時整個系統的記憶體配置設定庫還沒有被初試化,調用malloc()等緩沖區調用函數,将會導緻系統癱瘓.

結語

本文在介紹了BSP組成以及VxWorks映像的啟動過程後,以S3C2410開發闆的BSP為例,介紹了VxWorks的BSP設計中的幾個重要檔案的修改以及在BSP開發調試中需要注意的幾個問題。針對不同的目标闆,BSP的實作不盡相同,需要根據目标闆的具體硬體結構進行具體設計,但各種目标闆之間有一定的共性,希望本文可以對開發各類型的目标闆具有一定的參考價值。