要了解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中。