




已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1 三種不同的VxWorks映象比較 VxWorks是一種靈活的、可裁剪的嵌入式實時操作系統(tǒng)。用戶可以根據(jù)需要創(chuàng)建自己的VxWorks映象,由它來引導(dǎo)目標(biāo)系統(tǒng),而后下載并運行應(yīng)用程序。 根據(jù)應(yīng)用場合的不同,VxWorks映象可分為三類:可加載的VxWorks映象、基于ROM的VxWorks映象和駐留ROM的VxWorks映象。 1.1 可加載的VxWorks映象 這是一種運行于RAM的VxWorks映象。它不包含搬移程序,需要借助于一些外部的程序如bootRom才能加載到RAM的低端RAM_LOW_ADRS地址處。這是缺省的開發(fā)映象。 圖1、可加載的VxWorks映象 在開發(fā)的初期階段,用戶可以根據(jù)需要添加或刪除一些VxWorks組件,生成自己的可加載的VxWorks映象,存放在開發(fā)主機的某個目錄下。目標(biāo)板上電后,由燒結(jié)在BOOT中的起始引導(dǎo)程序(BootStrap Programs)將BOOT中的ROM引導(dǎo)程序(ROM Boot Programs)拷貝到RAM的高端地址RAM_HIGH_ADRS處,并跳轉(zhuǎn)至該地址執(zhí)行ROM引導(dǎo)程序,配置好所選的加載方式(缺省為網(wǎng)絡(luò)方式),將指定的主機目錄下的可加載的VxWorks映象下載到目標(biāo)板的RAM地址RAM_LOW_ADRS處,并跳轉(zhuǎn)到此處執(zhí)行。如圖1所示。 這種映象的優(yōu)點是生成的VxWorks映象可以存放在開發(fā)主機PC機上,不用燒到BOOT中,節(jié)省了BOOT容量,也便于隨時修改不同的VxWorks映象,適用于調(diào)試的初期階段。不足之處是需要在主機上維護(hù)一個正確的VxWorks映象,對于調(diào)試硬件無關(guān)的上層應(yīng)用程序顯得不是很方便。 在Tornado工作臺的Build窗口中,選擇Rules屬性頁中的VxWorks即可生成可加載的VxWorks映象。 1.2 基于ROM的VxWorks映象 圖2 基于ROM的VxWorks映象 這是一種運行于RAM中,但起初存放于ROM中的VxWorks映象。即該映象需要和搬移程序一起固化在BOOT中。目標(biāo)板上電后,首先運行BOOT中的引導(dǎo)搬移程序,將整個VxWorks映象拷貝到RAM地址RAM_LOW_ADRS處,并跳轉(zhuǎn)到此處執(zhí)行。如圖2所示。 該映象根據(jù)是否被壓縮又可分為: l 基于ROM的未壓縮的VxWorks映象,可直接從ROM拷貝到RAM中 l 基于ROM的壓縮的VxWorks映象,這種映象主要是為了節(jié)約BOOT空間,在從ROM拷貝到RAM的過程中需要解壓縮,因此與上述未壓縮的映象相比,它的引導(dǎo)過程相對較慢,但兩者在RAM中的運行速度是一樣的。 1.3 駐留ROM的VxWorks映象 這種映象起初也和搬移程序一起固化在BOOT中。目標(biāo)板上電后,首先運行BOOT中的引導(dǎo)搬移程序,但僅將VxWorks映象的數(shù)據(jù)段和BSS段拷貝到RAM地址RAM_LOW_ADRS處,映象的代碼段仍舊留在ROM中,從ROM中開始執(zhí)行。如圖3所示。 圖3 駐留ROM的VxWorks映象 這種映象的優(yōu)點是具有最快的引導(dǎo)速度,占用最少的RAM空間,適用于RAM空間有限的目標(biāo)板。但是由于該映象在ROM中運行,運行速度在三種映象中是最慢的。 2 幾種不同的BOOTROM的比較 針對上述三種不同的VxWorks映象,可以生成以下幾種不同的BOOTROM,主要體現(xiàn)在執(zhí)行搬移程序romStart( )( 位于bootInit.c文件中)時不同: 2.1 用于可加載VxWorks映象的BOOTROM 由圖1所示可知,用于可加載VxWorks映象的BOOTROM包含兩部分:起始引導(dǎo)程序(BootStrap Programs)和ROM引導(dǎo)程序(ROM Boot Programs)。 起始引導(dǎo)程序駐留在ROM中,主要包含: l 匯編級的硬件初始化程序romInit.s,用于系統(tǒng)的基本初始化,設(shè)置一些重要寄存器的初始值,進(jìn)行存儲器的映射 l 搬移程序bootInit.c,將ROM引導(dǎo)程序拷貝至RAM的高端地址RAM_HIGH_ADRS,然后跳轉(zhuǎn)到此處執(zhí)行ROM引導(dǎo)程序。 ROM引導(dǎo)程序起初存放在ROM中,初始化時被拷貝到RAM中,主要用于系統(tǒng)的進(jìn)一步初始化,并配置加載方式,將VxWorks映象加載至RAM??煞譃槿N不同的類型: l 壓縮的ROM引導(dǎo)程序,在拷貝的過程中需要解壓縮,在RAM中執(zhí)行 l 未壓縮的ROM引導(dǎo)程序,可直接拷貝,在RAM中執(zhí)行 l 駐留ROM的ROM引導(dǎo)程序,僅拷貝ROM引導(dǎo)程序的數(shù)據(jù)段,代碼段仍舊在ROM中執(zhí)行 在Tornado開發(fā)環(huán)境中,通過在主窗口點擊Build|Build Boot ROM可以選擇生成以上 三種BOOTROM,分別為:bootrom_uncmp.hex(未壓縮的BOOTROM),bootrom.hex(壓縮的BOOTROM),bootrom_res.hex(駐留的BOOTROM)。 靜態(tài)連接到可加載的VxWorks映象的系統(tǒng)初始化代碼執(zhí)行并完成整個初始化過程。 引導(dǎo)過程成功以后,RAM中ROM引導(dǎo)程序占用的空間(從RAM_HIGH_ADRS開始)可以重新被系統(tǒng)利用。 圖1中所示的各地址含義為: l LOCAL_MEM_LOCAL_ADRS是RAM的起始地址 l RAM_LOW_ADRS是VxWorks的加載點,也是VxWorks代碼段的起始位置 l FREE_RAM_ADRS是VxWorks映象的結(jié)束點。通常也是系統(tǒng)內(nèi)存池和目標(biāo)服務(wù)器內(nèi)存池的起始地址 l RAM_HIGH_ADRS是ROM引導(dǎo)程序的加載點。它也是ROM引導(dǎo)程序(除駐留ROM引導(dǎo)程序之外)的代碼段的起始位置,或駐留ROM引導(dǎo)程序數(shù)據(jù)段的起始位置。 2.2 用于基于ROM的VxWorks映象的BOOTROM 由圖2所示可知,用于該映象的BOOTROM包含兩部分:起始引導(dǎo)程序(BootStrap Programs)和基于ROM的VxWorks映象。搬移程序bootInit.c負(fù)責(zé)將VxWorks映象的文本段和數(shù)據(jù)段搬移到用戶定義的低端內(nèi)存地址RAM_LOW_ADRS,如果需要進(jìn)行必要的解壓縮,然后直接啟動VxWorks映像。 因此BOOTROM的容量相對于2.1中描述的BOOTROM要大一些,但無需在主機目錄下維護(hù)一個可用的VxWorks映象。 基于ROM的VxWorks BOOTROM有壓縮和未壓縮之分。在Tornado工作臺的Build窗口中,選擇VxWorks映象Rules屬性頁中的VxWorks_rom即可生成基于ROM的未壓縮的VxWorks BOOTROM,選中VxWorks_romCompress即可生成基于ROM的壓縮的VxWorks BOOTROM。 2.3 用于駐留ROM的VxWorks映象的BOOTROM 由圖3所示可知,用于該映象的BOOTROM包含兩部分:起始引導(dǎo)程序(BootStrap Programs)和駐留ROM的VxWorks映象,VxWorks系統(tǒng)文本段駐留在ROM,搬移程序bootInit.c負(fù)責(zé)將數(shù)據(jù)段和bss段搬移到用戶定義的低端內(nèi)存地址RAM_LOW_ADRS,直接啟動VxWorks映像(含符號表)。此時,RAM_LOW_ADRS是VxWorks映象的加載點,它也是VxWorks數(shù)據(jù)段的起始點。 在Tornado工作臺的Build窗口中,選擇VxWorks映象Rules屬性頁中的VxWorks_romResident即可生成駐留ROM的VxWorks BOOTROM。 3 VxWorks的啟動過程 根據(jù)上述所采用的BOOTROM的不同,VxWorks的啟動過程會有所不同。 3.1 使用可加載VxWorks映象的啟動過程 此時,從目標(biāo)板上電復(fù)位到啟動用戶定義的任務(wù)的整個流程如下: sysALib.s : sysInit( ) 鎖住中斷,關(guān)閉cache(如果使用了話),初始化處理器的寄存器(包括C堆棧指針)至缺省值 開始在RAM中運行VxWorks usrConfig.c : usrInit( ) 設(shè)置cache的工作模式,板級硬件初始化,初始化Win內(nèi)核,啟動usrRoot( ) usrConfig.c : usrRoot( ) 初始化內(nèi)存,系統(tǒng)時鐘,I/O系統(tǒng),標(biāo)準(zhǔn)輸入輸出錯,異常處理,添加用戶應(yīng)用程序 romInit.s : romInit 設(shè)置機器狀態(tài)字及其它硬件相關(guān)寄存器,關(guān)閉中斷,禁止程序和數(shù)據(jù)CACHE,初始化內(nèi)存,并設(shè)置堆棧指針 bootInit.c : romStart( ) 將ROM中的程序搬移至RAM中 bootConfig.c : usrInit( ) 設(shè)置cache的工作模式,板級硬件初始化,調(diào)用sysHwInit( ),usrKernelInit( ),KernelInit( ),初始化Win內(nèi)核,產(chǎn)生根任務(wù)usrRoot( ) bootConfig.c : usrRoot( ) 初始化內(nèi)存,系統(tǒng)時鐘,I/O系統(tǒng),標(biāo)準(zhǔn)輸入輸出錯,異常處理,產(chǎn)生任務(wù)bootCmdLoop bootConfig.c : bootCmdLoop( ) 調(diào)用自動引導(dǎo)程序autoboot( ),此函數(shù)若成功則不返回 bootConfig.c: autoboot( ) 延時7s,以默認(rèn)參數(shù)啟動 用戶按鍵中斷 bootConfig.c :bootCmdLoop( ) 啟動命令行用于配置VxWorks啟動參數(shù) bootConfig.c: bootLoad( ) 加載VxWorks映象,并轉(zhuǎn)向它進(jìn)行重啟 等待超時 用戶輸入 BootStrap程序 在ROM中執(zhí)行 ROM Boot程序 被搬移到RAM中執(zhí)行 3.1.1 BOOTROM的啟動過程 1、 目標(biāo)板加電之后,程序指針指向RESET中斷程序入口處,開始執(zhí)行初始化程序romInit.s,設(shè)置機器狀態(tài)字及其它硬件相關(guān)寄存器,關(guān)閉中斷,禁止程序和數(shù)據(jù)CACHE,初始化內(nèi)存,并設(shè)置堆棧指針,保存啟動類型,調(diào)用romStart( )。 2、 程序跳到第一個C程序bootInit.c的函數(shù)romStart( )入口地址,根據(jù)堆棧中的參數(shù)決定是否清零內(nèi)存RAM(如是冷啟動(cold start)則清零),根據(jù)不同的bootrom文件,把ROM中數(shù)據(jù)段和文本段拷貝到RAM(如果ROM代碼是壓縮的,還要解壓); 3、 程序跳到RAM入口地址(文件bootConfig.c中函數(shù)usrInit( ) ),根據(jù)用戶配置來設(shè)置cache的工作模式,清零bss段,初始化異常處理程序,進(jìn)行板級硬件初始化sysHwInit( )。 4、 啟動多任務(wù)內(nèi)核KernelInit( ),執(zhí)行usrRoot任務(wù)。在該任務(wù)中初始化串口,創(chuàng)建console終端設(shè)備。創(chuàng)建bootCmdLoop任務(wù),根據(jù)單板設(shè)計選擇不同方式加載VxWorks映像文件,如通過串口、網(wǎng)口、硬盤等方式。 3.1.2 VxWorks映象的啟動過程 VxWorks進(jìn)入點sysInit() 啟動VxWorks系統(tǒng)的第一步就是將系統(tǒng)映象加載到主內(nèi)存。這通常是在VxWorks boot Rom 的控制下,從開發(fā)主機上下載。接著,boot Rom將控制權(quán)交給VxWorks的起始進(jìn)入點:sysInit()。在makefile和 config.h文件里,已將這個進(jìn)入點設(shè)置成位于地址RAM_LOW_ADRS。 函數(shù)sysInit()位于系統(tǒng)特定的匯編語言模塊sysALib.s中。它可以鎖住中斷,關(guān)閉cache(如果使用了話),初始化處理器的寄存器(包括C堆棧指針)至缺省值。它還會關(guān)閉跟蹤,清除所有未決的中斷,并調(diào)用一個位于usrConfig.c 模塊的C語言子程序:usrInit() 。對于某些目標(biāo)板,sysInit()還執(zhí)行一些必要的與系統(tǒng)有關(guān)的硬件初始化,以便在usrInit()中執(zhí)行完剩余的初始化內(nèi)容。僅供usrInit()使用的初始堆棧指針,被設(shè)置成位于系統(tǒng)映象(RAM_LOW_ADRS)以下,向量表以上的位置。 初始化代碼usrInit() 函數(shù)usrInit()(位于usrConfig.c中),儲存有關(guān)引導(dǎo)類型的信息,處理在內(nèi)核啟動之前必須執(zhí)行的初始化,而后啟動內(nèi)核執(zhí)行。它是運行于VxWorks內(nèi)的第一個C函數(shù)。此時,所有的中斷都已被鎖住。 許多VxWorks工具在usrInit( )中都不能使用。這是因為此時還沒有任務(wù)的上下文(沒有TCB和任務(wù)堆棧),那些需要任務(wù)上下文的工具無法被調(diào)用。函數(shù)usrInit( )僅做一些創(chuàng)建初始化任務(wù)usrRoot( )所必須的工作。然后由usrRoot( )完成啟動過程。 usrInit( ) 中的初始化過程如下所述: Cache初始化 usrInit( ) 的起始代碼初始化cache,設(shè)置cache 模式,并將cache放置在一個安全的位置。在usrInit( )結(jié)束時,缺省情況下,指令cache和數(shù)據(jù)cache被使能。 對系統(tǒng)的BSS段清零 C 和C+語言規(guī)定所有未初始化的變量缺省的初始值為零。這些未初始化的變量被放置在一個稱為bss的段內(nèi)。由于usrInit( )是系統(tǒng)執(zhí)行的第一個C代碼,在它的一開始對包含bss段的內(nèi)存清零。VxWorks的boot ROM 也會清內(nèi)存,但VxWorks映象假設(shè)沒有采用boot ROM,仍然執(zhí)行清內(nèi)存的操作。 初始化中斷向量 異常向量必須在使能中斷和啟動內(nèi)核之前建立。首先,調(diào)用intVecBaseSet( ) 建立向量表基地址。而后,調(diào)用excVecInit( ) 初始化所有的異常向量至缺省句柄,以便安全地捕獲和報告由程序錯誤或意外的硬件中斷導(dǎo)致的異常。 初始化硬件至靜止?fàn)顟B(tài) 通過調(diào)用系統(tǒng)相關(guān)函數(shù)sysHwInit( )初始化系統(tǒng)硬件。該函數(shù)復(fù)位并關(guān)閉那些在中斷使能(內(nèi)核啟動時)以后可能產(chǎn)生中斷的硬件設(shè)備。這一點很重要,因為VxWorks ISRs(用于I/O設(shè)備,系統(tǒng)時鐘等)直到在任務(wù)usrRoot( )中完成系統(tǒng)初始化以后,才被連接到它們的中斷向量上。不要在sysHwInit( ) 調(diào)用中試圖為一個中斷連接一個中斷句柄(也就是不能使用intConnect( )),因為此時內(nèi)存池還沒有初始化。 初始化內(nèi)核 函數(shù)usrInit( )結(jié)束時調(diào)用了兩個內(nèi)核初始化函數(shù): usrKernelInit( )(在usrKernel.c中定義)為每個指定的可選內(nèi)核組件調(diào)用合適的初始化代碼。詳見表1。 kernelInit( ) (kernelLib.c的一部分)初始化多任務(wù)環(huán)境,不用返回。函數(shù)參數(shù)包括: l 用以產(chǎn)生作為根任務(wù)的應(yīng)用程序,典型的為usrRoot( ) l 使用的堆棧大小 l 可用的起始內(nèi)存地址,一般位于VxWorks映象的代碼段,數(shù)據(jù)段和bss 段之后,如果包含可選的主機內(nèi)存池,則還要加上WDB_POOL_SIZE。 l 由sysMemTop( )定義的內(nèi)存頂部 l 中斷堆棧的大小 l 中斷封鎖級別 kernelInit( ) 調(diào)用intLockLevelSet( ),關(guān)閉循環(huán)模式,創(chuàng)建一個中斷堆棧(如果結(jié)構(gòu)支 持的話)。然后從內(nèi)存池的頂部創(chuàng)建一個根堆棧和TCB,創(chuàng)建一個根任務(wù),usrRoot,并終止usrInit( )線程的執(zhí)行。此時使能中斷,所有的中斷源已被關(guān)閉,未決中斷已被清除。 初始化內(nèi)存池 內(nèi)存池的初始化是由kernelInit( )來完成的。kernelInit( ) 的參數(shù)指定了初始內(nèi)存池的起始和終止地址。在缺省的usrInit( )中,將內(nèi)存池設(shè)置在緊接于引導(dǎo)的系統(tǒng)映象之后,并包含所有剩余的可用內(nèi)存。 可用內(nèi)存的大小由sysMemTop( )決定。如果你的系統(tǒng)有其它的不連續(xù)的內(nèi)存片,你可以在usrRoot( )任務(wù)中通過調(diào)用memAddToPool( )將它們包含進(jìn)通用的內(nèi)存池。 VxWorks包含了一個位于memPartLib模塊中的內(nèi)存分配工具,它管理一個可用內(nèi)存池。用戶可以調(diào)用malloc( )函數(shù)從內(nèi)存池中獲得可變大小的內(nèi)存塊。VxWorks也利用malloc( )函數(shù)來動態(tài)分配內(nèi)存。許多VxWorks工具在初始化過程中需要分配數(shù)據(jù)結(jié)構(gòu)。因此,內(nèi)存池必須在任何其他的VxWorks工具初始化之前初始化。 Tornado目標(biāo)服務(wù)器也管理一部分目標(biāo)內(nèi)存以支持目標(biāo)模塊的下載和其他開發(fā)功能。VxWorks使用malloc( )函數(shù)為已下載的模塊分配空間,為已產(chǎn)生的任務(wù)分配堆棧,在初始化時分配數(shù)據(jù)結(jié)構(gòu)。用戶也可以使用malloc( )函數(shù)為自己的應(yīng)用程序分配所需的內(nèi)存空間。因此,推薦將所有的未用內(nèi)存分配給VxWorks內(nèi)存池,除非必須為一個特殊的應(yīng)用保留一片固定的絕對內(nèi)存。 初始任務(wù)usrRoot( ) 當(dāng)多任務(wù)內(nèi)核啟動執(zhí)行以后,所有的VxWorks多任務(wù)工具就可以用了??刂茩?quán)被傳送至usrRoot( )任務(wù),并完成初始化系統(tǒng)。 usrRoot( ) 執(zhí)行以下操作: l 初始化系統(tǒng)時鐘 l 初始化I/O系統(tǒng)和驅(qū)動 l 創(chuàng)建控制臺設(shè)備 l 設(shè)置標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出 l 安裝異常處理和登陸 l 初始化管道驅(qū)動器 l 初始化標(biāo)準(zhǔn)I/O l 創(chuàng)建文件系統(tǒng)設(shè)備并安裝磁盤驅(qū)動器 l 初始化浮點支持 l 初始化性能監(jiān)視工具 l 初始化網(wǎng)絡(luò) l 初始化可選的工具 l 初始化WindView l 初始化目標(biāo)代理 l 執(zhí)行一個用戶提供的啟動腳本 l 初始化VxWorks Shell 下面對各個步驟進(jìn)行詳盡的描述: 初始化系統(tǒng)時鐘 usrRoot( ) 任務(wù)執(zhí)行的第一個操作就是初始化VxWorks時鐘。通過調(diào)用sysClkConnect( ) 將系統(tǒng)時鐘的中斷向量連接到usrClock( )函數(shù)上。調(diào)用sysClkRateSet( )將系統(tǒng)時鐘率設(shè)置為60Hz。 sysClkConnect( ) 函數(shù)調(diào)用sysHwInit2( )。風(fēng)河的BSP采用sysHwInit2( )執(zhí)行在sysHwInit( )中未完成的進(jìn)一步的板級初始化。例如,可以利用intConnect( )連接ISR,因為此時已經(jīng)分配了內(nèi)存,系統(tǒng)處于多任務(wù)環(huán)境。 初始化I/O系統(tǒng) 如果在configAll.h中定義了INCLUDE_IO_SYSTEM,就可以調(diào)用iosInit( )函數(shù)初始化VxWorks的I/O系統(tǒng)。該函數(shù)的參數(shù)指定了可被順序安裝的最大驅(qū)動器的數(shù)目,可以在系統(tǒng)中同時打開的最大文件數(shù)目,和VxWorks的I/O系統(tǒng)包含的“空”設(shè)備的名字。 包含或去除INCLUDE_IO_SYSTEM還會影響是否創(chuàng)建控制臺設(shè)備,是否設(shè)置標(biāo)準(zhǔn)的輸入、輸出和標(biāo)準(zhǔn)的出錯信息。 創(chuàng)建控制臺設(shè)備 如果包含了板上串口驅(qū)動器(定義了INCLUDE_TTY_DEV),就可以通過調(diào)用驅(qū)動器的初始化函數(shù)(典型的是ttyDrv( ))將它安裝進(jìn)I/O系統(tǒng)。實際的設(shè)備是通過調(diào)用驅(qū)動器的設(shè)備創(chuàng)建函數(shù)(典型的是ttyDevCreate())來創(chuàng)建和命名的。這個函數(shù)的參數(shù)包括設(shè)備名稱,一個串行I/O通道描述字(從BSP獲得),和輸入輸出緩存大小。 宏NUM_TTY定義了tty口的數(shù)量(缺省是2)。宏CONSOLE_TTY指定了哪個口作為控制臺口(缺省是0),宏CONSOLE_BAUD_RATE指定了其比特率(缺省是9600 bps)。這些宏都在configAll.h中定義,但對于那些具有非標(biāo)口數(shù)的單板可以在config.h中對它們進(jìn)行重新定義。 設(shè)置標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)出錯信息 系統(tǒng)級的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤信息的配置是通過打開控制臺設(shè)備并調(diào)用ioGlobalStdSet( )來建立的。這些配置作為VxWorks的缺省設(shè)備用于與應(yīng)用開發(fā)人員通訊。為了使控制臺設(shè)備成為一個交互式的終端,調(diào)用ioctl( )將設(shè)備選項設(shè)為OPT_TERMINAL。 安裝異常處理和登錄 初始化VxWorks的異常處理工具(由excLib模塊提供)和登錄工具(由logLib庫提供)。這些工具檢查在根任務(wù)內(nèi)部或者初始化各種工具時產(chǎn)生的程序錯誤。 當(dāng)定義了宏INCLUDE_EXC_HANDLING和INCLUDE_EXC_TASK后,調(diào)用excInit( )初始化異常處理工具。excInit( ) 函數(shù)產(chǎn)生一個異常支持任務(wù)excTask( )。初始化以后,可以安全地捕獲和報告導(dǎo)致硬件異常的程序錯誤,報告并解除沒有初始化向量的中斷。當(dāng)定義了INCLUDE_SIGNALS后,調(diào)用sigInit( )初始化VxWorks的信號工具,該工具用于任務(wù)的異常處理。 當(dāng)定義了INCLUDE_LOGGING宏以后,調(diào)用logInit( )初始化登錄工具。其參數(shù)定義了顯示登錄信息的設(shè)備的文件描述字,和分配的登錄信息緩存數(shù)。登錄初始化還創(chuàng)建了一個登錄任務(wù)logTask( )。 初始化管道驅(qū)動 如果需要所謂的管道,在configAll.h中定義INCLUDE_PIPE,就會自動地調(diào)用pipeDrv( )初始化管道。而后任務(wù)就可以利用管道通過標(biāo)準(zhǔn)的I/O接口互相通訊了。管道必須由pipeDevCreate( ) 函數(shù)創(chuàng)建。 初始化標(biāo)準(zhǔn)I/O 當(dāng)定義了宏INCLUDE_STDIO以后,VxWorks 就會包含一個可選的標(biāo)準(zhǔn)I/O包。 創(chuàng)建文件系統(tǒng)設(shè)備并初始化設(shè)備驅(qū)動 許多VxWorks配置至少包含一個磁盤驅(qū)動器,或帶有dosFs/rt11Fs/rawFs文件系統(tǒng)的RAM磁盤。首先,通過調(diào)用驅(qū)動器的初始化代碼安裝一個磁盤驅(qū)動器。而后,驅(qū)動器的設(shè)備創(chuàng)建代碼會定義一個設(shè)備。這個調(diào)用會返回一個指向描述設(shè)備的BLK_DEV結(jié)構(gòu)的指針。 然后就可以調(diào)用文件系統(tǒng)的設(shè)備初始化代碼dosFsDevInit( ), rt11FsDevInit( ), or rawFsDevInit( )(如果定義了宏INCLUDE_DOSFS, INCLUDE_RT11FS和INCLUDE_RAWFS)初始化和命名設(shè)備。在初始化一個設(shè)備之前,必須用dosFsInit( ), rt11FsInit( )或 rawFsInit( )初始化文件系統(tǒng)模塊。文件系統(tǒng)的設(shè)備初始化函數(shù)的參數(shù)取決于特定的文件系統(tǒng),但典型的包括設(shè)備名稱,由驅(qū)動器的設(shè)備創(chuàng)建代碼產(chǎn)生的一個指向BLK_DEV結(jié)構(gòu)的指針,可能還有一些文件系統(tǒng)特定的配置參數(shù)。 初始化浮點支持 如果在configAll.h中包含了INCLUDE_FLOATING_POINT宏定義,則調(diào)用floatInit( )函數(shù)初始化浮點I/O支持。當(dāng)定義了INCLUDE_HW_FP,調(diào)用mathHardInit( )初始化對浮點協(xié)處理器的支持。當(dāng)定義了INCLUDE_SW_FP,調(diào)用mathSoftInit( )初始化對軟件浮點仿真的支持。 包含性能仿真 VxWorks具有兩個內(nèi)嵌的性能監(jiān)視工具。一個由spyLib提供的任務(wù)活動綜述,一個由timexLib提供的子程序執(zhí)行定時器。如果在configAll.h中定義了宏INCLUDE_SPY 和INCLUDE_TIMEX,就會包含這些工具。 初始化網(wǎng)絡(luò) 如果配置頭文件中定義了INCLUDE_NET_INIT,usrRoot( )就會調(diào)用usrNetInit( )函數(shù)初始化網(wǎng)絡(luò)(usrNetInit( )的源代碼位于installDir/target/src/config/usrNetwork.c)。usrNetInit( )函數(shù)使用了一個配置字符串作為它的參數(shù)。這個配置字符串通常是一條“引導(dǎo)行”,用于VxWorks的boot ROM引導(dǎo)系統(tǒng)。根據(jù)這個字符串,usrNetInit( )函數(shù)執(zhí)行以下操作: l 調(diào)用netLibInit( )初始化網(wǎng)絡(luò)子系統(tǒng) l 連接并配置合適的網(wǎng)絡(luò)驅(qū)動器 l 添加網(wǎng)關(guān)路由 l 初始化遠(yuǎn)程文件存取驅(qū)動器netDrv,并添加一個遠(yuǎn)程文件存取設(shè)備 l 初始化遠(yuǎn)程登錄工具 l 可選地初始化遠(yuǎn)端程序調(diào)用(RPC) l 可選地初始化網(wǎng)絡(luò)文件系統(tǒng)(NFS)工具 如前所述,是否包含這些網(wǎng)絡(luò)工具由configAll.h中的宏定義決定。 初始化可選產(chǎn)品和其它組件 可選產(chǎn)品VxMP可提供共享內(nèi)存目標(biāo)。如果定義了宏INCLUDE_SM_OBJ,usrRoot( ) 就會調(diào)用usrSmObjInit( )函數(shù)(源代碼位于installDir/target/src/config/usrSmObj.c),初始化共享內(nèi)存目標(biāo)。 共享內(nèi)存目標(biāo)庫需要VxWorks引導(dǎo)行中的域值。這些函數(shù)包含在usrNetwork.c文件中。如果不包含網(wǎng)絡(luò)服務(wù),usrNetwork.c就不會被包含,共享內(nèi)存初始化就會失敗。工程工具計算所有的依存關(guān)系,但如果使用手工配置,可以將INCLUDE_NETWORK添加進(jìn)configAll.h,或是從usrNetwork.c文件中將引導(dǎo)行代碼提取出來放置到其他地方。 如果定義了INCLUDE_MMU_BASIC,就可以提供基本的MMU支持。如果定義了INCLUDE_MMU_FULL,可選產(chǎn)品VxVMI就可以提供代碼保護(hù),向量表保護(hù)和一個虛擬內(nèi)存接口。MMU由函數(shù)usrMmuInit( )初始化,該函數(shù)位于installDir/target/src/config/usrMmuInit.c文件中。如果還定義了宏INCLUDE_PROTECT_TEXT 和INCLUDE_PROTECT_VEC_TABLE,就會初始化代碼保護(hù)和向量表保護(hù)。 初始化WindView 可選產(chǎn)品WindView可提供內(nèi)核測試工具。如果在configAll.h中定義了宏INCLUDE_WINDVIEW,就可以在usrRoot( )中調(diào)用windviewConfig ( )初始化WindView。其它的WindView常量控制特定的初始化步驟。 初始化目標(biāo)代理 如果定義了INCLUDE_WDB,調(diào)用函數(shù)wdbConfig( )(位于installDir/target/src/config/usrWdb.c)。這個函數(shù)初始化通訊接口,然后啟動代理。 執(zhí)行一個啟動腳本 如果VxWorks配置了目標(biāo)駐留的shell,定義了INCLUDE_STARTUP_SCRIPT,并且在boot引導(dǎo)過程中在啟動腳本參數(shù)中輸入了腳本文件的名稱,usrRoot( )函數(shù)就可以執(zhí)行一個用戶提供的啟動腳本。如果在引導(dǎo)過程中忽略了啟動腳本參數(shù),就不會執(zhí)行啟動腳本。 表1、可加載VxWorks映象的初始化過程 函 數(shù) 函 數(shù) 功 能 所 在 文 件 sysInit() (a)鎖住中斷;(b)禁用緩沖; (c)用缺省值初始化系統(tǒng)中斷表(僅i960); (d)用缺省值初始化系統(tǒng)錯誤表(僅i960); (e)初始化處理器寄存器到一缺省值; (f)使回溯失效;(g)清除所有懸置中斷; (h)激活usrInit(),指明啟動類型。 sysALib.s usrInit() a)對bss清零; (b)保存bootType于sysStartType; (c)調(diào)用excVecInit(),初始化所有系統(tǒng)和缺省中斷向量; (d)依次調(diào)用sysHwInit(), usrKernelInit(),kernelInit(). usrConfig.c usrKernelInit() 依次調(diào)用classLibInit(),taskLibInit(),taskHookInit(),semBLibInit(),semMLibInit(), semCLibInit(),semOLibInit(),wdLibInit() msgQLibInit(),qInit(),workQInit() usrKernel.c kernelInit() 初始化并啟動內(nèi)核。 (a)激活intLockLevelSet(); (b)從內(nèi)存池頂部創(chuàng)建根堆棧和TCB;(c)調(diào)用taskInit(), taskActivate(),用于usrRoot(); (d)調(diào)用usrRoot(). kernelLib.h usrRoot() 初始化I/O系統(tǒng),驅(qū)動器,設(shè)備(在configAll.h和config.h中指定) (a)調(diào)用sysClkConnect(),sysClkRateSet(), iosInit(),ttyDrv(); (b)初始化excInit(),logInit(),sigInit(). (c)初始化管道,pipeDrv(); (d)stdioInit(),mathSoftInit()或mathHardInit() (e)wdbConfig():配置并初始化目標(biāo)代理機 usrConfig.c 3.2 使用基于ROM的VxWorks映象的啟動過程 此時BOOTROM中包含了引導(dǎo)程序和VxWorks映象。VxWorks的入口點由兩個函數(shù) romInit()和romStart()來完成,而非sysInit()。具體過程如表2所示。 表2、基于ROM的VxWorks映象的啟動過程 函 數(shù) 函 數(shù) 功 能 所 在 文 件 1.romInit() (a)禁止中斷; (b)保存啟動類型; (c)硬件初始化; (d)調(diào)用romStart(); romInit.s 2.romStart() (a)將數(shù)據(jù)段從ROM拷貝到RAM,清內(nèi)存; (b)將代碼段從ROM拷貝到RAM,有必要的話解壓縮; (c)依據(jù)引導(dǎo)類型調(diào)用usrInit(); bootInit.c 3.usrInit() 初始化程序 usrConfig.c 4.usrKernelInit() 如果相應(yīng)的配置文件被定義,對應(yīng)函數(shù)被調(diào)用 usrKernel.c 5.kernelInit() 初始化并啟動內(nèi)核 kernelLib.h 6.usrRoot() 初始化I/O系統(tǒng),驅(qū)動器,創(chuàng)建設(shè)備 usrConfig.c 7.Application routine 應(yīng)用程序代碼 應(yīng)用程序源文件 使用駐留ROM的VxWorks映象的啟動過程與此類似,只是在執(zhí)行搬移程序romStart( )有所不同。 4主要文件及宏開關(guān)介紹 以est8260評估板為例,說明編制BSP軟件所涉及的主要文件及宏開關(guān)。 4.1 Makefile文件 位于BSP文件目錄下的編譯文件Makefile,定義了啟動文件bootrom首地址及大小,以及編譯時調(diào)用的函數(shù)庫,VxWorks映像文件的加載地址,用戶需增加的目標(biāo)模塊。 該文件中的主要宏定義: CPU = PPCEC603 目標(biāo)板的CPU類型,MPC750為PPC604,MPC8260為PPCEC603 TOOL = gnu 主機工具為基于GNU的工具,用戶不必修改 TGT_DIR = $(WIND_BASE)/target target所在目錄(WIND_BASE)已在torVars.bat中指定,為Tornado的安裝目錄 include $(TGT_DIR)/h/make/defs.bsp 定義編譯選項 include $(TGT_DIR)/h/make/make.$(CPU)$(TOOL) 即文件make.ppc860gnu include $(TGT_DIR)/h/make/defs.$(WIND_HOST_TYPE) 即defs.x86-win32,定義和主機操作平臺相關(guān)的工具 注意: 只能在這個位置之后重新定義make的定義。 TARGET_DIR = est8260 目標(biāo)板BSP目錄名,用戶需指定為目標(biāo)板BSP文件所在目錄 VENDOR = EST 目標(biāo)板制造商,和BSP程序無關(guān),作注釋用 BOARD = est8260 Evaluation SBC 目標(biāo)板名,和BSP程序無關(guān),作注釋用 BOOTINIT = bootInit.c USRCONFIG = usrConfig.c 系統(tǒng)編譯bootrom時會自動編譯用戶BSP文件目錄下的usrConfig.c和bootInit.c,缺省文件位于All目錄下。 以下地址值都為十六進(jìn)制值,無需加入0x前綴。在config.h和Makefile中都定義了ROM_TEXT_ADRS, ROM_SIZE, RAM_HIGH_ADRS等常量,在2個文件中的對常量的定義要求一致。 ROM_BASE_ADRS = fff00000 ROM的物理起始點 ROM_TEXT_ADRS = fff00100 根啟動設(shè)備Boot ROM首地址 ROM_SIZE = 00080000 BOOTROM大?。?12K) LOCAL_MEM_LOCAL_ADRS = 00000000 RAM的物理起始點 LOCAL_MEM_SIZE = 01000000 RAM大?。?6M) RAM_LOW_ADRS = 00100000 加載VxWorks的目標(biāo)地址 RAM_HIGH_ADRS = 00a00000 拷貝boot ROM文本段和數(shù)據(jù)段的目標(biāo)地址 HEX_FLAGS = -a $(ROM_TEXT_ADRS) Hex文件轉(zhuǎn)化為bin文件的執(zhí)行程序參數(shù) MACH_EXTRA = m8260CpmEnd.obj 用戶加入的目標(biāo)模塊名,后綴為obj LDFLAGS = -X -N -Map est8260.map 在連接標(biāo)識中增加-M est8260.map可以在BSP目錄下生成包含編譯信息的est8260.map文件。 注意:只能在這個位置之前重新定義make的定義。 include $(TGT_DIR)/h/make/rules.bsp include $(TGT_DIR)/h/make/rules.$(WIND_HOST_TYPE) 定義編譯各種BSP文件的生成規(guī)則 4.2 all/ConfigAll.h文件 此文件包含了適用于所有目標(biāo)板的缺省定義。主要定義了以下選項和參數(shù): 內(nèi)核配置參數(shù) I/O系統(tǒng)參數(shù) NFS 參數(shù) 選擇可選的軟件模塊 選擇可選的設(shè)備控制器 cache模式 最大數(shù)量的不同共享內(nèi)存目標(biāo) 設(shè)備控制器I/O地址,中斷向量和中斷級別 4.3 config.h文件 此文件位于BSP目錄下,包含僅適用于特定目標(biāo)板的定義,還可以對configAll.h中的缺省定義進(jìn)行重定義。其主要內(nèi)容為: 1、BSP版本號 #define BSP_VER_1_1 1 #define BSP_VERSION 1.2 #define BSP_REV /4 2、configAll.h 包含文件,應(yīng)放在BSP_VERSION和BSP_REV定義之后 #include configAll.h 3、定義缺省的BOOT引導(dǎo)設(shè)備 #define DEFAULT_BOOT_DEVICE CPM_END 4、定義網(wǎng)絡(luò)控制器 #define INCLUDE_CPM ;使用SCC以太網(wǎng)控制器 5、定義缺省的BOOT引導(dǎo)參數(shù) #define DEFAULT_BOOT_LINE $dev(0,procnum)host:dirfile h=# e=# b=# g=# u=usr pw=passwd f=# tn=targetname s=script o=other $dev - boot device,啟動的設(shè)備類型,必須是已包含的設(shè)備。 procnum - 處理器序號,一般從零開始。 host - 主機名 dir:file - 被加載的VxWorks文件所在的完整路徑 h - 主機IP e - 目標(biāo)板IP b - 背板IP,用戶可不定義 g - 網(wǎng)關(guān),用戶可不定義 u - 用戶名 pw - 登錄口令 f - 定義網(wǎng)絡(luò)加載方式。無此項時缺省值為零,為FTP tn - 目標(biāo)板名 s - 啟動描述字符串,用戶可不定義 o - 從SCSI啟動時指明網(wǎng)絡(luò)接口 依據(jù)不同的
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄭州大學(xué)《生命科學(xué)基礎(chǔ)一:生物化學(xué)實驗》2023-2024學(xué)年第二學(xué)期期末試卷
- 重慶開州區(qū)義和鎮(zhèn)魚龍中心小學(xué)2024-2025學(xué)年數(shù)學(xué)三下期末綜合測試模擬試題含解析
- 江蘇省南京市秦淮區(qū)2025屆高三雙基測試生物試題含解析
- 西安明德理工學(xué)院《大學(xué)生職業(yè)規(guī)劃》2023-2024學(xué)年第二學(xué)期期末試卷
- 江蘇省揚州市高郵市2024-2025學(xué)年三下數(shù)學(xué)期末質(zhì)量檢測試題含解析
- 江蘇省溧水區(qū)2024-2025學(xué)年初三下學(xué)期中考模擬考試生物試題(文史類)試卷含解析
- 吉安幼兒師范高等??茖W(xué)校《內(nèi)科技能訓(xùn)練》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江省寧波市奉化區(qū)2025屆初三下期中數(shù)學(xué)試題試卷含解析
- 重慶市涪陵區(qū)第十九中學(xué)2025年初三下學(xué)期第八次月考數(shù)學(xué)試題含解析
- 三優(yōu)聯(lián)評培訓(xùn)大綱
- 血液制品規(guī)范輸注
- 2025年征信業(yè)務(wù)合規(guī)培訓(xùn)
- 2025項目部與供應(yīng)商安全生產(chǎn)物資供應(yīng)合同
- 暖通空調(diào)面試題及答案
- 統(tǒng)借統(tǒng)還合同協(xié)議
- 防造假培訓(xùn)課件教案模板
- 冷庫項目工程施工組織設(shè)計方案
- 2025年上半年浙江金華義烏市勞動人事爭議仲裁院招聘易考易錯模擬試題(共500題)試卷后附參考答案
- 護(hù)理文書如何規(guī)范書寫
- 2025年上半年中國十五冶金建設(shè)集團(tuán)限公司公開招聘中高端人才易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年河北省石家莊市一中、唐山一中等“五個一”名校高三全真模擬(最后一卷)生物試題試卷含解析
評論
0/150
提交評論