《基于VxWorks嵌入式系統(tǒng)的數(shù)據(jù)通信》課件第8章_第1頁
《基于VxWorks嵌入式系統(tǒng)的數(shù)據(jù)通信》課件第8章_第2頁
《基于VxWorks嵌入式系統(tǒng)的數(shù)據(jù)通信》課件第8章_第3頁
《基于VxWorks嵌入式系統(tǒng)的數(shù)據(jù)通信》課件第8章_第4頁
《基于VxWorks嵌入式系統(tǒng)的數(shù)據(jù)通信》課件第8章_第5頁
已閱讀5頁,還剩160頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第8章VxWorkshopBSP基礎(chǔ)及其開發(fā)過程8.1BSP基礎(chǔ)理論知識8.2BSP的基本配置和VxWorks的初始化8.3BSP的開發(fā)要求及開發(fā)過程8.4BSP中設(shè)備驅(qū)動程序的開發(fā)8.5本章小結(jié)8.1BSP基礎(chǔ)理論知識從本章開始,我們將討論VxWorks的一個重要組成部分——BSP(BoardSupportPackage)。在目標(biāo)機系統(tǒng)加電以后,首先執(zhí)行的代碼就是BSP,它的重要性是不言而喻的。8.1.1BSP概述

BSP即板級支持包,通常是指針對具體的硬件平臺,用戶所編寫的啟動代碼和部分設(shè)備驅(qū)動程序的集合,是介于主板硬件和操作系統(tǒng)之間的一層,應(yīng)該說是屬于操作系統(tǒng)的一部分,主要目的是為了支持操作系統(tǒng),使之能夠更好地運行于硬件主板上。它來源于嵌入式操作系統(tǒng)與硬件無關(guān)的設(shè)計思想,操作系統(tǒng)被設(shè)計為運行在虛擬的硬件平臺上。對于具體的硬件平臺,與硬件相關(guān)的代碼都被封裝在BSP中,由BSP向上提供虛擬的硬件平臺,BSP與操作系統(tǒng)通過定義好的接口進行交互。以上是從BSP的功能去理解BSP,但是到目前為止還沒有對BSP得出明確的定義。在VxWorks系統(tǒng)中,對BSP的簡單描述為介于底層硬件環(huán)境和VxWorks之間的一個軟件接口。BSP的主要特點是硬件相關(guān)性和操作系統(tǒng)相關(guān)性。因此BSP與操作系統(tǒng)是相對應(yīng)的,不同的操作系統(tǒng)就應(yīng)該對應(yīng)于不同定義形式的BSP。例如,VxWorks的BSP和Linux的BSP相對于某一CPU來說盡管實現(xiàn)的功能一樣,可是寫法和接口定義是完全不同的,所以寫B(tài)SP一定要按照該操作系統(tǒng)BSP的定義形式來寫(BSP的編程過程大多數(shù)是在某一個成型的BSP模板上進行修改)。這樣才能與上層OS保持正確的接口,良好地支持上層OS。最基本的BSP僅需要支持處理機復(fù)位、初始化、驅(qū)動串口和必要的時鐘處理。在VxWorks中,它的主要功能是系統(tǒng)加電后初始化目標(biāo)機硬件、初始化操作系統(tǒng)及提供部分硬件的驅(qū)動程序,具體的功能包含如下:

(1)初始化。所謂初始化是指從系統(tǒng)上電復(fù)位直到VxWorks開始初始化用戶應(yīng)用時(即WindKernel和tUsrroot啟動)的一段時間內(nèi)系統(tǒng)所執(zhí)行的過程。這個過程主要包括三個部分的工作。圖8.1具體描述了VxWorks系統(tǒng)BSP的初始化過程。①CPU初始化。初始化CPU的內(nèi)部寄存器(如狀態(tài)寄存器、控制寄存器、高速緩存等)。②目標(biāo)機初始化。初始化控制芯片的寄存器(如BUS、DMA、DRAM)和I/O設(shè)備寄存器(驅(qū)動各設(shè)備),為整個軟件系統(tǒng)提供底層硬件環(huán)境的支持,打開設(shè)備。③系統(tǒng)資源初始化。為操作系統(tǒng)及系統(tǒng)的正常運行做準(zhǔn)備,進行資源初始化(如操作系統(tǒng)初始化、空間分配等)。

(2)使VxWorks能夠訪問硬件驅(qū)動程序。這主要是指BSP包含部分必要的設(shè)備驅(qū)動程序和相關(guān)設(shè)備的初始化操作。我們可以將VxWorks系統(tǒng)的驅(qū)動程序抽象為三個層次:常規(guī)操作、與I/O系統(tǒng)的接口、與Component的接口。VxWorks系統(tǒng)驅(qū)動程序的抽象邏輯如圖8.2所示。圖8.1VxWorks系統(tǒng)BSP的初始化過程圖8.2VxWorks系統(tǒng)驅(qū)動程序的抽象邏輯在VxWorks系統(tǒng)驅(qū)動程序的抽象邏輯中,常規(guī)操作是設(shè)備的固有操作邏輯,具有兩層含義。它在微觀上表現(xiàn)為CPU操作設(shè)備的寄存器。如圖8.3所示,CPU對控制電路、數(shù)字電路和I/O處理器的各種寄存器進行操作,例如對I/O進行編址。在宏觀上它表現(xiàn)為具體的驅(qū)動操作。在VxWorks系統(tǒng)驅(qū)動程序的抽象邏輯中,驅(qū)動程序與I/O系統(tǒng)的接口、驅(qū)動程序與Component的接口有如下三層含義:①I/O管理。②操作類型規(guī)定。③參數(shù)規(guī)定。驅(qū)動程序與I/O系統(tǒng)的接口使驅(qū)動程序具有更好的層次性,驅(qū)動程序與Component的接口使驅(qū)動程序具有更好的抽象性。圖8.3CPU對設(shè)備寄存器的操作示意圖

WindRiver公司提供大量預(yù)制的支持許多商業(yè)主板及評估板的BSP。同時,VxWorks的開放式設(shè)計以及高度的可移植性使得用戶在使用不同的目標(biāo)板進行開發(fā)時,所做的移植工作量非常小。到目前為止,WindRiver公司能夠提供超過200個的BSP,當(dāng)用戶在為自己的目標(biāo)板開發(fā)BSP時,可以從WindRiver公司的標(biāo)準(zhǔn)BSP中選一個最接近的來加以修改。另外,WindRiver還提供了BSPDevelopKIT,包括流行標(biāo)準(zhǔn)板的BSPsourcecode,以及BSP開發(fā)效果的校驗工具,以方便用戶。圖8.4為基于VxWorks操作系統(tǒng)的系統(tǒng)運行時的結(jié)構(gòu),說明了BSP在系統(tǒng)中的位置。從圖中可以看出,BSP向上層提供的接口有:①與Wind的接口。②與VxWorks系統(tǒng)組件的接口。③與應(yīng)用程序的接口(可以提供,但一般情況下不提倡使用)。

(3)在VxWorks系統(tǒng)中,集成了與硬件相關(guān)(Hardware-dependent)的軟件和部分硬件無關(guān)(Hardware-independent)的軟件。圖8.4基于VxWorks操作系統(tǒng)的系統(tǒng)運行時的結(jié)構(gòu)在以后所討論的BSP中,如果未加說明都是指VxWorks所包含的BSP。既然BSP是相對于操作系統(tǒng)而言的,那么BSP和VxWorks之間的關(guān)系到底是怎樣的呢?圖8.5所示的BSP在系統(tǒng)中的層次清楚地展現(xiàn)了BSP與VxWorks之間的具體關(guān)系以及在目標(biāo)機應(yīng)用系統(tǒng)中BSP所處的地位。從圖中可以發(fā)現(xiàn)BSP不是一個設(shè)備驅(qū)動程序,因為設(shè)備驅(qū)動程序能夠訪問硬件設(shè)備(例如網(wǎng)絡(luò)設(shè)備驅(qū)動程序、SCSI設(shè)備驅(qū)動程序),同時相同類型設(shè)備的驅(qū)動程序,可以不做修改從一個目標(biāo)環(huán)境中移植到另一個目標(biāo)環(huán)境中(例如網(wǎng)卡驅(qū)動程序);而BSP則是只能運行在指定設(shè)備的硬件環(huán)境中。就BSP開發(fā)而言,簡單地說BSP開發(fā)人員需要完成以下兩方面的工作:①完全支持BSP管理的設(shè)備。②通用設(shè)備驅(qū)動程序的集成工作。圖8.5BSP在系統(tǒng)中的層次8.1.2BSP所要實現(xiàn)的功能

BSP既然有如此重要的地位,那么它到底有哪些功能呢?概括起來,主要有下面幾個要點。

1.目標(biāo)機硬件環(huán)境的初始化

VxWorks的引導(dǎo)順序具體過程將隨著處理器和硬件環(huán)境的變化而變化,目標(biāo)機通用初始化的必要條件是:

(1)在存儲器里的特殊地址處提供一段代碼,當(dāng)復(fù)位或加電目標(biāo)機時處理器將立即執(zhí)行這段代碼。

(2)設(shè)置處理器為某個具體的狀態(tài)。

(3)初始化存儲器并對存儲器進行編址。

(4)關(guān)閉中斷。

(5)將控制權(quán)移交給附加的引導(dǎo)代碼。

(6)裝載需要的VxWorks段到RAM中,例如把數(shù)據(jù)段從ROM拷貝到RAM中。

(7)在初始化VxWorks內(nèi)核前,使目標(biāo)機硬件處于一個靜止?fàn)顟B(tài)。

2.硬件驅(qū)動程序的集成訪問硬件設(shè)備驅(qū)動程序,BSP必須包含設(shè)備驅(qū)動程序的相關(guān)支持、設(shè)備的配置管理等。這主要是指下面幾個方面:

(1)?BSP里提供了一些驅(qū)動程序支持。在BSP里包含了一些驅(qū)動程序的支持,其中包括驅(qū)動程序的中斷服務(wù)程序、驅(qū)動程序相關(guān)的結(jié)構(gòu)以及宏定義等。①除BSP包含與中斷向量表關(guān)聯(lián)的中斷服務(wù)程序外,還包含驅(qū)動程序定義的中斷服務(wù)程序。②BSP為驅(qū)動程序初始化創(chuàng)建的結(jié)構(gòu)對象。③為硬件寄存器定義的偏移常量和訪問宏,驅(qū)動程序?qū)⑹褂盟鼈儭?/p>

(2)為硬件驅(qū)動程序提供可移植性的代碼??梢浦残缘木W(wǎng)絡(luò)設(shè)備驅(qū)動程序代碼將允許開發(fā)者把它移植到新的硬件環(huán)境上,或者使開發(fā)者為常見的硬件環(huán)境提供新的網(wǎng)絡(luò)設(shè)備驅(qū)動程序。

(3)設(shè)備配置管理。包括:①可使用設(shè)備的全部特點。②將產(chǎn)品的開發(fā)與配置分開。

3.與硬件相關(guān)軟件的集成一個好的BSP不但功能齊全,它的靈活性、可讀性、可移植性等方面也是需要考慮的問題。

(1)提供代碼的適應(yīng)性和可移植性。適應(yīng)性和可移植性在這里是指:①編譯時的適應(yīng)性。②執(zhí)行時的可移植性。

(2)編譯時的適應(yīng)性。編譯時的適應(yīng)性主要從兩個方面來說明。①使用預(yù)處理宏定制系統(tǒng)。使用預(yù)處理宏,用戶可以根據(jù)自己的需要對BSP系統(tǒng)進行定制。例如:

#defineINCLUDE_ATA/*包含IDE/EIDE(ATA)硬盤驅(qū)動程序*/

#defineINCLUDE_FD/*包含軟盤驅(qū)動程序*/

②在不改變源程序的情況下,提供優(yōu)化目標(biāo)模塊的能力。這主要是指程序可根據(jù)用戶的配置,進行目標(biāo)模塊的優(yōu)化操作,如下所示:

voiduSRR0ot

(

Char*pMemPoolStart,/*系統(tǒng)內(nèi)存塊的起始位置*/ unsignedmemPoolSize/*初始化內(nèi)存池的大小*/

)

{

#ifdefINCLUDE_WDB WdbConfig();/*配置和初始化目標(biāo)機調(diào)試代理——WDB*/ vxBootFile[0]=NULL;/*清除引導(dǎo)行*/

}

(3)執(zhí)行時的可移植性。執(zhí)行時的可移植性主要包括兩個方面。①使用指針訪問程序。使用指針訪問程序,大大提高了程序的執(zhí)行速度,減少了系統(tǒng)開銷。②提供編譯對象模塊的可移植性。8.1.3BSP的文件結(jié)構(gòu)

BSP包含的程序是提供VxWorks訪問目標(biāo)機硬件環(huán)境的主要接口。因此,了解BSP的文件組成和結(jié)構(gòu)是十分必要也是十分重要的。在這之前,由于VxWorks系統(tǒng)是運行于Tornado開發(fā)環(huán)境下的,因此我們首先介紹在開發(fā)環(huán)境Tornado軟件包安裝后的模塊組成和目錄結(jié)構(gòu)。

1.Tornado的模塊組成

Tornado開發(fā)系統(tǒng)包含三個高度集成的部分:

(1)運行在宿主機和目標(biāo)機上功能強大的交叉開發(fā)工具和實用程序。

(2)運行在目標(biāo)機上的高性能、可剪裁(用戶可根據(jù)自己的需要配置系統(tǒng))的實時操作系統(tǒng)VxWorks。

(3)連接宿主機和目標(biāo)機的多種通信方式,如以太網(wǎng)、串口線、ICE(在線仿真器)、ROM仿真器或用戶定制的連接方式等。而這些部分主要由以下模塊組成:

·宿主機支持的包(HSP,HostSupportPackage)。

·通用(與目標(biāo)機無關(guān))的VxWorks。

·體系結(jié)構(gòu)模塊(與目標(biāo)機無關(guān))

·板級支持包——BSP。

·目標(biāo)機調(diào)試代理(WindDebuggAgent,WDB)。這些模塊在移植性、裁剪性、可維護性等方面非常方便,它們之間的層次如圖8.6所示。圖8.6Tornado模塊

Tornado的整個目錄結(jié)構(gòu)如圖8.7所示。通過上面的介紹,相信大家對Tornado的模塊組成和軟件結(jié)構(gòu)有了較為清晰的認識,下面我們將在這一基礎(chǔ)上詳細描述BSP文件的結(jié)構(gòu)組成。圖8.7Tornado軟件目錄結(jié)構(gòu)圖

2.BSP的組成

BSP主要由以下幾類文件組成。

1)源文件源文件主要是用C語言編寫的代碼所組成的文件。同時,有一部分文件是由體系結(jié)構(gòu)相關(guān)且執(zhí)行最優(yōu)化的匯編語言編寫的代碼組成。例如C語言編寫的bootConfig.c、usrConfig.c,匯編語言編寫的romInit.s、sysALib.s文件等。

2)頭文件頭文件包含針對CPU板的硬件定義及內(nèi)存定位定義的文件,例如config.h、configAll.h等文件。

3)?makefile文件

makefile文件控制構(gòu)造所有類型映像的文件,例如makefile文件。

4)派生文件派生文件包括由源文件、頭文件等其他文件衍生而成的文件和VxWorks存檔庫模塊。這些文件分為下面幾類:

(1)硬件初始化對象模塊。

(2)?VxWorks引導(dǎo)對象模塊。

(3)?VxWorks映像。

(4)?VxWorks二進制符號表。

BSP的組成文件主要包含在以下四個目錄里。

·…\Tornado\target\config\all

·…\Tornado\target\config\comps\VxWorks

·…\Tornado\target\config\comps\src

·…\Tornado\target\config\bspname下面我們將詳細描述這些文件目錄下的具體內(nèi)容。

3.BSP的源文件

1)?…\target\config\all目錄下的文件這個目錄下的文件作為VxWorks體系結(jié)構(gòu)產(chǎn)品的一部分而提交給用戶。如果不是特殊需要的話沒有必要更改這些文件。其中,比較特殊的是configAll.h文件。這個文件設(shè)置了所有類型VxWorks映像的默認配置。在這個文件里定義的宏是一些通用設(shè)置,如果所需的VxWorks映像不同于默認配置,可以使用config\bspname目錄下的config.h文件中所定義(#define或#undef)的宏來替換configAll.h的默認配置。通常,構(gòu)造工程并不直接使用config\all目錄下的文件,只有新建一個可引導(dǎo)型工程時才使用它們。用戶創(chuàng)建工程后,config\all目錄下文件的任何修改都不會影響工程。如果希望改變,則必須在工程區(qū)域直接進行修改。更改configAll.h文件將影響通過開發(fā)環(huán)境新創(chuàng)建的可引導(dǎo)型映像工程。所以一般情況下,在config.h文件中根據(jù)工程需要定義宏來替換configAll.h的默認宏定義,而不是直接修改configAll.h文件。

2)?…\target\config\bspname目錄下的文件這個子目錄包含系統(tǒng)或硬件相關(guān)的BSP文件。其主要由下面的文件組成:

(1)?Readme。Readme文件包含了BSP發(fā)布記錄。它記錄了每次發(fā)布版本、修改版本和在新版本上所做的工作。

(2)?makefile和depend.bspname文件。makefile文件控制使用命令行方式構(gòu)造映像。從VxWorks5.2開始,標(biāo)準(zhǔn)的make工具是GNUmake,并且當(dāng)前的make技術(shù)繼承了許多GNUmake的優(yōu)點。BSPmake系統(tǒng)包含了位于target\h\make目錄下的make子文件。如果某個相關(guān)性文件不存在,make將自動產(chǎn)生depend.bspname文件,它可以用來追蹤所有模塊的相關(guān)性。depend.bspname相關(guān)性文件并不包含在BSP文件中,它是一個自動產(chǎn)生的文件。

(3)?config.h文件。config.h文件包含了所有的頭文件和與CPU板相關(guān)的特殊定義。標(biāo)準(zhǔn)的config.h包含下面的內(nèi)容:①BSP版本號和修訂版本號。

#defineBSP_VERSION“1.2”

#defineBSP_REV“/0”/*0為第一次修訂版本*/②包含configAll.h文件。

#define“configAll.h”③高速緩沖存儲器和MMU的配置。

#defineUSER_I_CACHE_ENABLE

#defineUSER_D_CACHE_ENABLE

#defineUSER_B_CACHE_ENABLE

#defineUSER_I_MMU_ENABLE

#defineUSER_D_MMU_ENABLE

④共享內(nèi)存網(wǎng)絡(luò)定義。

#defineINCLUDE_SM_SEQ_ADDR⑤目標(biāo)板上的內(nèi)存地址和大小。

#defineLOCAL_MEM_LOCAL_ADRS0x00000000

#defineLOCAL_MEM_BUS_ADRS0x00000000

#defineLOCAL_MEM_SIZE0x00800000/*8MB或更低內(nèi)存*/⑥ROM地址和大小。

#defineROM_BASE_ADRS0xfff20000/*ROM的基地址*/

#defineROM_SIZE0x0007fe00/*ROM大小*/⑦非易失性RAM(NVRAM,non-volatilememory)參數(shù)。例如:

#defineNV_RAM_SIZENONE/*沒有NVRAM*/⑧默認引導(dǎo)參數(shù)。

#defineDEFAULT_BOOT_LINE

\“fd=0,0(0,0)host:/fd0/VxWorksh=e=0u=target”⑨時間戳(timestamp)驅(qū)動程序支持。

#defineINCLUDE_TIMESTAMP/*包含時間戳定時器,提供給WindView工具*/外部總線地址映射。網(wǎng)絡(luò)設(shè)備和中斷向量。

#defineINCLUDE_END/*使用增強型網(wǎng)絡(luò)驅(qū)動*/

#defineINCLUDE_FET/*包含IntelEtherExpressPR0100BPCI*/

#defineNUMBER_OF_IRQS24

#defineINT_NUM_IRQ00xe0/*IRQ0的向量號*/包含bspname.h文件。

#include“pc.h”注意,config.h文件應(yīng)包含configAll.h和bspname.h文件。

(4)?romInit.s文件。該文件包含引導(dǎo)ROM和基于ROM的VxWorks映像的入口初始化匯編代碼。romInit.s文件的入口點為romInit()函數(shù),是系統(tǒng)加電啟動后首先執(zhí)行的代碼。同時它也設(shè)置了啟動類型參數(shù)BOOT_COLD,并把該參數(shù)傳遞給通用的romStart()函數(shù)。如果硬件需要立即進行內(nèi)存映射或設(shè)置特殊的寄存器,則在這里處理。大部分硬件初始化操作在sysLib.c文件中的sysHwinit()函數(shù)里進行。在romInit()函數(shù)中,有三個必須執(zhí)行的主要功能:①屏蔽中斷,初始化CPU。②初始化內(nèi)存系統(tǒng),通常包括關(guān)閉高速緩存和初始化內(nèi)存控制器。對于SPARC體系結(jié)構(gòu)的目標(biāo)機,必須打開MMU。③初始化堆棧指針和其他寄存器以便能夠執(zhí)行C代碼,然后調(diào)用romStart()函數(shù)。值得注意的是,romInit()函數(shù)必須設(shè)計成與地址無關(guān)的代碼(Position-IndependentCode,PIC)。它需要支持綜合的VxWorks引導(dǎo)策略。如果必須使用絕對地址,通常會通過ROM_ADRS(x)宏對地址重新計算。該宏定義如下:

#defineROM_ADRS(x)((x)-_romInit+ROM_TEXT_ADRS)一個普遍的錯誤是BSP開發(fā)人員試圖在romInit.s里進行過多的初始化操作。實際上大部分其他初始化功能應(yīng)推遲到sysHwinit()函數(shù)中進行。另外,romInit.s中的代碼不應(yīng)當(dāng)被其他模塊或函數(shù)調(diào)用。另一個普遍的錯誤是BSP開發(fā)人員認為在romInit.s里初始化過的設(shè)備不需要在sysALib.s或sysLib.c中重新初始化。實際上VxWorks映像并不認為它是由引導(dǎo)映像程序引導(dǎo)的。因此,它必須重新設(shè)置和重新初始化所有它自己需要使用的設(shè)備。一般情況下,VxWorks的引導(dǎo)映像主要用于VxWorks映像的調(diào)試和開發(fā)階段。當(dāng)VxWorks映像開發(fā)結(jié)束后,VxWorks的引導(dǎo)映像也就完成了它的使命。注意,產(chǎn)品中的VxWorks映像盡量不要依賴于引導(dǎo)ROM映像。

(5)?sysAlib.s。這個文件包含目標(biāo)機體系結(jié)構(gòu)決定的、與系統(tǒng)有關(guān)的匯編程序。所有BSP程序應(yīng)當(dāng)用C語言編寫,然而如果由于編譯等原因需要用匯編語言編寫程序,那么可以把所編寫的匯編程序放到sysALib.s文件里。

sysALib.s文件里的sysInit()函數(shù)是VxWorks映像的入口點,系統(tǒng)引導(dǎo)后,首先執(zhí)行該段代碼。sysALib.s所執(zhí)行的所有功能類似于romInit.s的工作,但它不執(zhí)行系統(tǒng)內(nèi)存初始化操作。系統(tǒng)應(yīng)當(dāng)在程序啟動階段初始化內(nèi)存系統(tǒng)。與romInit.s不同的是,不需要把sysALib.s中的代碼編寫成與PIC無關(guān)的代碼或使用ROM_ADRS宏重新映射絕對地址。它可以調(diào)用其他模塊和程序。

(6)?sysLib.c。這個文件包含目標(biāo)機體系結(jié)構(gòu)決定的、與系統(tǒng)有關(guān)的C程序。這些程序提供板級接口,基于這些板級接口,VxWorks和應(yīng)用程序的構(gòu)造與系統(tǒng)無關(guān)。sysLib.c文件可以包含src/drv目錄下的驅(qū)動程序。驅(qū)動程序的安裝和初始化通常在子文件中完成,在sysLib.c中包含了這些操作。這些子文件通常的命名是sysSerial.c、sysScsi.c、sysNet.c等。使用子文件的目的是為了保持設(shè)備驅(qū)動程序的安裝和初始化不隨結(jié)構(gòu)的變化而改變。一塊目標(biāo)板上的設(shè)備安裝子文件應(yīng)該能被另一塊板上同樣的設(shè)備所使用。

(7)?sysSerial.c。這是一個可選文件,包含所有SIO設(shè)備串行I/O驅(qū)動程序的安裝和初始化。系統(tǒng)沒有單獨編譯它,而是將其包含在sysLib.c文件中。如果把串行設(shè)備初始化從sysLib.c中獨立出來形成一個模塊,則允許在BSP之間重復(fù)使用這個代碼。

(8)?sysScsi.c。這是一個可選文件,包含SCSI-2設(shè)備驅(qū)動程序的安裝和初始化。它像sysSerial.c文件一樣包含在sysLib.c文件中。

(9)?sysNet.c。這是一個可選文件,包含網(wǎng)絡(luò)接口驅(qū)動程序的安裝和初始化。

(10)?bspname.h。這個文件包含與目標(biāo)板有關(guān)的特殊信息定義,例如串行接口、時鐘、I/O設(shè)備。許多相關(guān)信息包含在target/h/drv目錄下,這些VxWorks所要使用的目標(biāo)板(包含設(shè)備的驅(qū)動程序頭文件)應(yīng)當(dāng)包含在bspname.h文件的開始。這個文件預(yù)定的常量信息不應(yīng)該影響用戶的配置。如果定義在bspname.h文件里的任何宏或值可以改變系統(tǒng)的定制,那么應(yīng)該由定義在config.h文件中的同樣的宏或值所替代。使用一個樣本頭文件是非常有用的,因為大多數(shù)已經(jīng)被定義的常量名、基本設(shè)備地址等已經(jīng)定義,只需要根據(jù)實際情況修改。bspname.h文件中應(yīng)定義下面的信息:①中斷向量、中斷級別。②I/O設(shè)備地址。③設(shè)備寄存器位的含義。④系統(tǒng)時鐘和輔助時鐘參數(shù)(最大和最小速率)。同樣,可使用一個目標(biāo)板描述來說明目標(biāo)板所需要的特殊宏定義(例如以“PCI_”為開頭定義相應(yīng)的設(shè)備)。

3)?…\target\config\camps\vxWorks目錄下的文件這個目錄下的文件是VxWorks實時內(nèi)核基本模塊描述文件(CDF文件)。有關(guān)詳細信息參考有關(guān)模塊描述語言(ComponentDescriptionLanguage,CDL)的相關(guān)書籍。

4)?…\target\canfig\camps\src目錄下的文件這個目錄下的文件是VxWorks實時內(nèi)核模塊配置文件,這些文件提供的代碼被usrConfig.c文件所使用。

4.派生文件所謂派生文件,是指從源文件、系統(tǒng)頭文件、驅(qū)動程序源文件和VxWorks文檔庫中的模塊衍生而來的文件。這些文件僅僅是為示范目的而衍生出來的文件,當(dāng)配置一個系統(tǒng)時,可以重新創(chuàng)建這些文件中的部分文件或所有文件。通過Tornado2.0開發(fā)環(huán)境創(chuàng)建工程時,這些派生文件被放置在工程目錄下。只有通過命令行方式構(gòu)造工程時,系統(tǒng)才會使用在BSP目錄下的派生文件副本。下面是一些派生文件。

(1)?bootInit.o、bootInit_res.o、bootInit_uncmp.o。ROM型映像有三個引導(dǎo)策略,分別是:壓縮的ROM型、非壓縮的ROM型、ROM駐留型。這三個引導(dǎo)策略可以被引導(dǎo)ROM映像或ROM型VxWorks映像所使用。模塊的名字指出了所使用的引導(dǎo)策略。

(2)?bootrom,是一個包含二進制的VxWorks引導(dǎo)ROM的對象文件。

(3)?bootrom.hex,是一個包含VxWorks引導(dǎo)ROM代碼的ASCII文件,適合于通過串行連接PROM編程器來進行下載。默認的編碼使用MotorolaS記錄文件格式。

(4)?bootrom.Z.s和bootrom.Z.o.,是壓縮型bootrom.o映像模塊的源程序和對象文件。

(5)?ctdt.o,是管理C++構(gòu)造/析構(gòu)函數(shù)的模塊。

(6)?dataSegPad.o,是保證代碼段和數(shù)據(jù)段不會共享同一個內(nèi)存頁的模塊。使用VxVMI模塊時,這個模塊強制數(shù)據(jù)段和代碼段處于不同的MMU頁中。

(7)?symTbl.c和sysALib.o,是內(nèi)置符號表的源程序和對象文件。

(8)?sysLib.o和sysALib.o,這兩個模塊總是一起成對出現(xiàn)。它們是sysLib.c和sysALib.s文件的輸出模塊。

(9)?romInit.o,這個模塊是引導(dǎo)映像或VxWorks映像的啟動代碼。對于Tornado2.0而言,它聯(lián)合romStart.o模塊一起工作,替代了bootInit.o。

(10)?VxWorks和vxWorks.sym,VxWorks文件是鏈接好的、完整的VxWorks二進制文件,可以在目標(biāo)機上運行。vxWorks.sym是VxWorks二進制文件的符號表文件。系統(tǒng)通過配置文件創(chuàng)建這兩個文件。

(11)?vxWorks.st,是一個鏈接好的、完整的、內(nèi)置符號表的VxWorks二進制文件。

(12)?target/proj/bspname_vx/*.*,這個目錄包含BSP工程文件和默認構(gòu)造輸出。有兩種方式創(chuàng)建一個新的工程:一種是使用工程工具;另一種是通過命令行的方式執(zhí)行make來實現(xiàn)。

(13)?doc/vxworks/bsp/bspname/*.*,這個目錄包含了用戶幫助系統(tǒng)的HTML文檔文件。在命令行方式下執(zhí)行makeman命令可以產(chǎn)生這些文檔。

5.?BSP里的函數(shù)

BSP里包括下面幾類函數(shù)。

1)初始化函數(shù)通過初始化函數(shù)進行三類操作:

(1)初始化硬件到已知狀態(tài)。

(2)標(biāo)識系統(tǒng)。

(3)初始化設(shè)備,如SCSI或常規(guī)設(shè)備。

2)內(nèi)存/地址空間函數(shù)通過內(nèi)存/地址空間函數(shù)主要獲得下面的信息:

(1)得到板上內(nèi)存大小。

(2)總線地址空間。

(3)設(shè)定/獲得非易失性RAM(NVRAM)。

(4)定義板的內(nèi)存位圖(可選)。

(5)為有MMU的處理器定義虛擬內(nèi)存到物理內(nèi)存的映射。

3)總線中斷函數(shù)總線中斷函數(shù)主要實現(xiàn)下述功能:

(1)打開/關(guān)閉總線中斷。

(2)產(chǎn)生總線中斷。

4)時鐘/定時器函數(shù)時鐘/定時器函數(shù)主要對時鐘/定時器進行兩步操作:

(1)打開/關(guān)閉定時中斷。

(2)設(shè)置定時器的周期性。

5)郵箱/位置監(jiān)視函數(shù)(可選)該函數(shù)用于打開郵箱/位置監(jiān)視中斷。8.1.4BSP開發(fā)工具嵌入式系統(tǒng)開發(fā)的目標(biāo)之一就是使硬件運行得更快,因此必須開發(fā)BSP程序。隨著嵌入式系統(tǒng)應(yīng)用領(lǐng)域的擴大,WindRiver公司不可能向用戶提供所有的功能實現(xiàn)方法,所以開發(fā)者需要一種幫助自己快速、簡便地開發(fā)BSP的工具。板級支持包開發(fā)工具BSPDeveloper'sKit可以幫助開發(fā)者進行設(shè)計、歸檔和測試新設(shè)備的驅(qū)動程序和BSP的工作。下面我們將具體闡述板級支持包開發(fā)工具BSPDeveloper’sKit。板級支持包開發(fā)工具基本包(BSPDeveloper’sKitBaseOption)主要面向的是嵌入式系統(tǒng)開發(fā)者,其主要組成部分包括:

(1)板級支持包測試工具(BSPvalidationtestsuite):以源代碼形式提供給開發(fā)者,用來檢查BSP和驅(qū)動程序的基本功能以及報告存在的問題。

(2)板級支持包開發(fā)模板(TemplateBSP)。

(3)驅(qū)動程序開發(fā)模板(TemplateDriver)。

(4)?SCSI測試工具(SCSITestSuite):主要提供一些SCSI的測試程序。

(5)板級支持包開發(fā)工具文檔(DocumentationSet):主要闡述如何設(shè)計設(shè)備驅(qū)動程序、如何實現(xiàn)目標(biāo)機上的VxWorks的最小配置等。板級支持包開發(fā)工具高級包(BSPDeveloper’sKitValueOption)向開發(fā)者提供了WindRiver公司的一般驅(qū)動程序源代碼作為開發(fā)驅(qū)動程序和BSP的基礎(chǔ),其中包括了幾乎所有現(xiàn)成的標(biāo)準(zhǔn)驅(qū)功程序,例如:Ethernet、SCSI等驅(qū)動程序源代碼。其主要組成部分包括:

(1)板級支持包開發(fā)工具基本包。

(2)?Ethernet驅(qū)動程序源代碼。

(3)?SCSI驅(qū)動程序源代碼。8.2BSP的基本配置和VxWorks的初始化8.2.1BSP的基本配置用戶在開發(fā)目標(biāo)機的BSP之前,必須了解在VxWorks操作系統(tǒng)下BSP的配置,只有在熟悉BSP的配置后才可以正確地對BSP進行移植和修改工作,并根據(jù)自己的需求成功配置BSP。下面我們主要對目標(biāo)機硬件環(huán)境及硬件相關(guān)的參數(shù)進行配置。

1.ROM和RAM的布局用戶可以根據(jù)目標(biāo)機的具體情況對ROM和RAM的空間布局進行配置,配置過程主要是通過修改地址宏定義的值而達到目的,在config.h文件中定義了這些宏,主要有ROM_TEXT_ADRS、ROM_SIZE、RAM_LOW_ADRS、RAM_HIGH_ADRS等,具體配置如下:/*在makefile文件中定義了如下參數(shù)。這些參數(shù)在config.h中的定義值必須與makefile中定義的值相一致。*/#ifdefBOOTCODE_IN_RAM#defineROM_BASE_ADRS0x00008000/*ROM基地址*/#defineROM_TEXT_ADRS(ROM_BASE_ADRS)/*啟動點*/#defineROM_SIZE0x00090000/*ROM空間大小*/#else#defineROM_BASE_ADRS0xfff20000/*ROM基地址*/#defineROM_TEXT_ADRS(ROM_BASE_ADRS)/*EPROM啟動點*/#defineROM_SIZE0x0007fe00/*ROM空間大小*/#endif#defineRAM_LOW_ADRS0x00108000/*VxWorks映像入口點*/#defineRAM_HIGH_ADRS0x00008000/*引導(dǎo)映像入口點*/

2.內(nèi)存配置內(nèi)存的配置包括用戶駐留程序的內(nèi)存基地址、局部總線內(nèi)存基地址、內(nèi)存基地址以及內(nèi)存大小等,具體配置如下:

/*內(nèi)存地址*/

/*用戶保留內(nèi)存。讀取sysMemTop()*/

#defineUSER_RESERVED_MEM0

/*本地到總線內(nèi)存地址常量:本地內(nèi)存地址總是為0;它并非雙口內(nèi)存*/

#defineLOCAL_MEM_LOCAL_ADRS0x00000000 /*目標(biāo)機本地RAM起始地址*/

#defineLOCAL_MEM_BUS_ADRS0x00000000/*總線本地內(nèi)存起始地址*/

#defineLOCAL_MEM_SIZE0x00000000/*本地RAM大小為8MB*/

/*當(dāng)定義這個選項時,支持自動分配內(nèi)存帶大小。在這種情況下系統(tǒng)忽視

LOCAL_MEM_SIZE。相關(guān)信息請參考sysyPhysMemTop()函數(shù)。*/

#defineLOCAL_MEM_AUTOSIZE

3.啟動設(shè)備及參數(shù)配置啟動設(shè)備及參數(shù)配置主要包含引導(dǎo)參數(shù)的配置,即從哪里下載VxWorks映像、系統(tǒng)熱啟動后從什么設(shè)備上啟動系統(tǒng)以及與設(shè)備相關(guān)的其他參數(shù)配置等,具體配置如下。

1)默認引導(dǎo)參數(shù)設(shè)置下面以目標(biāo)機通過IntelEtherExpressPRO100BPCI接口的網(wǎng)卡,從宿主機“rainbow”上下載VxWorks映像為例進行默認引導(dǎo)參數(shù)配置說明。有關(guān)該參數(shù)的詳細說明請參考相關(guān)書籍。

#defineDEFAULT_BOOT_LINE“fei(0,0)rainbow:VxWorksh=19e=20u=userpw=usertn=user”

2)熱啟動設(shè)備和參數(shù)設(shè)置

/*熱啟動(重新啟動)設(shè)備和參數(shù)*/

#defineSYS_WARM_BIOS0/*從BIOS熱啟動*/

#defineSYS_WARM_FD1/*從軟盤熱啟動*/

#defineSYS_WARM_ATA2/*從ATA硬盤熱啟動*/

#defineSYS_WARM_TFFS3/*從片上系統(tǒng)(Diskonchip)熱啟動*/

#defineSYS_WARM_TYPESYS_WARM_FD/*熱啟動設(shè)備*/

#defineSYS_WARM_FD_DRIVE0/*0=驅(qū)動a:,1=b:*/

#defineSYS_WARM_FD_TYPE1/*0=3.2"2HD,1=5.25"2HD*/

#defineSYS_WARM_ATA_CTRL0/*控制器0*/

#defineSYS_WARM_ATA_DRIVE0/*0=c:,1=d:*/

#defineSYS_WARM_TFFS_DRIVE1/*0=c:(DOC)*/

4.外圍設(shè)備驅(qū)動程序及相關(guān)參數(shù)設(shè)置外圍設(shè)備驅(qū)動程序配置和相關(guān)參數(shù)配置描述了在配置文件中如何配置外圍設(shè)備,包括軟盤驅(qū)動器、硬盤、并行端口、時鐘、協(xié)處理器等驅(qū)動程序的配置。其中還包含了一些相關(guān)參數(shù)的配置,例如設(shè)備寄存器基地址、終端級等。具體一些配置如下。

1)配置TrueFFS驅(qū)動程序

#undefINCLUDE_TFFS/*包含TrueFFS驅(qū)動程序*/

2)配置軟盤驅(qū)動程序

#defineINCLUDE_FD/*包含軟盤驅(qū)動程序*/

/*軟盤驅(qū)動器(FD)相關(guān)參數(shù)宏定義,見文件pc.h*/

#defineFD_INT_LVL0x06 /*中斷號*/

#defineFD_DMA_BUF_ADDR0x2000/*軟驅(qū)DMA緩沖區(qū)地址*/

#defineFD_DMA_BUF_SIZE0x3000/*軟驅(qū)DMA緩沖區(qū)大小*/

3)并行端口驅(qū)動程序配置

#defineINCLUDE_LPT /*包含并行端口驅(qū)動程序*/

4)時鐘配置

/*SYS_CLK_RATE_MAX依賴于CPU的功率,應(yīng)用程序可以對它進行控制*/

(1)配置輔助時鐘。

#defineINCLUDE_AUX_CLK #defineAUX_CLK_RATE_MIN2 /*輔助時鐘最小tick數(shù)*/ #defineAUX_CLK_RATE_MAX8192 /*輔助時鐘最大tick數(shù)*/

(2)配置系統(tǒng)時鐘。

#defineINCLUDE_SYSCLK_INIT #defineSYS_CLK_RATE_MIN19 /*系統(tǒng)時鐘最小tick數(shù)*/ #defineSYS_CLK_RATE_MIN(PIT_CLOCK/256)/*系統(tǒng)時鐘最大tick數(shù)*/ #defineSYS_CLK_RATE60 /*系統(tǒng)時鐘tick數(shù)*/

(3)配置時間戳。

#undefINCLUDE_TIMESTAMP/*包含時間戳定時器驅(qū)動程序,以便提供給WindView*/

(4)時鐘相關(guān)地址定義。

/*定時器(PIT)*/

#definePIT_BASE_ADR0x40 /*定時器寄存器基地址*/

#definePIT0_INT_LVL0x00 /*中斷級*/

#definePIT_REG_ADDR_INTERVAL1

#definePIT_CLOCK1193180 /*定時器頻率*/

/*實時時鐘(RTC)*/

#defineRTC_INDEX0x70 /*實時時鐘控制寄存器地址*/

#defineRTC_DATA0x71 /*實時時鐘數(shù)據(jù)寄存器地址*

#defineRTC_INT_LVL0x08 /*中斷級*/

5)硬盤設(shè)置通過下面的宏定義可以配置系統(tǒng)支持ATA/IDE接口的硬盤。

#defineINCLUDE_ATA /*包括IDE/EIDE(ATA)接口硬盤驅(qū)動程序*/

5.文件系統(tǒng)配置

VxWorks系統(tǒng)中的文件系統(tǒng)是作為設(shè)備的驅(qū)動程序安裝在系統(tǒng)中的,它使用與設(shè)備驅(qū)動程序相同的標(biāo)準(zhǔn)I/O,但是它又是一個獨立的系統(tǒng)。這樣的設(shè)計使得一個VxWorks應(yīng)用可以使用多種文件系統(tǒng)而不發(fā)生沖突。同時根據(jù)這些標(biāo)準(zhǔn)接口協(xié)議,用戶還可以根據(jù)自己的需要編寫文件系統(tǒng),并將文件系統(tǒng)與相關(guān)的驅(qū)動程序相結(jié)合。它包含與MS-DOS系統(tǒng)兼容的文件系統(tǒng)、dosFs文件系統(tǒng)、原始文件系統(tǒng)、rawFslib文件系統(tǒng)、磁盤文件系統(tǒng)、tapeFs文件系統(tǒng)等。配置如下:

#defineINCLUDE_DOSFS/*包含dosFs文件系統(tǒng)*/

#undefINCLUDE_CDROMFS/*包含cdromFs文件系統(tǒng)*/

#defineINCLUDE_TAPEFS/*包含tapeFs文件系統(tǒng)*/

6.網(wǎng)絡(luò)驅(qū)動程序配置在VxWorks網(wǎng)絡(luò)系統(tǒng)運轉(zhuǎn)中,以太網(wǎng)是其中的一個介質(zhì),也是眾多廠商所支持的一個局域網(wǎng)規(guī)范。它是大多數(shù)VxWorks網(wǎng)絡(luò)應(yīng)用中的理想選擇,但是某些協(xié)議除外,比如BOOTP和DHCP,在VxWorks或主機網(wǎng)絡(luò)系統(tǒng)中它們固有地約束了以太網(wǎng)。至于以太網(wǎng)驅(qū)動程序的配置,WindRiver提供了一些廠商的以太網(wǎng)驅(qū)動程序,其中包括3COM、AMD、Intel等公司的網(wǎng)卡設(shè)備驅(qū)動程序,通常以庫文件或源代碼的形式安裝在Tornado目錄下,用戶通過配置后可以把它們包含到系統(tǒng)中去。

7.高速緩存配置如果硬件配置支持且系統(tǒng)又需要使用高速緩存,則需要對高速緩存進行配置。配置過程及相關(guān)要求、注意事項等說明如下:所有的高速緩存首先是關(guān)閉的,在BSP的基本功能完成以后,才激活高速緩存。高速緩存打開的步驟是首先打開指令高速緩存,接下來打開數(shù)據(jù)高速緩存。高速緩存最先處于非探聽狀態(tài)工作下,打開它們以后,如果目標(biāo)板支持才可以探聽。注意:當(dāng)MMU打開時,通過sysPhysMemDesc[]中的MMU表入口控制高速緩存,而不是通過高速緩存模式宏定義來控制。

8.堆棧配置在BSP的配置過程中,堆棧的配置也是應(yīng)關(guān)心的問題。因為系統(tǒng)需要使用堆棧,而用戶有時也需要保留一些堆棧來存放一些重要信息等,所以要對VxWorks系統(tǒng)如何布局堆棧有所了解。8.2.2VxWorks的初始化對于一個確定目標(biāo)系統(tǒng)的VxWorks,它的初始化按一定的時間順序進行,但對于不同版本的VxWorks其初始化序列也稍微不同。本節(jié)描述了一個典型的應(yīng)用配置中VxWorks的初始化序列,這些初始化步驟以VxWorks運行為序。為了清晰起見,這個序列分為多個主要階段或過程調(diào)用,關(guān)鍵過程以標(biāo)題列出,并且以排列順序進行描述。

1.VxWorks入口sysInit()

VxWorks系統(tǒng)開始運行的第一步是將VxWorks加載到主內(nèi)存。在VxWorksROM的控制下,通常從開發(fā)宿主機下載。下一步,引導(dǎo)ROM將控制權(quán)轉(zhuǎn)到VxWorks的啟動入口sysInit()。這個入口由在makefile和config.h中的配置參數(shù)RAM_LOW_ADRS定義。VxWorks內(nèi)存規(guī)劃隨不同的目標(biāo)體系結(jié)構(gòu)而不同。

sysInit()是與系統(tǒng)相關(guān)的用匯編語言編寫的模塊,該過程在文件sysALib.s中。它首先關(guān)閉所有中斷,禁止高速緩沖存儲器,并且將處理器寄存器(包括C堆棧指針)初始化為默認值。同時它也禁止跟蹤,清除所有掛起的硬件中斷,轉(zhuǎn)而調(diào)用usrInit(),該子程序是一段C程序,包含在文件usrConfig.c中。對于某些目標(biāo)機,sysInit()也完成一些小部分與系統(tǒng)相關(guān)的硬件初始化,以便能夠執(zhí)行sysInit()其余的初始化。它使用的初始堆棧指針占用的空間是在VxWorks系統(tǒng)映像的下部,但在中斷向量區(qū)的上面。

2.初始程序usrInit()在文件usrConfig.c的程序usrInit()中保存引導(dǎo)類型信息,在多任務(wù)內(nèi)核啟動前必須完成所有初始化,然后啟動內(nèi)核執(zhí)行。它是VxWorks運行的第一個C代碼,并且是在禁止所有硬件中斷下調(diào)用的。許多VxWorks服務(wù)不能由usrInit()程序調(diào)用,因為它沒有任務(wù)上下文(沒有TCB和任務(wù)堆棧),這包括能引起可搶占調(diào)度的服務(wù),如信號量,或使用該服務(wù)的服務(wù),如printf()。相反地,usrInit()需要建立一個初始任務(wù)usrRoot(),并啟動該任務(wù)。

usrInit()中的初始化包括下述內(nèi)容:高速緩沖存儲器初始化,usrInit()的開始初始化高速緩沖存儲器,設(shè)置高速緩沖存儲器的模式并且置為安全狀態(tài)。在usrRoot()的最后,允許使用指令與數(shù)據(jù)高速緩沖。系統(tǒng)BSS段初始化為0,C和C++語言指定所有未初始化的變量值為0。這些未初始化的變量被放在稱為BSS的段中。該段在引導(dǎo)時實際上是不加載的,usrInit()執(zhí)行后第一個任務(wù)是將含有BSS的內(nèi)存清為0。在ROM引導(dǎo)VxWorks時清除所有內(nèi)存。中斷向量初始化,在允許中斷和執(zhí)行內(nèi)核前必須建立異常中斷向量。首先,程序intVecBaseSet()被調(diào)用來建立向量表基地址;接著,excVecInit()初始化所有異常向量為默認中斷處理,以便能安全捕獲和處理當(dāng)程序出錯或硬件中斷引起的異常情況。將系統(tǒng)硬件初始化為靜止?fàn)顟B(tài),系統(tǒng)硬件初始化由調(diào)用子程序sysHwinit()完成,這主要包含復(fù)位和禁止硬件設(shè)備,在內(nèi)核啟動后允許產(chǎn)生中斷。這很重要,直到usrRoot()任務(wù)完成系統(tǒng)初始化,VxWorksISRs的中斷服務(wù)程序還沒有連接到中斷向量。但是,不要試圖在sysHwint()過程中連接中斷向量,因為此時存儲池仍未初始化。

3.初始化內(nèi)核

usrInit()程序以調(diào)用兩個內(nèi)核初始化函數(shù)宣告結(jié)束,這兩個函數(shù)為:

usrKernelInit()程序(在文件usrKernel.c中),用于調(diào)用適當(dāng)?shù)某跏蓟映绦颉?/p>

kernelInit()程序,用于初始化多任務(wù)環(huán)境中,并且永遠不返回,它需要以下參數(shù):被生成的作為根任務(wù)的應(yīng)用程序,典型的為usrRoot()。

(1)堆棧的大小。

(2)開始使用的內(nèi)存地址。也就是說,在VxWorks映像的主程序區(qū)、數(shù)據(jù)、BSS之后。在該區(qū)域之后的所有內(nèi)存都加到系統(tǒng)存儲池,由memPartLib管理。用于分配下載的動態(tài)模塊、任務(wù)控制塊等,都出自該區(qū)域。

(3)由sysMemTop()指出的內(nèi)存高端地址。

(4)中斷堆棧大小。

(5)中斷級。

kernelInit()調(diào)用intLockLevelSet(),禁止輪詢模式,建立中斷堆棧;然后在存儲池的高端創(chuàng)建根任務(wù)的堆棧和TCB,啟動根任務(wù)usrRoot();usrInit()運行結(jié)束后,允許中斷;禁止所有中斷源和清除掛起的中斷,這一點非常關(guān)鍵。初始化存儲池,VxWorks包括一個在memPartLib模塊中的內(nèi)存分配工具,用于管理可用的存儲器池。malloc()函數(shù)允許從存儲池中申請獲得可變大小的內(nèi)存塊。在內(nèi)部,VxWorks使用malloc()動態(tài)分配內(nèi)存,尤其許多VxWorks服務(wù)在初始化時使用它分配數(shù)據(jù)結(jié)構(gòu)。因此,存儲池初始化必須在其他任何VxWorks服務(wù)的初始化之前進行。注意,Tomado目標(biāo)服務(wù)器使用和管理一部分存儲器,用來支持目標(biāo)模塊下載和開發(fā)其他功能。

VxWorks大量使用malloc(),包括下載模塊分配的空間,任務(wù)啟動堆棧的分配,初始化分配的數(shù)據(jù)結(jié)構(gòu)。同時使用malloc()來分配任何應(yīng)用系統(tǒng)所需的內(nèi)存。除非必須為特殊用途保留一些絕對的存儲器區(qū)域外,建議將所有未使用的內(nèi)存部分配到VxWorks的存儲池。存儲池在程序kernelInit()中進行初始化。kernelInit()的參數(shù)指明了初始化存儲池的開始和結(jié)束地址。VxWorks采用usrInit()的默認分配,存儲池開始地址被設(shè)置為引導(dǎo)系統(tǒng)結(jié)束之后的部分,并且包含了所有剩余可用的存儲器??捎么鎯ζ鞯姆秶沙绦騭ysMemTop()決定,這是一個系統(tǒng)相關(guān)的程序,它定義可用存儲器的大小。如果系統(tǒng)還有其他不連續(xù)的存儲區(qū)域,一般地,可以在usrRoot()任務(wù)之后調(diào)用memAddToPool()并將它們加到系統(tǒng)存儲池,以便使用。

4.初始化任務(wù)usrRoot()當(dāng)多任務(wù)內(nèi)核開始執(zhí)行時,所有VxWorks多任務(wù)服務(wù)是可用的。在控制權(quán)轉(zhuǎn)到任務(wù)usrRoot()后,完成系統(tǒng)的初始化。主要初始化有:

(1)系統(tǒng)時鐘的初始化。

(2)?I/O系統(tǒng)和設(shè)備驅(qū)動的初始化。①控制臺設(shè)備的創(chuàng)建。②標(biāo)準(zhǔn)輸入/輸出的設(shè)置。③異常出路與登錄的安裝。④管道設(shè)備驅(qū)動的初始化。⑤標(biāo)準(zhǔn)I/O的初始化。⑥文件系統(tǒng)設(shè)備和磁盤驅(qū)動安裝的創(chuàng)建。⑦浮點運算支持的初始化。⑧性能監(jiān)視服務(wù)的初始化。

(3)可選服務(wù)的初始化。①WindView的初始化。②目標(biāo)調(diào)試機構(gòu)的初始化。③用戶提供的啟動腳本的初始化。參見文件config/all/usrConfig.c,并回顧usrRoot()完成的初始化序列,可以根據(jù)自己的目標(biāo)系統(tǒng)修改這些初始化。關(guān)于初始化的每一步含義和各種參數(shù)的意義將在以下的部分詳細介紹。

(4)系統(tǒng)時鐘的初始化。在任務(wù)usrRoot()中的第一個動作是初始化VxWorks時鐘,通過調(diào)用sysClkConnect()將系統(tǒng)時鐘中斷向量與中斷處理程序usrClock()建立連接。而后,系統(tǒng)時鐘的頻率(通常為60Hz)由sysClkRateSet()設(shè)置。大多數(shù)的目標(biāo)板允許時鐘頻率小于30Hz(有些甚至小于1Hz)或大于幾千赫茲。但通常不希望使用高于1000Hz的時鐘頻率,因為這樣會加重系統(tǒng)的額外開銷。當(dāng)時鐘頻率太快時,處理器要花費很多時間來處理中斷,且應(yīng)用程序因搶不到CPU而得不到運行。定時器驅(qū)動程序由WRS公司提供,包括一個sysHwInit2()調(diào)用,它是sysClkConnect()的一部分。BSP使用sysHwInit2()完成對目標(biāo)板的進一步初始化,而這些初始化在函數(shù)sysHwinit()中沒有完成。

(5)?I/O系統(tǒng)的初始化。如果在configAll.h中定義了INCLUDE_IO_SYSTEM,那么可通過調(diào)用iosIni()程序進行VxWorks的I/O系統(tǒng)初始化。調(diào)用參數(shù)指明了安裝設(shè)備驅(qū)動的最大數(shù)目,在系統(tǒng)中能夠同時打開的最大文件數(shù)目,在VxWorks的I/O系統(tǒng)中所希望的設(shè)備名稱。包含與不包含INCLUDE_IO_SYSTEM也會影響是否創(chuàng)建控制臺設(shè)備、標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯誤的建立。

(6)控制臺設(shè)備的創(chuàng)建。如果在配置中包括了INCLUDE_TTY_DEV板上串口設(shè)備驅(qū)動,就可以通過函數(shù)ttyDrv()調(diào)用初始化時安裝在系統(tǒng)中的I/O設(shè)備驅(qū)動程序。實際設(shè)備的建立與命名是通過設(shè)備創(chuàng)建程序來完成的,典型調(diào)用為ttyDevCreate()。這個程序的調(diào)用參數(shù)包括設(shè)備名,一個串行I/O通道的描述,輸入/輸出緩沖區(qū)的大小。宏NUM_TTY指定了TTY端口的數(shù)目(默認是2),CONSOLE_TTY指定了控制臺的端口(默認為0),CONSOLE_BAUD_RATE指定了波特率(默認為9600)。這些宏在文件configAll.h中定義,但是對于非標(biāo)準(zhǔn)端口的目標(biāo)板可以在config.h文件中重寫。

(7)標(biāo)準(zhǔn)輸入、輸出、錯誤的設(shè)置。這些功能的分配是由操作控制臺和調(diào)用ioGlobalStdSet()來建立的。這是VxWorks作為默認設(shè)備用來與應(yīng)用開發(fā)系統(tǒng)進行通信,并將控制臺作為一個交互式中斷,通過設(shè)置選項OPT_TERMINAL和調(diào)用ioctl()進行設(shè)置。

(8)異常處理與登錄安裝。

VxWorks的異常處理服務(wù)(由模塊excLib提供)和登錄服務(wù)(由logLib提供)的初始化早在根任務(wù)執(zhí)行前已進行。它們檢查根任務(wù)本身或者各種服務(wù)在初始化過程中的程序錯誤。當(dāng)INCLUDE_EXC_HANDLING和INCLUDE_EXC_TAS在配置文件中定義后,異常處理通過調(diào)用excInit()進行初始化。excInit()函數(shù)啟動異常支持任務(wù)exctask()。初始化之后,由硬件異常造成的程序錯誤能被安全地捕獲和報告,此外沒有被初始化的硬件中斷向量也能進行處理。VxWorks通過發(fā)信號量來使用指定的一場處理任務(wù),該信號量由sigInit()完成初始化,當(dāng)然必須定義INCLUDE_SIGNALS選項。當(dāng)INCLUDE_LOGGING被定義后,登錄服務(wù)調(diào)用logInit()進行初始化。參數(shù)指定了登錄信息寫入的設(shè)備文件描述符及非匹配登錄信息緩沖區(qū)的個數(shù)。登錄初始化過程也包括啟動一個登錄任務(wù)logTask()。

(9)管道設(shè)備驅(qū)動的初始化。如果希望有一個命名的管道,那么可在文件configAll.h中定義INCLUDE_PIPE選項,管道驅(qū)動程序pipeDrv()自動被調(diào)用,進而進行初始化管道服務(wù)。管道必須用pipeDevCreate()來創(chuàng)建,而后,任務(wù)就能夠使用管道相互通信。

(10)文件系統(tǒng)設(shè)備驅(qū)動的創(chuàng)建和設(shè)備驅(qū)動器程序的初始化。許多VxWorks配置至少包括一個磁盤或RAM盤,采用dosFs、rtllFs或rawFs文件系統(tǒng)。首先磁盤驅(qū)動程序通過調(diào)用驅(qū)動初始化程序進行安裝;其次設(shè)備創(chuàng)建程序并定義一個設(shè)備,這個調(diào)用返回指向描述該設(shè)備的數(shù)據(jù)結(jié)構(gòu)BLK_DEV。然后,新的設(shè)備能夠通過調(diào)用系統(tǒng)設(shè)備初始化程序(osFsDevInit(),rtllFsDevInit(),rawFsDevInit())進行初始化和命名,各種文件格式由INCLUDE_DOSFS、INCLUDE_RTLLFS和INCLUDE_RAWFS定義(在設(shè)備初始化前,文件系統(tǒng)模塊應(yīng)先采用osFsDevInit()、rtllFsDevInit()、rawFsDevInit()進行初始化)。文件系統(tǒng)設(shè)備初始化參數(shù)與特殊的文件系統(tǒng)相關(guān),包括設(shè)備名、一個指向由設(shè)備創(chuàng)建程序建立的數(shù)據(jù)結(jié)構(gòu)BLK_DEV,還有一些特定的文件系統(tǒng)配置參數(shù)。

(11)浮點支持的初始化。在文件configAll.h中定義NCLUDE_FLOATING_POINT后,浮點I/O由調(diào)用floatInit()進行初始化,當(dāng)包含INCLUDE_HW_FP時,支持浮點的協(xié)處理器由調(diào)用mathHardInit()進行初始化。

(12)網(wǎng)絡(luò)初始化。在使用網(wǎng)絡(luò)之前,必須使用usrNetInit()進行初始化。當(dāng)一個頭文件中包含INCLUDE_NET_INIT時,usrRoot()將調(diào)用該函數(shù)(usrNetInit()的源程序在src/config/usrNetwork.c文件中)并以配置字符行為參數(shù)。配置字符行通常稱為引導(dǎo)行,它在VxWorks的ROM引導(dǎo)系統(tǒng)中指定?;谶@個字符行,usrNetInit()執(zhí)行以下網(wǎng)絡(luò)初始化:①調(diào)用程序netLibInit()初始化網(wǎng)絡(luò)子系統(tǒng)。②連接和配置適當(dāng)?shù)木W(wǎng)絡(luò)驅(qū)動程序。③添加網(wǎng)關(guān)通道。④初始化遠程文件存取驅(qū)動程序netDrv,并添加遠程文件存取設(shè)備。⑤初始化遠程登錄工具。⑥可選擇的初始化遠程調(diào)用服務(wù)(RPC)。⑦可選擇的初始化網(wǎng)絡(luò)文件系統(tǒng)服務(wù)(NFS)。

(13)可選擇產(chǎn)品與其他服務(wù)的初始化。共享存儲器由可選產(chǎn)品VxMP提供,在使用共享存儲器的目標(biāo)之前,必須使用程序usrSmObjInit()(在文件src/config/usrSmObj.c中)對它們進行初始化,如果包括了INCLUDE_SM_OBJ,則由usrRoot()調(diào)用;如果選項INCLUDE_MMU_BASIC已被定義,則初始化程序保護和向量表保護。

Tornado移植了GNUC++編譯器,對于GNU編譯器或可選的CenterLine編譯器,要初始化以支持C++,由INCLUDE_CPLUS或INCLUDE_CPLUS_MIN定義。若要包括一個或更多類庫,則定義適當(dāng)?shù)倪x項INCLUDE_CPLUS_library。

(14)?WindView的初始化。內(nèi)核分析器由可選的WindView提供,當(dāng)在文件configAll.h中定義INCLUDE_INSTRUMENTATION時,由程序usrRoot()初始化。

(15)目標(biāo)機調(diào)試機構(gòu)的初始化。如果定義了INCLUDE_WDB,則文件src/config/usrWdb.c中的wdbConfig()可被調(diào)用。改變程序初始化通信接口,然后運行調(diào)試機構(gòu),以配置調(diào)試機構(gòu)的信息及其初始化序列。

(16)啟動腳本的執(zhí)行。如果將駐留目標(biāo)系統(tǒng)的命令解釋程序配置到VxWorks中,usrRoot()函數(shù)運行用戶提供的腳本,定義宏INCLUDE_STSRTUP_SCRIPT和啟動腳本的參數(shù),腳本的文件名在引導(dǎo)時指定,如果沒有參數(shù),則腳本不被執(zhí)行。

5.初始化序列總結(jié)典型配置的VxWorks整個實時系統(tǒng)初始化包括以下幾個方面:

(1)系統(tǒng)初始化函數(shù)sysInit(),該函數(shù)在文件sysALib.s中,包含:①關(guān)閉所有中斷。②禁止高速緩沖存儲器。③初始化系統(tǒng)的中斷表。④初始化系統(tǒng)默認的表。⑤初始化CPU寄存器為已知默認值。⑥禁止跟蹤。 ⑦清除所有未處理的中斷。⑧用指定的引導(dǎo)類型調(diào)用usrInit()函數(shù)。

(2)?usrInit(),該函數(shù)在文件usrcongfig.c中,包含:①將bss未初始化的段清0。②將引導(dǎo)類型保存到sysStartType中。③調(diào)用異常向量初始化函數(shù)excVecInit(),初始化所有系統(tǒng)和默認的中斷向量。④調(diào)用系統(tǒng)的硬件設(shè)備初始化函數(shù)sysHwinit()。⑤調(diào)用核心庫初始化函數(shù)usrKernelInit()。⑥調(diào)用內(nèi)核初始化函數(shù)kernelInit()。

(3)?usrKernelInit(),該函數(shù)在文件usrkernel.c中,如果定義了相應(yīng)的配置,則調(diào)用以下的子程序:①classLibInit()。②taskLibInit()。③taskHookInit()。④semBLibInit()。⑤semMLibInit()。⑥semCLibInit()。⑦semOLibInit()。⑧wdLibInit()。

(4)?kerneInit()初始化并啟動內(nèi)核:①調(diào)用intLockLevelSet()。②在存儲池高端創(chuàng)建根任務(wù)和任務(wù)控制塊TCB。③調(diào)用任務(wù)初始化函數(shù)taskInit()。④調(diào)用任務(wù)激活函數(shù)taskActivate()。⑤轉(zhuǎn)到函數(shù)usrRoot()。

(5)?usrRoot()初始化I/O系統(tǒng),安裝設(shè)備的驅(qū)動,根據(jù)配置文件configAll.h和config.h中的配置創(chuàng)建指定的設(shè)備。①調(diào)用函數(shù)sysClkConnect(),建立系統(tǒng)時鐘中斷處理。②調(diào)用函數(shù)sysClkRateSet(),初始化系統(tǒng)時鐘頻率。③調(diào)用函數(shù)iosInit(),初始化I/O設(shè)備控制塊。④如果在配置中定義了INCLUDE_TTY_DEV和NUM_TTY,則可調(diào)用函數(shù)ttyDrv()。建立控制臺標(biāo)準(zhǔn)輸入、標(biāo)誰輸出、標(biāo)準(zhǔn)錯誤接口:STD_IN、STD_OUT、STD_ERR。⑤初始化異常處理,調(diào)用函數(shù)excInit()、logInit()、sigInit()。⑥調(diào)用函數(shù)pipeDrv()初始化管道設(shè)備。⑦標(biāo)誰I/O庫初始化函數(shù)stdioinit()。⑧初始化數(shù)學(xué)函數(shù)庫,初始化軟件仿真函數(shù)mathSoftInit()或硬件支持函數(shù)mathHardInit()。⑨調(diào)用函數(shù)wdconfig()進行配置并初始化目標(biāo)機調(diào)試器。⑩如果配置了駐留目標(biāo)機的命令解釋,則啟動該腳本。

(6)初始化應(yīng)該注意的問題。首先,應(yīng)該避免在romInit.s中進行過多的初始化操作。該文件中只是進行必要的最小硬件初始化,大部分硬件的初始化都是在sysHwinit()中完成的。另外,romInit.s中的代碼不應(yīng)當(dāng)被其他模塊或函數(shù)調(diào)用。其次,應(yīng)該避免sysAlib.s中的工作太少。BSP開發(fā)人員通常錯誤地認為在romInit.s里初始化過的設(shè)備不需要在sysAlib.s中重新初始化。實際上,VxWorks映像并不認為它是由引導(dǎo)映像程序引導(dǎo)的,因此,它必須重新設(shè)置和初始化所有它自己需要使用的設(shè)備。sysInit()是該文件中最主要的一個函數(shù),也是第一個函數(shù)。該例程中很多工作與romInit()是相同的,目的是保證內(nèi)核映像在運行與冷啟動時,軟硬件環(huán)境高度一致。8.3BSP的開發(fā)要求及開發(fā)過程8.3.1開發(fā)要求

BSP的開發(fā)包含很多模塊,當(dāng)許多人共同設(shè)計一個由許多模塊組成的系統(tǒng)時,不同時間內(nèi)會出現(xiàn)不同的版本,不同的人會有不同的編程風(fēng)格及文檔

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論