天天看點

VxWorks BSP制作概要(轉貼)

要了解VxWorks BSP的制作,首先要對VxWorks的啟動過程有個大體的了解。下面首先說說VxWorks的啟動過程。一般來說,所有的處理器執行相同的邏輯步驟初始化和加載VxWorks,但是一些處理器可能會有一些特殊的步驟,而另外一些則可能跳過一些步驟。但它們都進行如下步驟,入:初始化處理器,并在存儲器的特定位置提供一段代碼(可能還有一些表)以供處理器上電或重新開機時運作。這段代碼設定處理器的狀态,初始化存儲器和存儲器位址,關中斷把控制權交給啟動代碼(bootstrapping code)。

1、處理器首先跳到ROM的入口位址,設定狀态字并建立一個啞堆棧(dummy stack)

2、跳到C程式的入口位址,根據啞堆棧中的參數決定是否清零記憶體RAM(若是泠啟動cold start則清零),再把ROM段的剩餘部分拷貝到RAM(如果ROM代碼是壓縮的,還要解壓)。

3、處理器跳到RAM的入口位址(bootConfig.c),是cache無效,清零bss段,初始化中斷向量表,進行闆級初始化。

4、啟動多任務核心

VxWorks的boot ROM本身就是一個獨立的應用。開發者可用它通過網絡來啟動一個VxWorks映像并和應用代碼連接配接。

VxWorks啟動流程

romInit()------romStart()-------sysInit()---------initVectBaseSet()-------sysHwInit()--------usrKernelInit()-------kernelInit()-------usrRoot()

檔案和程式說明:

romInit.S : romInit()

關中斷,把啟動類型(cold/warm)入棧,清零cache後跳到romStart入口。

bootInit.C : romStart()

把ROM代碼和資料段拷貝并重定位到RAM,清零RAM的未用部分,需要的話要進行解壓縮,然後跳到sysInit()的入口位址。

拷貝的過程如下:

A、代碼段不是駐留在ROM中,要拷貝代碼段和資料段

B、如代碼段是駐留在ROM中,則隻拷貝資料段

C、未用的記憶體清零

D、需要時,要進行解壓縮

sysALib.S : sysInit()

sysInit()是VxWorks映像的入口位址,起始位址由RAM_LOW_ADR定義。它首先關中斷,使cache無效,初始化處理器的寄存器為預設值,使tracing無效,清除中斷寄存器,初始化usrInit()的堆棧并激活usrInit()。

注意,在sysInit()中必須重新初始化在romInit()中所作的硬體初始化。

usrConfig.C and bootConfig.C : usrInit()

它是VxWorks運作的第一個C代碼,在supervisor mode中激活。它關中斷,存儲有關啟動類型(boot type)的資訊,在VxWorks核心運作前進行必要的初始化。

A、初始化cache模式,設定為安全狀态,在usrInit()結束時使cache有效。

B、清零系統bss段

C、初始化中斷向量表,調用VectBaseSet(),exeVecInit();

D、初始化系統硬體,但使之無效Quiescent State,調用sysHwInit(),這是一個與硬體有關的過程,是我們要針對不同的目标闆進行修改的重要部分,其中涉及到序列槽,網口的初始化,CONSOLE的配置等。

E、調用usrKernelInit(),并使能cache

F、調用kernelInit(),建立usrRoot()。

usrKernel.C : kernelInit()

初始化核心可選組建kernel facility

kernelLib.C : usrKernelInit()

初始化多任務環境。

調用intLockLevelSet(),使時間片(round-robin)方式無效,在記憶體的高端建立中斷堆棧,ROOT堆棧和TCB,建立usrRoot(),中斷usrInit()的運作,然後打開中斷,注意要清除中斷寄存器。

usrConfig.C and bootConfig.C :usrRoot()

初始化I/O系統,驅動器,裝置(在configAll.h和config.h中指定)

程式清單

對于硬體初始化的順序,大緻可按下表中的形式進行:

函數

sysInit()

所在的檔案sysALib.s

函數的功能

(a)鎖住中斷

(b)禁用緩沖

(c)用預設值初始化系統中斷表(僅i960)

(d)用預設值初始化系統錯誤表(僅i960)

(e)初始化處理器寄存器的一些預設值

(f)使回溯無效

(g)清除所有懸置中斷

(h)激活usrInit(),指明啟動類型。

函數

usrInit()

所在檔案

usrConfig.c

函數功能

(a)對bss賦零

(b)儲存bootType于sysStartType;

(c)調用excVecInit(),初始化所有系統和預設中斷向量

(d)依次調用sysHwInit(),usrKernelInit(),kernelInit()。

usrKernelInit()依次調用classLibInit(),taskLibInit(),taskHookInit(),semBLibInit(),semMLibInit(),

semCLibInit(),semOLibInit(),wbLibInit(),msgQLibInit(),qInit(),workQInit(),usrKernel.c

函數kernelInit()

kernelInit()初始化并啟動核心。

所在檔案

kernelLib.c

函數功能

(a)激活intLockLevelSet()

(b)從記憶體池頂部建立堆棧和TCB

(c)調用taskInit(),taskActivate(),用于usrRoot()

(d)調用usrRoot()

函數

usrRoot(),初始化I/O系統,驅動,裝置(在configAll.h和config.h中指定)

所在檔案

usrConfig.c

函數的功能

(a)調用sysClkConnect(),sysClkRateSet(),iosInit(),[ttyDrv()]

(b)初始化excInit(),logInit(),sigInit()

(c)初始化管道pipeDrv()

(d)stdioInit(),mathSoftInit()或mathHardInit()

(e)wdbConfig():配置并初始化目标代理機

在大多數目标闆的闆級支援包中,VxWorks的入口點由兩個函數:romInit()和romStart()來完成,而非sysInit()。具體基于ROM的VxWorks的初始化過程如下表所示:

函數    函數功能 所在檔案

1、romInit()

2、romStart()

3、usrInit()

4、usrKernelInit()

5、kernelInit()

6、usrRoot()

7、Application routine

(a)禁止中斷

(b)儲存啟動類型

(c)硬體初始化

(d)調用romStart()

(a)将資料段從ROM拷貝到RAM,清記憶體

(b)将代碼段從ROM拷貝到RAM,有必要的話解壓縮

(c)調用usrInit()

初始化程式

如果相應的配置檔案被定義,對應函數被調用

初始化并啟動核心

初始化I/O系統,驅動器,建立裝置

應用程式代碼

romInit.s

bootInit.c

usrConfig.c

usrKernel.c

kernelLib.c

usrConfig.c

Application source file

BSP的檔案構成如下:

1、硬體初始化檔案:處理器初始化程式

2、作業系統初始化檔案:各類頭檔案、驅動程式、作業系統核心初始化程式、建立多任務環境程式

3、工具檔案:各類make檔案,制作系統引導檔案的工具

BSP的工作

1、單闆硬體初始化,主要是CPU的初始化,為整個軟體系統提供底層的硬體支援

2、為作業系統提供裝置驅動程式和系統中斷服務程式

3、定制作業系統的功能,為軟體系統提供一個實時多任務的運作環境

4、初始化作業系統,為為作業系統正常運作做好準備

BSP的生成有賴于VxWorks提供的一些開發和調試工具

術語的意義:

CPU:目标闆的CPU

TOOL:主機開發工具

ROM_TEXT_ADRS:啟動ROM的16進制入口位址,多數目标闆設定為ROM的起始位址

ROM_SIZE:ROM的16進制空間大小

ROM_LOW_ADRS:VxWorks裝入的起始位址

ROM_HIGH_ADRS:boot ROM拷貝到RAM的起始位址

LOCAL_MEM_LOCAL_ADRS:目标闆存儲空間的起始位址

LOCAL_MEM_SIZE:固定(靜态)存儲器大小

USER_RESERVED_MEM:保留記憶體大小

RAM_HIGH_ADRS:拷貝boot ROM映像的目标位址

ROM_BASE_ADRS:ROM起始位址

ROM_TEXT_ADRS:boot ROM的入口位址,多數為ROM空間的起始位址

ROM_WARM_ADRS:熱啟動的入口位址

ROM_SIZE:ROM空間的大小

其中ROM_TEXT_ADRS和ROM_SIZE的定義必須和Makefile一緻。

常見錯誤

A、LOCAL_MEM_LOCAL_ADS的重要性,大多數應用都設定為0

B、在romInit.S中做了太多的裝置初始化,romInit.S隻做基本的初始化,真正的裝置初始化在sysHwInit()中完成。

C、在sysALib.S中做的太少,所有在romInit.S中所做的初始化都必須在sysALib.S中重新初始化

D、把修改過的驅動程式放在錯誤的目錄,與BSP有關的驅動程式應該放在target/config/bspname中,而不是WRS的target/src/drv和target/h/drv中。

E、混淆配置選項,在檔案config.h中必須是可選BSP的配置,不可選項應包含在bspname.h中。

繼續閱讀