版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章VxWorkshopBSP基礎(chǔ)及其開發(fā)過程8.1BSP基礎(chǔ)理論知識(shí)8.2BSP的基本配置和VxWorks的初始化8.3BSP的開發(fā)要求及開發(fā)過程8.4BSP中設(shè)備驅(qū)動(dòng)程序的開發(fā)8.5本章小結(jié)8.1BSP基礎(chǔ)理論知識(shí)從本章開始,我們將討論VxWorks的一個(gè)重要組成部分——BSP(BoardSupportPackage)。在目標(biāo)機(jī)系統(tǒng)加電以后,首先執(zhí)行的代碼就是BSP,它的重要性是不言而喻的。8.1.1BSP概述
BSP即板級(jí)支持包,通常是指針對(duì)具體的硬件平臺(tái),用戶所編寫的啟動(dòng)代碼和部分設(shè)備驅(qū)動(dòng)程序的集合,是介于主板硬件和操作系統(tǒng)之間的一層,應(yīng)該說是屬于操作系統(tǒng)的一部分,主要目的是為了支持操作系統(tǒng),使之能夠更好地運(yùn)行于硬件主板上。它來源于嵌入式操作系統(tǒng)與硬件無關(guān)的設(shè)計(jì)思想,操作系統(tǒng)被設(shè)計(jì)為運(yùn)行在虛擬的硬件平臺(tái)上。對(duì)于具體的硬件平臺(tái),與硬件相關(guān)的代碼都被封裝在BSP中,由BSP向上提供虛擬的硬件平臺(tái),BSP與操作系統(tǒng)通過定義好的接口進(jìn)行交互。以上是從BSP的功能去理解BSP,但是到目前為止還沒有對(duì)BSP得出明確的定義。在VxWorks系統(tǒng)中,對(duì)BSP的簡(jiǎn)單描述為介于底層硬件環(huán)境和VxWorks之間的一個(gè)軟件接口。BSP的主要特點(diǎn)是硬件相關(guān)性和操作系統(tǒng)相關(guān)性。因此BSP與操作系統(tǒng)是相對(duì)應(yīng)的,不同的操作系統(tǒng)就應(yīng)該對(duì)應(yīng)于不同定義形式的BSP。例如,VxWorks的BSP和Linux的BSP相對(duì)于某一CPU來說盡管實(shí)現(xiàn)的功能一樣,可是寫法和接口定義是完全不同的,所以寫B(tài)SP一定要按照該操作系統(tǒng)BSP的定義形式來寫(BSP的編程過程大多數(shù)是在某一個(gè)成型的BSP模板上進(jìn)行修改)。這樣才能與上層OS保持正確的接口,良好地支持上層OS。最基本的BSP僅需要支持處理機(jī)復(fù)位、初始化、驅(qū)動(dòng)串口和必要的時(shí)鐘處理。在VxWorks中,它的主要功能是系統(tǒng)加電后初始化目標(biāo)機(jī)硬件、初始化操作系統(tǒng)及提供部分硬件的驅(qū)動(dòng)程序,具體的功能包含如下:
(1)初始化。所謂初始化是指從系統(tǒng)上電復(fù)位直到VxWorks開始初始化用戶應(yīng)用時(shí)(即WindKernel和tUsrroot啟動(dòng))的一段時(shí)間內(nèi)系統(tǒng)所執(zhí)行的過程。這個(gè)過程主要包括三個(gè)部分的工作。圖8.1具體描述了VxWorks系統(tǒng)BSP的初始化過程。①CPU初始化。初始化CPU的內(nèi)部寄存器(如狀態(tài)寄存器、控制寄存器、高速緩存等)。②目標(biāo)機(jī)初始化。初始化控制芯片的寄存器(如BUS、DMA、DRAM)和I/O設(shè)備寄存器(驅(qū)動(dòng)各設(shè)備),為整個(gè)軟件系統(tǒng)提供底層硬件環(huán)境的支持,打開設(shè)備。③系統(tǒng)資源初始化。為操作系統(tǒng)及系統(tǒng)的正常運(yùn)行做準(zhǔn)備,進(jìn)行資源初始化(如操作系統(tǒng)初始化、空間分配等)。
(2)使VxWorks能夠訪問硬件驅(qū)動(dòng)程序。這主要是指BSP包含部分必要的設(shè)備驅(qū)動(dòng)程序和相關(guān)設(shè)備的初始化操作。我們可以將VxWorks系統(tǒng)的驅(qū)動(dòng)程序抽象為三個(gè)層次:常規(guī)操作、與I/O系統(tǒng)的接口、與Component的接口。VxWorks系統(tǒng)驅(qū)動(dòng)程序的抽象邏輯如圖8.2所示。圖8.1VxWorks系統(tǒng)BSP的初始化過程圖8.2VxWorks系統(tǒng)驅(qū)動(dòng)程序的抽象邏輯在VxWorks系統(tǒng)驅(qū)動(dòng)程序的抽象邏輯中,常規(guī)操作是設(shè)備的固有操作邏輯,具有兩層含義。它在微觀上表現(xiàn)為CPU操作設(shè)備的寄存器。如圖8.3所示,CPU對(duì)控制電路、數(shù)字電路和I/O處理器的各種寄存器進(jìn)行操作,例如對(duì)I/O進(jìn)行編址。在宏觀上它表現(xiàn)為具體的驅(qū)動(dòng)操作。在VxWorks系統(tǒng)驅(qū)動(dòng)程序的抽象邏輯中,驅(qū)動(dòng)程序與I/O系統(tǒng)的接口、驅(qū)動(dòng)程序與Component的接口有如下三層含義:①I/O管理。②操作類型規(guī)定。③參數(shù)規(guī)定。驅(qū)動(dòng)程序與I/O系統(tǒng)的接口使驅(qū)動(dòng)程序具有更好的層次性,驅(qū)動(dòng)程序與Component的接口使驅(qū)動(dòng)程序具有更好的抽象性。圖8.3CPU對(duì)設(shè)備寄存器的操作示意圖
WindRiver公司提供大量預(yù)制的支持許多商業(yè)主板及評(píng)估板的BSP。同時(shí),VxWorks的開放式設(shè)計(jì)以及高度的可移植性使得用戶在使用不同的目標(biāo)板進(jìn)行開發(fā)時(shí),所做的移植工作量非常小。到目前為止,WindRiver公司能夠提供超過200個(gè)的BSP,當(dāng)用戶在為自己的目標(biāo)板開發(fā)BSP時(shí),可以從WindRiver公司的標(biāo)準(zhǔn)BSP中選一個(gè)最接近的來加以修改。另外,WindRiver還提供了BSPDevelopKIT,包括流行標(biāo)準(zhǔn)板的BSPsourcecode,以及BSP開發(fā)效果的校驗(yàn)工具,以方便用戶。圖8.4為基于VxWorks操作系統(tǒng)的系統(tǒng)運(yùn)行時(shí)的結(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)運(yùn)行時(shí)的結(jié)構(gòu)在以后所討論的BSP中,如果未加說明都是指VxWorks所包含的BSP。既然BSP是相對(duì)于操作系統(tǒng)而言的,那么BSP和VxWorks之間的關(guān)系到底是怎樣的呢?圖8.5所示的BSP在系統(tǒng)中的層次清楚地展現(xiàn)了BSP與VxWorks之間的具體關(guān)系以及在目標(biāo)機(jī)應(yīng)用系統(tǒng)中BSP所處的地位。從圖中可以發(fā)現(xiàn)BSP不是一個(gè)設(shè)備驅(qū)動(dòng)程序,因?yàn)樵O(shè)備驅(qū)動(dòng)程序能夠訪問硬件設(shè)備(例如網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序、SCSI設(shè)備驅(qū)動(dòng)程序),同時(shí)相同類型設(shè)備的驅(qū)動(dòng)程序,可以不做修改從一個(gè)目標(biāo)環(huán)境中移植到另一個(gè)目標(biāo)環(huán)境中(例如網(wǎng)卡驅(qū)動(dòng)程序);而BSP則是只能運(yùn)行在指定設(shè)備的硬件環(huán)境中。就BSP開發(fā)而言,簡(jiǎn)單地說BSP開發(fā)人員需要完成以下兩方面的工作:①完全支持BSP管理的設(shè)備。②通用設(shè)備驅(qū)動(dòng)程序的集成工作。圖8.5BSP在系統(tǒng)中的層次8.1.2BSP所要實(shí)現(xiàn)的功能
BSP既然有如此重要的地位,那么它到底有哪些功能呢?概括起來,主要有下面幾個(gè)要點(diǎn)。
1.目標(biāo)機(jī)硬件環(huán)境的初始化
VxWorks的引導(dǎo)順序具體過程將隨著處理器和硬件環(huán)境的變化而變化,目標(biāo)機(jī)通用初始化的必要條件是:
(1)在存儲(chǔ)器里的特殊地址處提供一段代碼,當(dāng)復(fù)位或加電目標(biāo)機(jī)時(shí)處理器將立即執(zhí)行這段代碼。
(2)設(shè)置處理器為某個(gè)具體的狀態(tài)。
(3)初始化存儲(chǔ)器并對(duì)存儲(chǔ)器進(jìn)行編址。
(4)關(guān)閉中斷。
(5)將控制權(quán)移交給附加的引導(dǎo)代碼。
(6)裝載需要的VxWorks段到RAM中,例如把數(shù)據(jù)段從ROM拷貝到RAM中。
(7)在初始化VxWorks內(nèi)核前,使目標(biāo)機(jī)硬件處于一個(gè)靜止?fàn)顟B(tài)。
2.硬件驅(qū)動(dòng)程序的集成訪問硬件設(shè)備驅(qū)動(dòng)程序,BSP必須包含設(shè)備驅(qū)動(dòng)程序的相關(guān)支持、設(shè)備的配置管理等。這主要是指下面幾個(gè)方面:
(1)?BSP里提供了一些驅(qū)動(dòng)程序支持。在BSP里包含了一些驅(qū)動(dòng)程序的支持,其中包括驅(qū)動(dòng)程序的中斷服務(wù)程序、驅(qū)動(dòng)程序相關(guān)的結(jié)構(gòu)以及宏定義等。①除BSP包含與中斷向量表關(guān)聯(lián)的中斷服務(wù)程序外,還包含驅(qū)動(dòng)程序定義的中斷服務(wù)程序。②BSP為驅(qū)動(dòng)程序初始化創(chuàng)建的結(jié)構(gòu)對(duì)象。③為硬件寄存器定義的偏移常量和訪問宏,驅(qū)動(dòng)程序?qū)⑹褂盟鼈儭?/p>
(2)為硬件驅(qū)動(dòng)程序提供可移植性的代碼??梢浦残缘木W(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序代碼將允許開發(fā)者把它移植到新的硬件環(huán)境上,或者使開發(fā)者為常見的硬件環(huán)境提供新的網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序。
(3)設(shè)備配置管理。包括:①可使用設(shè)備的全部特點(diǎn)。②將產(chǎn)品的開發(fā)與配置分開。
3.與硬件相關(guān)軟件的集成一個(gè)好的BSP不但功能齊全,它的靈活性、可讀性、可移植性等方面也是需要考慮的問題。
(1)提供代碼的適應(yīng)性和可移植性。適應(yīng)性和可移植性在這里是指:①編譯時(shí)的適應(yīng)性。②執(zhí)行時(shí)的可移植性。
(2)編譯時(shí)的適應(yīng)性。編譯時(shí)的適應(yīng)性主要從兩個(gè)方面來說明。①使用預(yù)處理宏定制系統(tǒng)。使用預(yù)處理宏,用戶可以根據(jù)自己的需要對(duì)BSP系統(tǒng)進(jìn)行定制。例如:
#defineINCLUDE_ATA/*包含IDE/EIDE(ATA)硬盤驅(qū)動(dòng)程序*/
#defineINCLUDE_FD/*包含軟盤驅(qū)動(dòng)程序*/
②在不改變?cè)闯绦虻那闆r下,提供優(yōu)化目標(biāo)模塊的能力。這主要是指程序可根據(jù)用戶的配置,進(jìn)行目標(biāo)模塊的優(yōu)化操作,如下所示:
voiduSRR0ot
(
Char*pMemPoolStart,/*系統(tǒng)內(nèi)存塊的起始位置*/ unsignedmemPoolSize/*初始化內(nèi)存池的大小*/
)
{
…
#ifdefINCLUDE_WDB WdbConfig();/*配置和初始化目標(biāo)機(jī)調(diào)試代理——WDB*/ vxBootFile[0]=NULL;/*清除引導(dǎo)行*/
…
}
(3)執(zhí)行時(shí)的可移植性。執(zhí)行時(shí)的可移植性主要包括兩個(gè)方面。①使用指針訪問程序。使用指針訪問程序,大大提高了程序的執(zhí)行速度,減少了系統(tǒng)開銷。②提供編譯對(duì)象模塊的可移植性。8.1.3BSP的文件結(jié)構(gòu)
BSP包含的程序是提供VxWorks訪問目標(biāo)機(jī)硬件環(huán)境的主要接口。因此,了解BSP的文件組成和結(jié)構(gòu)是十分必要也是十分重要的。在這之前,由于VxWorks系統(tǒng)是運(yùn)行于Tornado開發(fā)環(huán)境下的,因此我們首先介紹在開發(fā)環(huán)境Tornado軟件包安裝后的模塊組成和目錄結(jié)構(gòu)。
1.Tornado的模塊組成
Tornado開發(fā)系統(tǒng)包含三個(gè)高度集成的部分:
(1)運(yùn)行在宿主機(jī)和目標(biāo)機(jī)上功能強(qiáng)大的交叉開發(fā)工具和實(shí)用程序。
(2)運(yùn)行在目標(biāo)機(jī)上的高性能、可剪裁(用戶可根據(jù)自己的需要配置系統(tǒng))的實(shí)時(shí)操作系統(tǒng)VxWorks。
(3)連接宿主機(jī)和目標(biāo)機(jī)的多種通信方式,如以太網(wǎng)、串口線、ICE(在線仿真器)、ROM仿真器或用戶定制的連接方式等。而這些部分主要由以下模塊組成:
·宿主機(jī)支持的包(HSP,HostSupportPackage)。
·通用(與目標(biāo)機(jī)無關(guān))的VxWorks。
·體系結(jié)構(gòu)模塊(與目標(biāo)機(jī)無關(guān))
·板級(jí)支持包——BSP。
·目標(biāo)機(jī)調(diào)試代理(WindDebuggAgent,WDB)。這些模塊在移植性、裁剪性、可維護(hù)性等方面非常方便,它們之間的層次如圖8.6所示。圖8.6Tornado模塊
Tornado的整個(gè)目錄結(jié)構(gòu)如圖8.7所示。通過上面的介紹,相信大家對(duì)Tornado的模塊組成和軟件結(jié)構(gòu)有了較為清晰的認(rèn)識(shí),下面我們將在這一基礎(chǔ)上詳細(xì)描述BSP文件的結(jié)構(gòu)組成。圖8.7Tornado軟件目錄結(jié)構(gòu)圖
2.BSP的組成
BSP主要由以下幾類文件組成。
1)源文件源文件主要是用C語言編寫的代碼所組成的文件。同時(shí),有一部分文件是由體系結(jié)構(gòu)相關(guān)且執(zhí)行最優(yōu)化的匯編語言編寫的代碼組成。例如C語言編寫的bootConfig.c、usrConfig.c,匯編語言編寫的romInit.s、sysALib.s文件等。
2)頭文件頭文件包含針對(duì)CPU板的硬件定義及內(nèi)存定位定義的文件,例如config.h、configAll.h等文件。
3)?makefile文件
makefile文件控制構(gòu)造所有類型映像的文件,例如makefile文件。
4)派生文件派生文件包括由源文件、頭文件等其他文件衍生而成的文件和VxWorks存檔庫模塊。這些文件分為下面幾類:
(1)硬件初始化對(duì)象模塊。
(2)?VxWorks引導(dǎo)對(duì)象模塊。
(3)?VxWorks映像。
(4)?VxWorks二進(jìn)制符號(hào)表。
BSP的組成文件主要包含在以下四個(gè)目錄里。
·…\Tornado\target\config\all
·…\Tornado\target\config\comps\VxWorks
·…\Tornado\target\config\comps\src
·…\Tornado\target\config\bspname下面我們將詳細(xì)描述這些文件目錄下的具體內(nèi)容。
3.BSP的源文件
1)?…\target\config\all目錄下的文件這個(gè)目錄下的文件作為VxWorks體系結(jié)構(gòu)產(chǎn)品的一部分而提交給用戶。如果不是特殊需要的話沒有必要更改這些文件。其中,比較特殊的是configAll.h文件。這個(gè)文件設(shè)置了所有類型VxWorks映像的默認(rèn)配置。在這個(gè)文件里定義的宏是一些通用設(shè)置,如果所需的VxWorks映像不同于默認(rèn)配置,可以使用config\bspname目錄下的config.h文件中所定義(#define或#undef)的宏來替換configAll.h的默認(rèn)配置。通常,構(gòu)造工程并不直接使用config\all目錄下的文件,只有新建一個(gè)可引導(dǎo)型工程時(shí)才使用它們。用戶創(chuàng)建工程后,config\all目錄下文件的任何修改都不會(huì)影響工程。如果希望改變,則必須在工程區(qū)域直接進(jìn)行修改。更改configAll.h文件將影響通過開發(fā)環(huán)境新創(chuàng)建的可引導(dǎo)型映像工程。所以一般情況下,在config.h文件中根據(jù)工程需要定義宏來替換configAll.h的默認(rèn)宏定義,而不是直接修改configAll.h文件。
2)?…\target\config\bspname目錄下的文件這個(gè)子目錄包含系統(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)點(diǎn)。BSPmake系統(tǒng)包含了位于target\h\make目錄下的make子文件。如果某個(gè)相關(guān)性文件不存在,make將自動(dòng)產(chǎn)生depend.bspname文件,它可以用來追蹤所有模塊的相關(guān)性。depend.bspname相關(guān)性文件并不包含在BSP文件中,它是一個(gè)自動(dòng)產(chǎn)生的文件。
(3)?config.h文件。config.h文件包含了所有的頭文件和與CPU板相關(guān)的特殊定義。標(biāo)準(zhǔn)的config.h包含下面的內(nèi)容:①BSP版本號(hào)和修訂版本號(hào)。
#defineBSP_VERSION“1.2”
#defineBSP_REV“/0”/*0為第一次修訂版本*/②包含configAll.h文件。
#define“configAll.h”③高速緩沖存儲(chǔ)器和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*/⑧默認(rèn)引導(dǎo)參數(shù)。
#defineDEFAULT_BOOT_LINE
\“fd=0,0(0,0)host:/fd0/VxWorksh=e=0u=target”⑨時(shí)間戳(timestamp)驅(qū)動(dòng)程序支持。
#defineINCLUDE_TIMESTAMP/*包含時(shí)間戳定時(shí)器,提供給WindView工具*/外部總線地址映射。網(wǎng)絡(luò)設(shè)備和中斷向量。
#defineINCLUDE_END/*使用增強(qiáng)型網(wǎng)絡(luò)驅(qū)動(dòng)*/
#defineINCLUDE_FET/*包含IntelEtherExpressPR0100BPCI*/
#defineNUMBER_OF_IRQS24
#defineINT_NUM_IRQ00xe0/*IRQ0的向量號(hào)*/包含bspname.h文件。
#include“pc.h”注意,config.h文件應(yīng)包含configAll.h和bspname.h文件。
(4)?romInit.s文件。該文件包含引導(dǎo)ROM和基于ROM的VxWorks映像的入口初始化匯編代碼。romInit.s文件的入口點(diǎn)為romInit()函數(shù),是系統(tǒng)加電啟動(dòng)后首先執(zhí)行的代碼。同時(shí)它也設(shè)置了啟動(dòng)類型參數(shù)BOOT_COLD,并把該參數(shù)傳遞給通用的romStart()函數(shù)。如果硬件需要立即進(jìn)行內(nèi)存映射或設(shè)置特殊的寄存器,則在這里處理。大部分硬件初始化操作在sysLib.c文件中的sysHwinit()函數(shù)里進(jìn)行。在romInit()函數(shù)中,有三個(gè)必須執(zhí)行的主要功能:①屏蔽中斷,初始化CPU。②初始化內(nèi)存系統(tǒng),通常包括關(guān)閉高速緩存和初始化內(nèi)存控制器。對(duì)于SPARC體系結(jié)構(gòu)的目標(biāo)機(jī),必須打開MMU。③初始化堆棧指針和其他寄存器以便能夠執(zhí)行C代碼,然后調(diào)用romStart()函數(shù)。值得注意的是,romInit()函數(shù)必須設(shè)計(jì)成與地址無關(guān)的代碼(Position-IndependentCode,PIC)。它需要支持綜合的VxWorks引導(dǎo)策略。如果必須使用絕對(duì)地址,通常會(huì)通過ROM_ADRS(x)宏對(duì)地址重新計(jì)算。該宏定義如下:
#defineROM_ADRS(x)((x)-_romInit+ROM_TEXT_ADRS)一個(gè)普遍的錯(cuò)誤是BSP開發(fā)人員試圖在romInit.s里進(jìn)行過多的初始化操作。實(shí)際上大部分其他初始化功能應(yīng)推遲到sysHwinit()函數(shù)中進(jìn)行。另外,romInit.s中的代碼不應(yīng)當(dāng)被其他模塊或函數(shù)調(diào)用。另一個(gè)普遍的錯(cuò)誤是BSP開發(fā)人員認(rèn)為在romInit.s里初始化過的設(shè)備不需要在sysALib.s或sysLib.c中重新初始化。實(shí)際上VxWorks映像并不認(rèn)為它是由引導(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。這個(gè)文件包含目標(biāo)機(jī)體系結(jié)構(gòu)決定的、與系統(tǒng)有關(guān)的匯編程序。所有BSP程序應(yīng)當(dāng)用C語言編寫,然而如果由于編譯等原因需要用匯編語言編寫程序,那么可以把所編寫的匯編程序放到sysALib.s文件里。
sysALib.s文件里的sysInit()函數(shù)是VxWorks映像的入口點(diǎn),系統(tǒng)引導(dǎo)后,首先執(zhí)行該段代碼。sysALib.s所執(zhí)行的所有功能類似于romInit.s的工作,但它不執(zhí)行系統(tǒng)內(nèi)存初始化操作。系統(tǒng)應(yīng)當(dāng)在程序啟動(dòng)階段初始化內(nèi)存系統(tǒng)。與romInit.s不同的是,不需要把sysALib.s中的代碼編寫成與PIC無關(guān)的代碼或使用ROM_ADRS宏重新映射絕對(duì)地址。它可以調(diào)用其他模塊和程序。
(6)?sysLib.c。這個(gè)文件包含目標(biāo)機(jī)體系結(jié)構(gòu)決定的、與系統(tǒng)有關(guān)的C程序。這些程序提供板級(jí)接口,基于這些板級(jí)接口,VxWorks和應(yīng)用程序的構(gòu)造與系統(tǒng)無關(guān)。sysLib.c文件可以包含src/drv目錄下的驅(qū)動(dòng)程序。驅(qū)動(dòng)程序的安裝和初始化通常在子文件中完成,在sysLib.c中包含了這些操作。這些子文件通常的命名是sysSerial.c、sysScsi.c、sysNet.c等。使用子文件的目的是為了保持設(shè)備驅(qū)動(dòng)程序的安裝和初始化不隨結(jié)構(gòu)的變化而改變。一塊目標(biāo)板上的設(shè)備安裝子文件應(yīng)該能被另一塊板上同樣的設(shè)備所使用。
(7)?sysSerial.c。這是一個(gè)可選文件,包含所有SIO設(shè)備串行I/O驅(qū)動(dòng)程序的安裝和初始化。系統(tǒng)沒有單獨(dú)編譯它,而是將其包含在sysLib.c文件中。如果把串行設(shè)備初始化從sysLib.c中獨(dú)立出來形成一個(gè)模塊,則允許在BSP之間重復(fù)使用這個(gè)代碼。
(8)?sysScsi.c。這是一個(gè)可選文件,包含SCSI-2設(shè)備驅(qū)動(dòng)程序的安裝和初始化。它像sysSerial.c文件一樣包含在sysLib.c文件中。
(9)?sysNet.c。這是一個(gè)可選文件,包含網(wǎng)絡(luò)接口驅(qū)動(dòng)程序的安裝和初始化。
(10)?bspname.h。這個(gè)文件包含與目標(biāo)板有關(guān)的特殊信息定義,例如串行接口、時(shí)鐘、I/O設(shè)備。許多相關(guān)信息包含在target/h/drv目錄下,這些VxWorks所要使用的目標(biāo)板(包含設(shè)備的驅(qū)動(dòng)程序頭文件)應(yīng)當(dāng)包含在bspname.h文件的開始。這個(gè)文件預(yù)定的常量信息不應(yīng)該影響用戶的配置。如果定義在bspname.h文件里的任何宏或值可以改變系統(tǒng)的定制,那么應(yīng)該由定義在config.h文件中的同樣的宏或值所替代。使用一個(gè)樣本頭文件是非常有用的,因?yàn)榇蠖鄶?shù)已經(jīng)被定義的常量名、基本設(shè)備地址等已經(jīng)定義,只需要根據(jù)實(shí)際情況修改。bspname.h文件中應(yīng)定義下面的信息:①中斷向量、中斷級(jí)別。②I/O設(shè)備地址。③設(shè)備寄存器位的含義。④系統(tǒng)時(shí)鐘和輔助時(shí)鐘參數(shù)(最大和最小速率)。同樣,可使用一個(gè)目標(biāo)板描述來說明目標(biāo)板所需要的特殊宏定義(例如以“PCI_”為開頭定義相應(yīng)的設(shè)備)。
3)?…\target\config\camps\vxWorks目錄下的文件這個(gè)目錄下的文件是VxWorks實(shí)時(shí)內(nèi)核基本模塊描述文件(CDF文件)。有關(guān)詳細(xì)信息參考有關(guān)模塊描述語言(ComponentDescriptionLanguage,CDL)的相關(guān)書籍。
4)?…\target\canfig\camps\src目錄下的文件這個(gè)目錄下的文件是VxWorks實(shí)時(shí)內(nèi)核模塊配置文件,這些文件提供的代碼被usrConfig.c文件所使用。
4.派生文件所謂派生文件,是指從源文件、系統(tǒng)頭文件、驅(qū)動(dòng)程序源文件和VxWorks文檔庫中的模塊衍生而來的文件。這些文件僅僅是為示范目的而衍生出來的文件,當(dāng)配置一個(gè)系統(tǒng)時(shí),可以重新創(chuàng)建這些文件中的部分文件或所有文件。通過Tornado2.0開發(fā)環(huán)境創(chuàng)建工程時(shí),這些派生文件被放置在工程目錄下。只有通過命令行方式構(gòu)造工程時(shí),系統(tǒng)才會(huì)使用在BSP目錄下的派生文件副本。下面是一些派生文件。
(1)?bootInit.o、bootInit_res.o、bootInit_uncmp.o。ROM型映像有三個(gè)引導(dǎo)策略,分別是:壓縮的ROM型、非壓縮的ROM型、ROM駐留型。這三個(gè)引導(dǎo)策略可以被引導(dǎo)ROM映像或ROM型VxWorks映像所使用。模塊的名字指出了所使用的引導(dǎo)策略。
(2)?bootrom,是一個(gè)包含二進(jìn)制的VxWorks引導(dǎo)ROM的對(duì)象文件。
(3)?bootrom.hex,是一個(gè)包含VxWorks引導(dǎo)ROM代碼的ASCII文件,適合于通過串行連接PROM編程器來進(jìn)行下載。默認(rèn)的編碼使用MotorolaS記錄文件格式。
(4)?bootrom.Z.s和bootrom.Z.o.,是壓縮型bootrom.o映像模塊的源程序和對(duì)象文件。
(5)?ctdt.o,是管理C++構(gòu)造/析構(gòu)函數(shù)的模塊。
(6)?dataSegPad.o,是保證代碼段和數(shù)據(jù)段不會(huì)共享同一個(gè)內(nèi)存頁的模塊。使用VxVMI模塊時(shí),這個(gè)模塊強(qiáng)制數(shù)據(jù)段和代碼段處于不同的MMU頁中。
(7)?symTbl.c和sysALib.o,是內(nèi)置符號(hào)表的源程序和對(duì)象文件。
(8)?sysLib.o和sysALib.o,這兩個(gè)模塊總是一起成對(duì)出現(xiàn)。它們是sysLib.c和sysALib.s文件的輸出模塊。
(9)?romInit.o,這個(gè)模塊是引導(dǎo)映像或VxWorks映像的啟動(dòng)代碼。對(duì)于Tornado2.0而言,它聯(lián)合romStart.o模塊一起工作,替代了bootInit.o。
(10)?VxWorks和vxWorks.sym,VxWorks文件是鏈接好的、完整的VxWorks二進(jìn)制文件,可以在目標(biāo)機(jī)上運(yùn)行。vxWorks.sym是VxWorks二進(jìn)制文件的符號(hào)表文件。系統(tǒng)通過配置文件創(chuàng)建這兩個(gè)文件。
(11)?vxWorks.st,是一個(gè)鏈接好的、完整的、內(nèi)置符號(hào)表的VxWorks二進(jìn)制文件。
(12)?target/proj/bspname_vx/*.*,這個(gè)目錄包含BSP工程文件和默認(rèn)構(gòu)造輸出。有兩種方式創(chuàng)建一個(gè)新的工程:一種是使用工程工具;另一種是通過命令行的方式執(zhí)行make來實(shí)現(xiàn)。
(13)?doc/vxworks/bsp/bspname/*.*,這個(gè)目錄包含了用戶幫助系統(tǒng)的HTML文檔文件。在命令行方式下執(zhí)行makeman命令可以產(chǎn)生這些文檔。
5.?BSP里的函數(shù)
BSP里包括下面幾類函數(shù)。
1)初始化函數(shù)通過初始化函數(shù)進(jìn)行三類操作:
(1)初始化硬件到已知狀態(tài)。
(2)標(biāo)識(shí)系統(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ù)主要實(shí)現(xiàn)下述功能:
(1)打開/關(guān)閉總線中斷。
(2)產(chǎn)生總線中斷。
4)時(shí)鐘/定時(shí)器函數(shù)時(shí)鐘/定時(shí)器函數(shù)主要對(duì)時(shí)鐘/定時(shí)器進(jìn)行兩步操作:
(1)打開/關(guān)閉定時(shí)中斷。
(2)設(shè)置定時(shí)器的周期性。
5)郵箱/位置監(jiān)視函數(shù)(可選)該函數(shù)用于打開郵箱/位置監(jiān)視中斷。8.1.4BSP開發(fā)工具嵌入式系統(tǒng)開發(fā)的目標(biāo)之一就是使硬件運(yùn)行得更快,因此必須開發(fā)BSP程序。隨著嵌入式系統(tǒng)應(yīng)用領(lǐng)域的擴(kuò)大,WindRiver公司不可能向用戶提供所有的功能實(shí)現(xiàn)方法,所以開發(fā)者需要一種幫助自己快速、簡(jiǎn)便地開發(fā)BSP的工具。板級(jí)支持包開發(fā)工具BSPDeveloper'sKit可以幫助開發(fā)者進(jìn)行設(shè)計(jì)、歸檔和測(cè)試新設(shè)備的驅(qū)動(dòng)程序和BSP的工作。下面我們將具體闡述板級(jí)支持包開發(fā)工具BSPDeveloper’sKit。板級(jí)支持包開發(fā)工具基本包(BSPDeveloper’sKitBaseOption)主要面向的是嵌入式系統(tǒng)開發(fā)者,其主要組成部分包括:
(1)板級(jí)支持包測(cè)試工具(BSPvalidationtestsuite):以源代碼形式提供給開發(fā)者,用來檢查BSP和驅(qū)動(dòng)程序的基本功能以及報(bào)告存在的問題。
(2)板級(jí)支持包開發(fā)模板(TemplateBSP)。
(3)驅(qū)動(dòng)程序開發(fā)模板(TemplateDriver)。
(4)?SCSI測(cè)試工具(SCSITestSuite):主要提供一些SCSI的測(cè)試程序。
(5)板級(jí)支持包開發(fā)工具文檔(DocumentationSet):主要闡述如何設(shè)計(jì)設(shè)備驅(qū)動(dòng)程序、如何實(shí)現(xiàn)目標(biāo)機(jī)上的VxWorks的最小配置等。板級(jí)支持包開發(fā)工具高級(jí)包(BSPDeveloper’sKitValueOption)向開發(fā)者提供了WindRiver公司的一般驅(qū)動(dòng)程序源代碼作為開發(fā)驅(qū)動(dòng)程序和BSP的基礎(chǔ),其中包括了幾乎所有現(xiàn)成的標(biāo)準(zhǔn)驅(qū)功程序,例如:Ethernet、SCSI等驅(qū)動(dòng)程序源代碼。其主要組成部分包括:
(1)板級(jí)支持包開發(fā)工具基本包。
(2)?Ethernet驅(qū)動(dòng)程序源代碼。
(3)?SCSI驅(qū)動(dòng)程序源代碼。8.2BSP的基本配置和VxWorks的初始化8.2.1BSP的基本配置用戶在開發(fā)目標(biāo)機(jī)的BSP之前,必須了解在VxWorks操作系統(tǒng)下BSP的配置,只有在熟悉BSP的配置后才可以正確地對(duì)BSP進(jìn)行移植和修改工作,并根據(jù)自己的需求成功配置BSP。下面我們主要對(duì)目標(biāo)機(jī)硬件環(huán)境及硬件相關(guān)的參數(shù)進(jìn)行配置。
1.ROM和RAM的布局用戶可以根據(jù)目標(biāo)機(jī)的具體情況對(duì)ROM和RAM的空間布局進(jìn)行配置,配置過程主要是通過修改地址宏定義的值而達(dá)到目的,在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)/*啟動(dòng)點(diǎn)*/#defineROM_SIZE0x00090000/*ROM空間大小*/#else#defineROM_BASE_ADRS0xfff20000/*ROM基地址*/#defineROM_TEXT_ADRS(ROM_BASE_ADRS)/*EPROM啟動(dòng)點(diǎn)*/#defineROM_SIZE0x0007fe00/*ROM空間大小*/#endif#defineRAM_LOW_ADRS0x00108000/*VxWorks映像入口點(diǎn)*/#defineRAM_HIGH_ADRS0x00008000/*引導(dǎo)映像入口點(diǎn)*/
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)機(jī)本地RAM起始地址*/
#defineLOCAL_MEM_BUS_ADRS0x00000000/*總線本地內(nèi)存起始地址*/
#defineLOCAL_MEM_SIZE0x00000000/*本地RAM大小為8MB*/
/*當(dāng)定義這個(gè)選項(xiàng)時(shí),支持自動(dòng)分配內(nèi)存帶大小。在這種情況下系統(tǒng)忽視
LOCAL_MEM_SIZE。相關(guān)信息請(qǐng)參考sysyPhysMemTop()函數(shù)。*/
#defineLOCAL_MEM_AUTOSIZE
3.啟動(dòng)設(shè)備及參數(shù)配置啟動(dòng)設(shè)備及參數(shù)配置主要包含引導(dǎo)參數(shù)的配置,即從哪里下載VxWorks映像、系統(tǒng)熱啟動(dòng)后從什么設(shè)備上啟動(dòng)系統(tǒng)以及與設(shè)備相關(guān)的其他參數(shù)配置等,具體配置如下。
1)默認(rèn)引導(dǎo)參數(shù)設(shè)置下面以目標(biāo)機(jī)通過IntelEtherExpressPRO100BPCI接口的網(wǎng)卡,從宿主機(jī)“rainbow”上下載VxWorks映像為例進(jìn)行默認(rèn)引導(dǎo)參數(shù)配置說明。有關(guān)該參數(shù)的詳細(xì)說明請(qǐng)參考相關(guān)書籍。
#defineDEFAULT_BOOT_LINE“fei(0,0)rainbow:VxWorksh=19e=20u=userpw=usertn=user”
2)熱啟動(dòng)設(shè)備和參數(shù)設(shè)置
/*熱啟動(dòng)(重新啟動(dòng))設(shè)備和參數(shù)*/
#defineSYS_WARM_BIOS0/*從BIOS熱啟動(dòng)*/
#defineSYS_WARM_FD1/*從軟盤熱啟動(dòng)*/
#defineSYS_WARM_ATA2/*從ATA硬盤熱啟動(dòng)*/
#defineSYS_WARM_TFFS3/*從片上系統(tǒng)(Diskonchip)熱啟動(dòng)*/
#defineSYS_WARM_TYPESYS_WARM_FD/*熱啟動(dòng)設(shè)備*/
#defineSYS_WARM_FD_DRIVE0/*0=驅(qū)動(dòng)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ū)動(dòng)程序及相關(guān)參數(shù)設(shè)置外圍設(shè)備驅(qū)動(dòng)程序配置和相關(guān)參數(shù)配置描述了在配置文件中如何配置外圍設(shè)備,包括軟盤驅(qū)動(dòng)器、硬盤、并行端口、時(shí)鐘、協(xié)處理器等驅(qū)動(dòng)程序的配置。其中還包含了一些相關(guān)參數(shù)的配置,例如設(shè)備寄存器基地址、終端級(jí)等。具體一些配置如下。
1)配置TrueFFS驅(qū)動(dòng)程序
#undefINCLUDE_TFFS/*包含TrueFFS驅(qū)動(dòng)程序*/
2)配置軟盤驅(qū)動(dòng)程序
#defineINCLUDE_FD/*包含軟盤驅(qū)動(dòng)程序*/
/*軟盤驅(qū)動(dòng)器(FD)相關(guān)參數(shù)宏定義,見文件pc.h*/
#defineFD_INT_LVL0x06 /*中斷號(hào)*/
#defineFD_DMA_BUF_ADDR0x2000/*軟驅(qū)DMA緩沖區(qū)地址*/
#defineFD_DMA_BUF_SIZE0x3000/*軟驅(qū)DMA緩沖區(qū)大小*/
3)并行端口驅(qū)動(dòng)程序配置
#defineINCLUDE_LPT /*包含并行端口驅(qū)動(dòng)程序*/
4)時(shí)鐘配置
/*SYS_CLK_RATE_MAX依賴于CPU的功率,應(yīng)用程序可以對(duì)它進(jìn)行控制*/
(1)配置輔助時(shí)鐘。
#defineINCLUDE_AUX_CLK #defineAUX_CLK_RATE_MIN2 /*輔助時(shí)鐘最小tick數(shù)*/ #defineAUX_CLK_RATE_MAX8192 /*輔助時(shí)鐘最大tick數(shù)*/
(2)配置系統(tǒng)時(shí)鐘。
#defineINCLUDE_SYSCLK_INIT #defineSYS_CLK_RATE_MIN19 /*系統(tǒng)時(shí)鐘最小tick數(shù)*/ #defineSYS_CLK_RATE_MIN(PIT_CLOCK/256)/*系統(tǒng)時(shí)鐘最大tick數(shù)*/ #defineSYS_CLK_RATE60 /*系統(tǒng)時(shí)鐘tick數(shù)*/
(3)配置時(shí)間戳。
#undefINCLUDE_TIMESTAMP/*包含時(shí)間戳定時(shí)器驅(qū)動(dòng)程序,以便提供給WindView*/
(4)時(shí)鐘相關(guān)地址定義。
/*定時(shí)器(PIT)*/
#definePIT_BASE_ADR0x40 /*定時(shí)器寄存器基地址*/
#definePIT0_INT_LVL0x00 /*中斷級(jí)*/
#definePIT_REG_ADDR_INTERVAL1
#definePIT_CLOCK1193180 /*定時(shí)器頻率*/
/*實(shí)時(shí)時(shí)鐘(RTC)*/
#defineRTC_INDEX0x70 /*實(shí)時(shí)時(shí)鐘控制寄存器地址*/
#defineRTC_DATA0x71 /*實(shí)時(shí)時(shí)鐘數(shù)據(jù)寄存器地址*
#defineRTC_INT_LVL0x08 /*中斷級(jí)*/
5)硬盤設(shè)置通過下面的宏定義可以配置系統(tǒng)支持ATA/IDE接口的硬盤。
#defineINCLUDE_ATA /*包括IDE/EIDE(ATA)接口硬盤驅(qū)動(dòng)程序*/
5.文件系統(tǒng)配置
VxWorks系統(tǒng)中的文件系統(tǒng)是作為設(shè)備的驅(qū)動(dòng)程序安裝在系統(tǒng)中的,它使用與設(shè)備驅(qū)動(dòng)程序相同的標(biāo)準(zhǔn)I/O,但是它又是一個(gè)獨(dú)立的系統(tǒng)。這樣的設(shè)計(jì)使得一個(gè)VxWorks應(yīng)用可以使用多種文件系統(tǒng)而不發(fā)生沖突。同時(shí)根據(jù)這些標(biāo)準(zhǔn)接口協(xié)議,用戶還可以根據(jù)自己的需要編寫文件系統(tǒng),并將文件系統(tǒng)與相關(guān)的驅(qū)動(dòng)程序相結(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ū)動(dòng)程序配置在VxWorks網(wǎng)絡(luò)系統(tǒng)運(yùn)轉(zhuǎn)中,以太網(wǎng)是其中的一個(gè)介質(zhì),也是眾多廠商所支持的一個(gè)局域網(wǎng)規(guī)范。它是大多數(shù)VxWorks網(wǎng)絡(luò)應(yīng)用中的理想選擇,但是某些協(xié)議除外,比如BOOTP和DHCP,在VxWorks或主機(jī)網(wǎng)絡(luò)系統(tǒng)中它們固有地約束了以太網(wǎng)。至于以太網(wǎng)驅(qū)動(dòng)程序的配置,WindRiver提供了一些廠商的以太網(wǎng)驅(qū)動(dòng)程序,其中包括3COM、AMD、Intel等公司的網(wǎng)卡設(shè)備驅(qū)動(dòng)程序,通常以庫文件或源代碼的形式安裝在Tornado目錄下,用戶通過配置后可以把它們包含到系統(tǒng)中去。
7.高速緩存配置如果硬件配置支持且系統(tǒng)又需要使用高速緩存,則需要對(duì)高速緩存進(jìn)行配置。配置過程及相關(guān)要求、注意事項(xiàng)等說明如下:所有的高速緩存首先是關(guān)閉的,在BSP的基本功能完成以后,才激活高速緩存。高速緩存打開的步驟是首先打開指令高速緩存,接下來打開數(shù)據(jù)高速緩存。高速緩存最先處于非探聽狀態(tài)工作下,打開它們以后,如果目標(biāo)板支持才可以探聽。注意:當(dāng)MMU打開時(shí),通過sysPhysMemDesc[]中的MMU表入口控制高速緩存,而不是通過高速緩存模式宏定義來控制。
8.堆棧配置在BSP的配置過程中,堆棧的配置也是應(yīng)關(guān)心的問題。因?yàn)橄到y(tǒng)需要使用堆棧,而用戶有時(shí)也需要保留一些堆棧來存放一些重要信息等,所以要對(duì)VxWorks系統(tǒng)如何布局堆棧有所了解。8.2.2VxWorks的初始化對(duì)于一個(gè)確定目標(biāo)系統(tǒng)的VxWorks,它的初始化按一定的時(shí)間順序進(jìn)行,但對(duì)于不同版本的VxWorks其初始化序列也稍微不同。本節(jié)描述了一個(gè)典型的應(yīng)用配置中VxWorks的初始化序列,這些初始化步驟以VxWorks運(yùn)行為序。為了清晰起見,這個(gè)序列分為多個(gè)主要階段或過程調(diào)用,關(guān)鍵過程以標(biāo)題列出,并且以排列順序進(jìn)行描述。
1.VxWorks入口sysInit()
VxWorks系統(tǒng)開始運(yùn)行的第一步是將VxWorks加載到主內(nèi)存。在VxWorksROM的控制下,通常從開發(fā)宿主機(jī)下載。下一步,引導(dǎo)ROM將控制權(quán)轉(zhuǎn)到VxWorks的啟動(dòng)入口sysInit()。這個(gè)入口由在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)閉所有中斷,禁止高速緩沖存儲(chǔ)器,并且將處理器寄存器(包括C堆棧指針)初始化為默認(rèn)值。同時(shí)它也禁止跟蹤,清除所有掛起的硬件中斷,轉(zhuǎn)而調(diào)用usrInit(),該子程序是一段C程序,包含在文件usrConfig.c中。對(duì)于某些目標(biāo)機(jī),sysInit()也完成一些小部分與系統(tǒng)相關(guān)的硬件初始化,以便能夠執(zhí)行sysInit()其余的初始化。它使用的初始堆棧指針占用的空間是在VxWorks系統(tǒng)映像的下部,但在中斷向量區(qū)的上面。
2.初始程序usrInit()在文件usrConfig.c的程序usrInit()中保存引導(dǎo)類型信息,在多任務(wù)內(nèi)核啟動(dòng)前必須完成所有初始化,然后啟動(dòng)內(nèi)核執(zhí)行。它是VxWorks運(yùn)行的第一個(gè)C代碼,并且是在禁止所有硬件中斷下調(diào)用的。許多VxWorks服務(wù)不能由usrInit()程序調(diào)用,因?yàn)樗鼪]有任務(wù)上下文(沒有TCB和任務(wù)堆棧),這包括能引起可搶占調(diào)度的服務(wù),如信號(hào)量,或使用該服務(wù)的服務(wù),如printf()。相反地,usrInit()需要建立一個(gè)初始任務(wù)usrRoot(),并啟動(dòng)該任務(wù)。
usrInit()中的初始化包括下述內(nèi)容:高速緩沖存儲(chǔ)器初始化,usrInit()的開始初始化高速緩沖存儲(chǔ)器,設(shè)置高速緩沖存儲(chǔ)器的模式并且置為安全狀態(tài)。在usrRoot()的最后,允許使用指令與數(shù)據(jù)高速緩沖。系統(tǒng)BSS段初始化為0,C和C++語言指定所有未初始化的變量值為0。這些未初始化的變量被放在稱為BSS的段中。該段在引導(dǎo)時(shí)實(shí)際上是不加載的,usrInit()執(zhí)行后第一個(gè)任務(wù)是將含有BSS的內(nèi)存清為0。在ROM引導(dǎo)VxWorks時(shí)清除所有內(nèi)存。中斷向量初始化,在允許中斷和執(zhí)行內(nèi)核前必須建立異常中斷向量。首先,程序intVecBaseSet()被調(diào)用來建立向量表基地址;接著,excVecInit()初始化所有異常向量為默認(rèn)中斷處理,以便能安全捕獲和處理當(dāng)程序出錯(cuò)或硬件中斷引起的異常情況。將系統(tǒng)硬件初始化為靜止?fàn)顟B(tài),系統(tǒng)硬件初始化由調(diào)用子程序sysHwinit()完成,這主要包含復(fù)位和禁止硬件設(shè)備,在內(nèi)核啟動(dòng)后允許產(chǎn)生中斷。這很重要,直到usrRoot()任務(wù)完成系統(tǒng)初始化,VxWorksISRs的中斷服務(wù)程序還沒有連接到中斷向量。但是,不要試圖在sysHwint()過程中連接中斷向量,因?yàn)榇藭r(shí)存儲(chǔ)池仍未初始化。
3.初始化內(nèi)核
usrInit()程序以調(diào)用兩個(gè)內(nèi)核初始化函數(shù)宣告結(jié)束,這兩個(gè)函數(shù)為:
usrKernelInit()程序(在文件usrKernel.c中),用于調(diào)用適當(dāng)?shù)某跏蓟映绦颉?/p>
kernelInit()程序,用于初始化多任務(wù)環(huán)境中,并且永遠(yuǎn)不返回,它需要以下參數(shù):被生成的作為根任務(wù)的應(yīng)用程序,典型的為usrRoot()。
(1)堆棧的大小。
(2)開始使用的內(nèi)存地址。也就是說,在VxWorks映像的主程序區(qū)、數(shù)據(jù)、BSS之后。在該區(qū)域之后的所有內(nèi)存都加到系統(tǒng)存儲(chǔ)池,由memPartLib管理。用于分配下載的動(dòng)態(tài)模塊、任務(wù)控制塊等,都出自該區(qū)域。
(3)由sysMemTop()指出的內(nèi)存高端地址。
(4)中斷堆棧大小。
(5)中斷級(jí)。
kernelInit()調(diào)用intLockLevelSet(),禁止輪詢模式,建立中斷堆棧;然后在存儲(chǔ)池的高端創(chuàng)建根任務(wù)的堆棧和TCB,啟動(dòng)根任務(wù)usrRoot();usrInit()運(yùn)行結(jié)束后,允許中斷;禁止所有中斷源和清除掛起的中斷,這一點(diǎn)非常關(guān)鍵。初始化存儲(chǔ)池,VxWorks包括一個(gè)在memPartLib模塊中的內(nèi)存分配工具,用于管理可用的存儲(chǔ)器池。malloc()函數(shù)允許從存儲(chǔ)池中申請(qǐng)獲得可變大小的內(nèi)存塊。在內(nèi)部,VxWorks使用malloc()動(dòng)態(tài)分配內(nèi)存,尤其許多VxWorks服務(wù)在初始化時(shí)使用它分配數(shù)據(jù)結(jié)構(gòu)。因此,存儲(chǔ)池初始化必須在其他任何VxWorks服務(wù)的初始化之前進(jìn)行。注意,Tomado目標(biāo)服務(wù)器使用和管理一部分存儲(chǔ)器,用來支持目標(biāo)模塊下載和開發(fā)其他功能。
VxWorks大量使用malloc(),包括下載模塊分配的空間,任務(wù)啟動(dòng)堆棧的分配,初始化分配的數(shù)據(jù)結(jié)構(gòu)。同時(shí)使用malloc()來分配任何應(yīng)用系統(tǒng)所需的內(nèi)存。除非必須為特殊用途保留一些絕對(duì)的存儲(chǔ)器區(qū)域外,建議將所有未使用的內(nèi)存部分配到VxWorks的存儲(chǔ)池。存儲(chǔ)池在程序kernelInit()中進(jìn)行初始化。kernelInit()的參數(shù)指明了初始化存儲(chǔ)池的開始和結(jié)束地址。VxWorks采用usrInit()的默認(rèn)分配,存儲(chǔ)池開始地址被設(shè)置為引導(dǎo)系統(tǒng)結(jié)束之后的部分,并且包含了所有剩余可用的存儲(chǔ)器。可用存儲(chǔ)器的范圍由程序sysMemTop()決定,這是一個(gè)系統(tǒng)相關(guān)的程序,它定義可用存儲(chǔ)器的大小。如果系統(tǒng)還有其他不連續(xù)的存儲(chǔ)區(qū)域,一般地,可以在usrRoot()任務(wù)之后調(diào)用memAddToPool()并將它們加到系統(tǒng)存儲(chǔ)池,以便使用。
4.初始化任務(wù)usrRoot()當(dāng)多任務(wù)內(nèi)核開始執(zhí)行時(shí),所有VxWorks多任務(wù)服務(wù)是可用的。在控制權(quán)轉(zhuǎn)到任務(wù)usrRoot()后,完成系統(tǒng)的初始化。主要初始化有:
(1)系統(tǒng)時(shí)鐘的初始化。
(2)?I/O系統(tǒng)和設(shè)備驅(qū)動(dòng)的初始化。①控制臺(tái)設(shè)備的創(chuàng)建。②標(biāo)準(zhǔn)輸入/輸出的設(shè)置。③異常出路與登錄的安裝。④管道設(shè)備驅(qū)動(dòng)的初始化。⑤標(biāo)準(zhǔn)I/O的初始化。⑥文件系統(tǒng)設(shè)備和磁盤驅(qū)動(dòng)安裝的創(chuàng)建。⑦浮點(diǎn)運(yùn)算支持的初始化。⑧性能監(jiān)視服務(wù)的初始化。
(3)可選服務(wù)的初始化。①WindView的初始化。②目標(biāo)調(diào)試機(jī)構(gòu)的初始化。③用戶提供的啟動(dòng)腳本的初始化。參見文件config/all/usrConfig.c,并回顧usrRoot()完成的初始化序列,可以根據(jù)自己的目標(biāo)系統(tǒng)修改這些初始化。關(guān)于初始化的每一步含義和各種參數(shù)的意義將在以下的部分詳細(xì)介紹。
(4)系統(tǒng)時(shí)鐘的初始化。在任務(wù)usrRoot()中的第一個(gè)動(dòng)作是初始化VxWorks時(shí)鐘,通過調(diào)用sysClkConnect()將系統(tǒng)時(shí)鐘中斷向量與中斷處理程序usrClock()建立連接。而后,系統(tǒng)時(shí)鐘的頻率(通常為60Hz)由sysClkRateSet()設(shè)置。大多數(shù)的目標(biāo)板允許時(shí)鐘頻率小于30Hz(有些甚至小于1Hz)或大于幾千赫茲。但通常不希望使用高于1000Hz的時(shí)鐘頻率,因?yàn)檫@樣會(huì)加重系統(tǒng)的額外開銷。當(dāng)時(shí)鐘頻率太快時(shí),處理器要花費(fèi)很多時(shí)間來處理中斷,且應(yīng)用程序因搶不到CPU而得不到運(yùn)行。定時(shí)器驅(qū)動(dòng)程序由WRS公司提供,包括一個(gè)sysHwInit2()調(diào)用,它是sysClkConnect()的一部分。BSP使用sysHwInit2()完成對(duì)目標(biāo)板的進(jìn)一步初始化,而這些初始化在函數(shù)sysHwinit()中沒有完成。
(5)?I/O系統(tǒng)的初始化。如果在configAll.h中定義了INCLUDE_IO_SYSTEM,那么可通過調(diào)用iosIni()程序進(jìn)行VxWorks的I/O系統(tǒng)初始化。調(diào)用參數(shù)指明了安裝設(shè)備驅(qū)動(dòng)的最大數(shù)目,在系統(tǒng)中能夠同時(shí)打開的最大文件數(shù)目,在VxWorks的I/O系統(tǒng)中所希望的設(shè)備名稱。包含與不包含INCLUDE_IO_SYSTEM也會(huì)影響是否創(chuàng)建控制臺(tái)設(shè)備、標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤的建立。
(6)控制臺(tái)設(shè)備的創(chuàng)建。如果在配置中包括了INCLUDE_TTY_DEV板上串口設(shè)備驅(qū)動(dòng),就可以通過函數(shù)ttyDrv()調(diào)用初始化時(shí)安裝在系統(tǒng)中的I/O設(shè)備驅(qū)動(dòng)程序。實(shí)際設(shè)備的建立與命名是通過設(shè)備創(chuàng)建程序來完成的,典型調(diào)用為ttyDevCreate()。這個(gè)程序的調(diào)用參數(shù)包括設(shè)備名,一個(gè)串行I/O通道的描述,輸入/輸出緩沖區(qū)的大小。宏NUM_TTY指定了TTY端口的數(shù)目(默認(rèn)是2),CONSOLE_TTY指定了控制臺(tái)的端口(默認(rèn)為0),CONSOLE_BAUD_RATE指定了波特率(默認(rèn)為9600)。這些宏在文件configAll.h中定義,但是對(duì)于非標(biāo)準(zhǔn)端口的目標(biāo)板可以在config.h文件中重寫。
(7)標(biāo)準(zhǔn)輸入、輸出、錯(cuò)誤的設(shè)置。這些功能的分配是由操作控制臺(tái)和調(diào)用ioGlobalStdSet()來建立的。這是VxWorks作為默認(rèn)設(shè)備用來與應(yīng)用開發(fā)系統(tǒng)進(jìn)行通信,并將控制臺(tái)作為一個(gè)交互式中斷,通過設(shè)置選項(xiàng)OPT_TERMINAL和調(diào)用ioctl()進(jìn)行設(shè)置。
(8)異常處理與登錄安裝。
VxWorks的異常處理服務(wù)(由模塊excLib提供)和登錄服務(wù)(由logLib提供)的初始化早在根任務(wù)執(zhí)行前已進(jìn)行。它們檢查根任務(wù)本身或者各種服務(wù)在初始化過程中的程序錯(cuò)誤。當(dāng)INCLUDE_EXC_HANDLING和INCLUDE_EXC_TAS在配置文件中定義后,異常處理通過調(diào)用excInit()進(jìn)行初始化。excInit()函數(shù)啟動(dòng)異常支持任務(wù)exctask()。初始化之后,由硬件異常造成的程序錯(cuò)誤能被安全地捕獲和報(bào)告,此外沒有被初始化的硬件中斷向量也能進(jìn)行處理。VxWorks通過發(fā)信號(hào)量來使用指定的一場(chǎng)處理任務(wù),該信號(hào)量由sigInit()完成初始化,當(dāng)然必須定義INCLUDE_SIGNALS選項(xiàng)。當(dāng)INCLUDE_LOGGING被定義后,登錄服務(wù)調(diào)用logInit()進(jìn)行初始化。參數(shù)指定了登錄信息寫入的設(shè)備文件描述符及非匹配登錄信息緩沖區(qū)的個(gè)數(shù)。登錄初始化過程也包括啟動(dòng)一個(gè)登錄任務(wù)logTask()。
(9)管道設(shè)備驅(qū)動(dòng)的初始化。如果希望有一個(gè)命名的管道,那么可在文件configAll.h中定義INCLUDE_PIPE選項(xiàng),管道驅(qū)動(dòng)程序pipeDrv()自動(dòng)被調(diào)用,進(jìn)而進(jìn)行初始化管道服務(wù)。管道必須用pipeDevCreate()來創(chuàng)建,而后,任務(wù)就能夠使用管道相互通信。
(10)文件系統(tǒng)設(shè)備驅(qū)動(dòng)的創(chuàng)建和設(shè)備驅(qū)動(dòng)器程序的初始化。許多VxWorks配置至少包括一個(gè)磁盤或RAM盤,采用dosFs、rtllFs或rawFs文件系統(tǒng)。首先磁盤驅(qū)動(dòng)程序通過調(diào)用驅(qū)動(dòng)初始化程序進(jìn)行安裝;其次設(shè)備創(chuàng)建程序并定義一個(gè)設(shè)備,這個(gè)調(diào)用返回指向描述該設(shè)備的數(shù)據(jù)結(jié)構(gòu)BLK_DEV。然后,新的設(shè)備能夠通過調(diào)用系統(tǒng)設(shè)備初始化程序(osFsDevInit(),rtllFsDevInit(),rawFsDevInit())進(jìn)行初始化和命名,各種文件格式由INCLUDE_DOSFS、INCLUDE_RTLLFS和INCLUDE_RAWFS定義(在設(shè)備初始化前,文件系統(tǒng)模塊應(yīng)先采用osFsDevInit()、rtllFsDevInit()、rawFsDevInit()進(jìn)行初始化)。文件系統(tǒng)設(shè)備初始化參數(shù)與特殊的文件系統(tǒng)相關(guān),包括設(shè)備名、一個(gè)指向由設(shè)備創(chuàng)建程序建立的數(shù)據(jù)結(jié)構(gòu)BLK_DEV,還有一些特定的文件系統(tǒng)配置參數(shù)。
(11)浮點(diǎn)支持的初始化。在文件configAll.h中定義NCLUDE_FLOATING_POINT后,浮點(diǎn)I/O由調(diào)用floatInit()進(jìn)行初始化,當(dāng)包含INCLUDE_HW_FP時(shí),支持浮點(diǎn)的協(xié)處理器由調(diào)用mathHardInit()進(jìn)行初始化。
(12)網(wǎng)絡(luò)初始化。在使用網(wǎng)絡(luò)之前,必須使用usrNetInit()進(jìn)行初始化。當(dāng)一個(gè)頭文件中包含INCLUDE_NET_INIT時(shí),usrRoot()將調(diào)用該函數(shù)(usrNetInit()的源程序在src/config/usrNetwork.c文件中)并以配置字符行為參數(shù)。配置字符行通常稱為引導(dǎo)行,它在VxWorks的ROM引導(dǎo)系統(tǒng)中指定?;谶@個(gè)字符行,usrNetInit()執(zhí)行以下網(wǎng)絡(luò)初始化:①調(diào)用程序netLibInit()初始化網(wǎng)絡(luò)子系統(tǒng)。②連接和配置適當(dāng)?shù)木W(wǎng)絡(luò)驅(qū)動(dòng)程序。③添加網(wǎng)關(guān)通道。④初始化遠(yuǎn)程文件存取驅(qū)動(dòng)程序netDrv,并添加遠(yuǎn)程文件存取設(shè)備。⑤初始化遠(yuǎn)程登錄工具。⑥可選擇的初始化遠(yuǎn)程調(diào)用服務(wù)(RPC)。⑦可選擇的初始化網(wǎng)絡(luò)文件系統(tǒng)服務(wù)(NFS)。
(13)可選擇產(chǎn)品與其他服務(wù)的初始化。共享存儲(chǔ)器由可選產(chǎn)品VxMP提供,在使用共享存儲(chǔ)器的目標(biāo)之前,必須使用程序usrSmObjInit()(在文件src/config/usrSmObj.c中)對(duì)它們進(jìn)行初始化,如果包括了INCLUDE_SM_OBJ,則由usrRoot()調(diào)用;如果選項(xiàng)INCLUDE_MMU_BASIC已被定義,則初始化程序保護(hù)和向量表保護(hù)。
Tornado移植了GNUC++編譯器,對(duì)于GNU編譯器或可選的CenterLine編譯器,要初始化以支持C++,由INCLUDE_CPLUS或INCLUDE_CPLUS_MIN定義。若要包括一個(gè)或更多類庫,則定義適當(dāng)?shù)倪x項(xiàng)INCLUDE_CPLUS_library。
(14)?WindView的初始化。內(nèi)核分析器由可選的WindView提供,當(dāng)在文件configAll.h中定義INCLUDE_INSTRUMENTATION時(shí),由程序usrRoot()初始化。
(15)目標(biāo)機(jī)調(diào)試機(jī)構(gòu)的初始化。如果定義了INCLUDE_WDB,則文件src/config/usrWdb.c中的wdbConfig()可被調(diào)用。改變程序初始化通信接口,然后運(yùn)行調(diào)試機(jī)構(gòu),以配置調(diào)試機(jī)構(gòu)的信息及其初始化序列。
(16)啟動(dòng)腳本的執(zhí)行。如果將駐留目標(biāo)系統(tǒng)的命令解釋程序配置到VxWorks中,usrRoot()函數(shù)運(yùn)行用戶提供的腳本,定義宏INCLUDE_STSRTUP_SCRIPT和啟動(dòng)腳本的參數(shù),腳本的文件名在引導(dǎo)時(shí)指定,如果沒有參數(shù),則腳本不被執(zhí)行。
5.初始化序列總結(jié)典型配置的VxWorks整個(gè)實(shí)時(shí)系統(tǒng)初始化包括以下幾個(gè)方面:
(1)系統(tǒng)初始化函數(shù)sysInit(),該函數(shù)在文件sysALib.s中,包含:①關(guān)閉所有中斷。②禁止高速緩沖存儲(chǔ)器。③初始化系統(tǒng)的中斷表。④初始化系統(tǒng)默認(rèn)的表。⑤初始化CPU寄存器為已知默認(rèn)值。⑥禁止跟蹤。 ⑦清除所有未處理的中斷。⑧用指定的引導(dǎo)類型調(diào)用usrInit()函數(shù)。
(2)?usrInit(),該函數(shù)在文件usrcongfig.c中,包含:①將bss未初始化的段清0。②將引導(dǎo)類型保存到sysStartType中。③調(diào)用異常向量初始化函數(shù)excVecInit(),初始化所有系統(tǒng)和默認(rèn)的中斷向量。④調(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()初始化并啟動(dòng)內(nèi)核:①調(diào)用intLockLevelSet()。②在存儲(chǔ)池高端創(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ū)動(dòng),根據(jù)配置文件configAll.h和config.h中的配置創(chuàng)建指定的設(shè)備。①調(diào)用函數(shù)sysClkConnect(),建立系統(tǒng)時(shí)鐘中斷處理。②調(diào)用函數(shù)sysClkRateSet(),初始化系統(tǒng)時(shí)鐘頻率。③調(diào)用函數(shù)iosInit(),初始化I/O設(shè)備控制塊。④如果在配置中定義了INCLUDE_TTY_DEV和NUM_TTY,則可調(diào)用函數(shù)ttyDrv()。建立控制臺(tái)標(biāo)準(zhǔn)輸入、標(biāo)誰輸出、標(biāo)準(zhǔn)錯(cuò)誤接口: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()進(jìn)行配置并初始化目標(biāo)機(jī)調(diào)試器。⑩如果配置了駐留目標(biāo)機(jī)的命令解釋,則啟動(dòng)該腳本。
(6)初始化應(yīng)該注意的問題。首先,應(yīng)該避免在romInit.s中進(jìn)行過多的初始化操作。該文件中只是進(jìn)行必要的最小硬件初始化,大部分硬件的初始化都是在sysHwinit()中完成的。另外,romInit.s中的代碼不應(yīng)當(dāng)被其他模塊或函數(shù)調(diào)用。其次,應(yīng)該避免sysAlib.s中的工作太少。BSP開發(fā)人員通常錯(cuò)誤地認(rèn)為在romInit.s里初始化過的設(shè)備不需要在sysAlib.s中重新初始化。實(shí)際上,VxWorks映像并不認(rèn)為它是由引導(dǎo)映像程序引導(dǎo)的,因此,它必須重新設(shè)置和初始化所有它自己需要使用的設(shè)備。sysInit()是該文件中最主要的一個(gè)函數(shù),也是第一個(gè)函數(shù)。該例程中很多工作與romInit()是相同的,目的是保證內(nèi)核映像在運(yùn)行與冷啟動(dòng)時(shí),軟硬件環(huán)境高度一致。8.3BSP的開發(fā)要求及開發(fā)過程8.3.1開發(fā)要求
BSP的開發(fā)包含很多模塊,當(dāng)許多人共同設(shè)計(jì)一個(gè)由許多模塊組成的系統(tǒng)時(shí),不同時(shí)間內(nèi)會(huì)出現(xiàn)不同的版本,不同的人會(huì)有不同的編程風(fēng)格及文檔
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 黏膜白斑的臨床護(hù)理
- 《政府的宗旨和原則》課件
- 《保險(xiǎn)費(fèi)率策略》課件
- 建立高效團(tuán)隊(duì)合作的前臺(tái)策略計(jì)劃
- 《數(shù)字分析》課件
- 班級(jí)心理劇的實(shí)踐與反思計(jì)劃
- 設(shè)計(jì)方案委托合同三篇
- 地震前兆觀測(cè)儀器相關(guān)行業(yè)投資規(guī)劃報(bào)告
- 《液壓與氣動(dòng)》課件 3氣動(dòng)-壓力控制閥
- 高檔零售商場(chǎng)租賃合同三篇
- 新概念英語第二冊(cè)Lesson66(共38張)課件
- 銀行保險(xiǎn)理財(cái)沙龍.ppt課件
- 醫(yī)院患者診療信息安全風(fēng)險(xiǎn)評(píng)估和應(yīng)急工作機(jī)制制定應(yīng)急預(yù)案XX醫(yī)院患者診療信息安全風(fēng)險(xiǎn)應(yīng)急預(yù)案
- 科技論文寫作PPTPPT通用課件
- 漆洪波教授解讀美國婦產(chǎn)科醫(yī)師學(xué)會(huì)“妊娠高血壓疾病指南2013版”
- 《劉姥姥進(jìn)大觀園》課本劇劇本3篇
- 低壓配電室安全操作規(guī)程
- 廣東省醫(yī)療機(jī)構(gòu)應(yīng)用傳統(tǒng)工藝配制中藥制劑首次備案工作指南
- 大學(xué)英語議論文寫作模板
- 安川機(jī)器人遠(yuǎn)程控制總結(jié) 機(jī)器人端
- 良性陣發(fā)性位置性眩暈診療和治療
評(píng)論
0/150
提交評(píng)論