歡迎您光臨本站 登入註冊首頁

VxWorks在AT91RM9200上的BSP設計

admin @ 2014-03-25 , reply:0

概述

   VxWorks是美國WindRiver公司開發的嵌入式實時操作系統,具有高性能、可裁減性好等特點,能支持多種微處理器(如PowerPC、X86、ARM、SPARC)……

    VxWorks是美國Wind River公司開發的嵌入式實時操作系統,具有高性能、可裁減性好等特點,能支持多種微處理器(如PowerPC、X86、ARM、SPARC);自問世以來,以其良好的可靠性和卓越的實時性被廣泛地應用於通信、航空、航天等高精尖技術及實時性要求極高的領域中。BSP(Board Support Package,板級支持包)的作用是針對特殊的硬體平台,為操作系統內核提供操作介面,使操作系統能夠獨立於底層硬體。對上層應用屏蔽具體硬體,Vxworks的高可移植性就是通過BSP 實現的。AT91RM9200是Atmel公司生產的一款ARM9核晶元,本文重點介紹將Vxworks移植到該晶元過程中BSP的定製過程。

1 BSP概念
    BSP通常是指針對具體的硬體平台,用戶所編寫的啟動代碼和部分設備驅動程序的集合。它所實現的功能包括初始化和驅動部分設備。最基本的BSP僅需要支持處理器複位、初始化、驅動串口和必要的時鐘處理。BSP是相對於操作系統而言的,不同的操作系統對應不同形式的BSP,因此,在寫BSP時一定要按照要求的操作系統對BSP的定義形式來寫。在VxWorks系統中,BSP是介於底層硬體環境和VxWorks之間的一個軟體介面,它的主要功能是系統加電后初始化目標機硬體和VxWorks,並提供部分硬體驅動程序。BSP在Vxworks系統中的層次關係如圖1所示。
 
    BSP為各種板卡的硬體功能提供了統一的軟體介面,包括硬體初始化、中斷的捕捉和處理、硬體時鐘和定時器管理、內存地址映射,以及內存分配等。每個BSP還包括一個ROM 啟動或其他啟動機制。

2 VxWorks的引導過程
    在編寫BSP之前,首先要了解整個系統的啟動過程。Vxworks的映像由代碼段、數據段和BSS段3部分組成。Vxworks內核可以分為3種:可載入類型映像、基於ROM 的Vxworks映像和ROM 駐留型映像。這3種類型的映像組織是不一樣的,因此啟動過程有所區別。
    可載入映像包括Vxworks和Boot R0M 兩部分內容,兩部分是獨立創建的。首先,由系統引導代碼把ROM引導程序搬到RAM_HIGH_ADRS。然後,ROM 引導程序開始運行,將Vxworks映像載入到RAM_LOW_ADRS,之後跳轉到Vxworks映像裝入點。
    基於ROM 的Vxworks映像在BSP初始化時,會把Image完全搬到RAM 中執行,包括代碼段和數據段。在拷貝執行完畢后,系統控制權轉移給RAM 中Vxworks映像的初始化代碼。
    ROM駐留型映像只是將ROM 中Vxworks映像的數據段和BSS段拷貝到RAM 中,完成後系統控制權轉移給ROM/Flash里Vxworks映像的初始化代碼,代碼段留在ROM 中並在ROM 中運行。在ROM 中運行的VxWorks映像主要是為了節省RAM空間,帶來的不利則是運行速度慢。圖2和圖3分別是下載型和ROM 型VxWorks映像的初始化流程。
 
    下面以ROM 型VxWorks內核啟動流程為例,說明各文件的作用:

  • romInit() 保存啟動類型,屏蔽中斷;初始化內存和寄存器,屏蔽Cache;初始化CPU,將堆棧指針定位於被拷貝Boot ROM 映像在RAM 的地址;跳到romStart()。
  • romStart() 根據不同的映像類型將Vxworks映像的不同部分解壓縮(如果需要)並載入到RAM 中。
  • usrInit() 對Vxworks映像的BSS段清零;調用intVecBaseSet()設置中斷矢量基地址表;調用excVecInit()初始化異常中斷矢量;調用sysHwInit()初始化系統硬體;調用usrKernelInit()初始化wind內核;調用kernelInit()啟動wind內核,啟動usrRoot()任務。
  • usrRoot() 設置操作系統時鐘,創建設備,安裝驅動,調用sysHwInit2()安裝系統時鐘和輔助時鐘中斷以及串口等設備的中斷,初始化I/O、文件系統、調用應用程序。

3 VxWorks在AT91RM9200上的BSP設計
3.1 AT91RM9200簡介
    AT91RM9200的片上資源包括:ARM920T 處理器核、16 KB的內部SRAM和128 KB的內部ROM存儲器;支持SDRAM、SRAM、Burst Flash 和CompactFlash、SmartMedia以及NAND Flash的無縫連接;16 KB的數據Cache,16 KB的指令Cache,完全可編程的外部匯流排介面EBI,4個32位的PIO控制器可以達到122個可編程I/O引腳(每個都有輸入控制、可中斷及開路的輸出能力);帶有8個優先順序、可單獨屏蔽中斷源的先進中斷控制器、6組硬體定時器、4個通用同步/非同步收發器USART。

3.2 BSP中幾個重要文件的修改
    由於AT91RM9200的內核是ARM920T,所以BSP文件主要在VxWorks編譯環境Tornado的目錄target/config/all和target/config/integrator920t文件夾里。其中,all文件夾里的文件對於絕大多數BSP都是共用的,一般來說不需要修改,特別是“configAll.h";integrator920t文件夾里的文件就是所要編寫的BSP文件,這些文件往往與系統硬體密切相關。

3.2.1 修改Makefile
    Makefile文件定義編譯和鏈接整個BSP的規則,如編譯工具的選擇、編譯選項和包含文件路徑等;控制生成VxWorks映像文件的類型,同時含有存儲區大小的信息,對於存儲區大小信息的改動必須與Config.h的對應改動同步。有些參數需在該文件中定義,如處理器類型、編譯工具、目標地址等。下面介紹一些須修改的參數和地址:
CPU 目標板處理器類型,本設計中為ARMARCH4_T;
TOOL 編譯工具,Vxworks中可使用GNU 和DIAB兩種,本設計中用GNU;
TARGET_DIR BSP所在的目錄,默認值為$(WIND_BASE)/target;
VENDOR 目標廠商名字,本設計中為Atmel;
BOARD 目標主板名稱,本設計中為AT91RM9200;
ROM_TEXT_ADRS Boot ROM 的起始地址;
ROM_SIZE ROM/Flash的大小;
RAM_LOW_ADRS VxWorks在RAM 中的起始地址,即入口地址;
RAM_HIGH_ADRS 非駐留ROM 內核的啟動程序載入地址。

3.2.2 修改Config.h
    Config.h文件包含了所有頭文件和與CPU 相關的特殊定義。VxWorks內核組件的配置由Config.h文件定義。Config.h中的主要修改內容有定義引導行和修改地址。
(1)定義引導行
#define DEFAULT_BOOT_LINE "mac(0,0)host:vxWorks h=192.168.0.16 e=192.168.0.55:ffffff00 u=target pw=target tn=at91"
其中,mac(0,0)為AT91RM9200晶元中的EMAC設備;host為主機名;Vxworks為要下載的文件名;h為主機IP地址;e為目標板IP地址;u為用戶名;pw 為密碼;tn為目標板名稱。
(2)修改地址
    該文件中的地址定義,如ROM_TEXT_ADRS、ROM_SIZE、RAM_LOW_ADR、SRAM_HIGH_SIZE等要與Makefile文件中的相關定義一致。本設計中代碼段存儲在連接ARM 晶元外部片選CS0上的Flash裡面,基地址為0x10000000,因此,定義如下:
#define ROM_BASE_ADRS 0x10000000
// 片選0的基地址
#define ROM_TEXT_ADRS ROM_BASE_ADRS
//代碼段起始於片選0的基地址
#define ROM_SIZE 0x00080000
//存儲VxWorks映像的ROM 空間
#define RAM_LOW_ADRS 0x20001000
//RAM 中VxWorks映像人口地址
#define RAM_HIGH_ADRS 0x20200000
//RAM 中Boot ROM 的入口地址
    VxWorks的預設配置由configAll.h來確定。一般來說,預設配置的設置與自行開發的硬體系統的配置不同,用戶可通過Config.h來改變預設配置。用戶須查看configAll.h,並在Config.h中將不需要的軟硬體配置和初始化去掉。例如,預設配置中一般包含浮點處理器,而AT91RM9200中沒有浮點寄存器,因此就要刪掉相關配置。

3.2.3 修改integrator920t.C
    該文件中設置所有非可選的、與AT91RM9200晶元相關的信息,如各硬體相關寄存器的地址定義,設備寄存器中對應位的定義,各硬體中斷矢量和中斷優先順序的定義,DBUG和USART 的控制,網口的定義,系統時鐘和輔助時鐘參數設置等。VxWorks所要使用的目標板包含設備的驅動程序頭文件應當包含在該文件的開始。該文件中的各項宏定義均是基於AT91RM9200晶元的。並根據具體要求定義。例如,電源管理控制器中用到兩個鎖相環PLLA和PLLB,對它們的部分參數設定代碼如下:
#define PLL_INPUT_FREQ_MIN 900000
//鎖相環輸入最低頻率
#define PLL INPUT_FREQ_MAX 32000000
//鎖相環輸入最高頻率
#define PLL_OUTPUT_FREQ_MIN 80000000
//鎖相環輸出最低頻率
#define PLL OUTPUT_FREQ_MAX 240000000
//鎖相環輸出最高頻率

3.2.4 修改romInjt.S
    該文件包含引導ROM 和基於ROM 的Vxworks映像的入口初始化彙編代碼。入口點為romInit()函數,是系統加電啟動后首先執行的代碼。主要功能是:保存啟動類型,使處理器複位;初始化Flash和SDRAM;設置MMU到已知狀態;指令Cache使能;初始化MMU控制寄存器(指令32位、數據32位、寫緩衝使能);開漏寫緩衝,並且使指令和數據Cache都無效;通過設置CPSR的IRQ禁止位、FIR禁止位和先進中斷控制器AIC中的中斷禁止寄存器來屏蔽中斷,跳轉到bootInit.C中的romStart(),同時傳遞啟動類型。其中,中斷屏蔽代碼如下:
MRS r1,cpsr
BIC r1,r1,#MASK_MODE
ORR r1,r1,#MODE_SVC32 | I_BIT | F_BIT
// 禁止IRQ和FIQ
MSR cpsr,r1
LDR r2,=AT91RM9200_AIC_BASE_ADDR
//AT91RM9200先進中斷控制器基地址
MVN r1,#0
STR r1,[r2,#AT91RM9200_AIC_IDCR]
    在調試這段代碼時,由於串口和網口都沒有啟動,因此只能通過點燈程序來跟蹤程序的執行情況,設置不同的LED亮來顯示程序執行到哪一步。例如,如果要并行輸入/輸出口C的32位中的第15位亮,則可以編程為:
LDR r7,=0xFFFFF800 //0xFFFFF800為PIOC的PIO使能寄存器的地址
LDR r6,=0x00008000
STR r6,[r7] //通過對相應位寫1,表示該引腳受PIO控制
LDR r7,=0xFFFFF810 //0xFFFFF810為PIOC的PIO
//輸出使能寄存器的地址
LDR r6,=0x00008000
STR r6,[r7] //通過對相應位寫1,表示該引腳可以作為輸出引腳
LDR r7,=0xFFFFF830 //0xFFFFF830為PIOC的數據輸出寄存器的地址
LDR r6,=0x00008000
STR r6,[r7] //通過對相應位寫1,表示該引腳輸出邏輯1電平,燈亮
    在編寫本文件時,需要注意的地方是:不要在該文件里進行過多的初始化操作,大部分硬體初始化操作在sysLib.C文件中的sysHwInit()函數中進行。

3.2.5 修改sysLib.c
    sysI ib.C是BSP初始化的核心代碼。在這個文件中,必須複位所有的硬體,使其處於初始化狀態,保證後面開中斷後不會產生假中斷。這個文件包含了由目標機體系結構決定的、與系統有關的C程序。這些C程序提供板級介面。基於這些介面,VxWorks和應用程序的構造與系統無關。該文件的功能包括:定義了RRAM、SRAM、ROM、外部片選晶元的物理地址和虛擬地址;定義中斷優先順序寄存器中各個位對應的優先順序;調用sysHwInit()初始化串口和網口,安裝IRQ/SVC中斷堆棧分配程序;匯流排中斷功能等。本文件中有兩個重要的函數:sysHwInit()和sysHwInit2()。sysHwInit()的代碼如下:
void sysHwInit(void){ //由usrInit()調用
_func_armIntStackSplit= sysIntStackSplit;
//安裝IRQ/SVC中斷堆棧分割代碼
#ifdef INCLUDE_SERIAL
sysSerialHwInit(); //初始化串口數據結構
#endif
#ifdef INCLUDE_EMAC_END
sysAt91EmacEnetDisable(); //網路設備禁用
sysAt91EmacEnetIntDisable(); //網路設備中斷禁止
#endif
}
    sysHwInit2()用來連接系統中斷,安裝ISR,進行其他配置。它在初始化系統時鐘時,由sysClkConnect()調用,主要用來初始化中斷庫和中斷驅動,安裝系統時鐘和輔助時鐘的中斷以及串口等設備的中斷。

4 編譯生成映像
    系統定製完成後,有兩種編譯方式:一種是在Tornado下進行編譯,生成映像文件;另一種是直接用Make工具編譯,但要寫好腳本文件。裝載到目標板中的Vxworks映像取決於使用的下載方式,其中主要包括以下幾種:
① Vxworks。這是基於RAM 的映像,Vxworks需要通過目標板上的引導程序從串口或網口把它下載到目標板的RAM 中運行。在Tornado開發環境下,這是一個默認選項,主要用在調試階段。使用宿主機上的windSh工具和符號表。
② Vxworks.st。這也是基於RAM 的映像,需要通過引導ROM把VxWorks映像下載到目標機內存中才能執行。該對象文件內置符號表。
③ Vxworks_rom。這是一個非壓縮、基於ROM 的映像。在這個對象文件執行前,先把自己拷貝到目標機RAM 中。這種類型的映像通常在啟動階段速度比較慢,因為代碼在ROM 中執行,但執行階段比ROM駐留型的映像要快。
④ Vxwork.st_rom。這是基於ROM 壓縮的Vxworks映像。它在執行前先把自己解壓並拷貝到目標機RAM 中執行。
⑤ Vxworks.res_rom。這是ROM 駐留型的非壓縮VxWorks的映像。它在執行前把數據段拷貝到目標機RAM 中。這種類型的映像在啟動階段比較快,但在目標機上執行的速度比基於ROM 類型的映像慢(因為CPU訪問ROM 比訪問RAM 要慢)。通常在RAM 空間比較小的目標機上使用這種類型的映像。

5 需要注意的問題
    首先,應該避免在romInit.S中進行過多的初始化操作。該文件中只是進行必要的最小硬體初始化.大部分硬體的初始化都是在sysHwInit()中完成的。另外,romInit.s中的代碼不應當被其他模塊或函數調用。
    其次,應該避免sysAiib.S中工作太少。BSP開發人員通常錯誤地認為在romInit.S里初始化過的設備不需要在sysAlib.S中重新初始化。實際上,VxWorks映像並不認為它是由引導映像程序引導的,因此,它必須重新設置和初始化所有它自己需要使用的設備。sysInit()是該文件中最主要的一個函數,也是第一個函數。該常式中很多工作與romInit()是相同的,目的是保證內核映像在運行與冷啟動時,軟硬體環境高度一致。
    最後,對特定的BSP驅動程序的修改,只能在特定的BSP 目錄下。此設計中目錄為target/config/integrator920t,不要直接在target/src/drv以及target/h/drv中修改。只有風河公司的源程序才能存放在這些目錄下。

6 結論
    本文在介紹BSP的概念、作用和VxWorks映像分類以及系統啟動流程的基礎上,以Atmel公司生產的ARM9處理器AT91RM9200為例,重點介紹了Vxworks的BSP設計中需要修改的幾個重要文件,最後提出了需要注意的問題。儘管目標板硬體不同,BSP的實現也不盡相同,但基本思想是一樣的。本設計對各類開發板的系統移植和後續的應用程序開發有一定的參考價值。


[admin via 研發互助社區 ] VxWorks在AT91RM9200上的BSP設計已經有2205次圍觀

http://cocdig.com/docs/show-post-42265.html