1) 軟件制作方法簡(jiǎn)介 Tornado 提供一個(gè)集成的編譯bootrom、vxWorks 以及用戶程序的工程環(huán)境,此外bootrom 和vxWorks 的編譯還可以使用命令行的方式,也就是通過(guò)在dos 環(huán)境下(win98 下運(yùn)行 command,win2000 下運(yùn)行cmd)直接輸入命令的方式進(jìn)行。由于bootrom 的工程環(huán)境下編譯 實(shí)際上就是采用了命令行方式,且使用命令行方式制作bootrom 和vxWorks 可以結(jié)合批處理 的方法,更加方便快捷,因此本文中介紹的bootrom 和vxWorks 制作方法選用命令行方式。 而用戶程序的制作可以單獨(dú)建立工程獨(dú)立編譯,但編譯選項(xiàng)中必須選擇和相應(yīng)vxWorks 相同 的CPU 類(lèi)型。 Bootrom 和vxWorks 的制作可以通過(guò)建立一個(gè)批處理文件makeAll.bat 完成。文件內(nèi)容如 下: 首先設(shè)置環(huán)境變量,這些環(huán)境變量的設(shè)置和tornado 安裝目錄下host\x86-win32\bin 中 torvars.bat 的內(nèi)容一致。 set WIND_HOST_TYPE=x86-win32 set WIND_BASE=C:\Tornado set PATH=%WIND_BASE%\host\%WIND_HOST_TYPE%\bin;%PATH% 然后編譯bootrom,這里選擇可用于燒入rom 的bootrom.hex make bootrom.hex 再編譯vxWorks,并選擇帶符號(hào)表的vxWorks.st,最后制作成調(diào)入內(nèi)存就可以直接使用的 二進(jìn)制文件vxWork.bin。 make vxWorks.st elfToBin <vxWorks.st> vxWorks.bin 直接運(yùn)行makeAll.bat,如果沒(méi)有任何語(yǔ)法錯(cuò)誤,將生成bootrom.hex,vxWorks.st 和 vxWorks.bin。vxWorks.st 是用于網(wǎng)絡(luò)下載的操作系統(tǒng)文件,vxWorks.bin 用于燒入Flash。 2) 基于靜態(tài)鏈接的自啟動(dòng)vxWorks 制作 用戶程序在開(kāi)發(fā)過(guò)程中使用單獨(dú)的工程編譯,編譯結(jié)束生成一批和.c 文件同名的.o 文件, 這些文件通過(guò)target server 動(dòng)態(tài)下載,這樣提供便捷的調(diào)試環(huán)境,但需要主機(jī)環(huán)境的支持。當(dāng) 開(kāi)發(fā)結(jié)束后,需要給操作人員提供最方便的啟動(dòng)方式,因此必須將用戶程序也編譯鏈接到 vxWorks.bin 中,在vxWorks 啟動(dòng)后就直接啟動(dòng)用戶程序。鏈接方式包括靜態(tài)鏈接和動(dòng)態(tài)鏈接 兩種。靜態(tài)鏈接將提供的所有函數(shù)都鏈接到vxWorks 中,而動(dòng)態(tài)鏈接只鏈接被調(diào)用的函數(shù), 用戶開(kāi)發(fā)過(guò)程中用于測(cè)試而在最終系統(tǒng)中并不運(yùn)行的函數(shù)將不被鏈接。通過(guò)使用nm 可以察看 包括vxWorks.st 在內(nèi)的hex 類(lèi)型文件中含有的函數(shù)聲明和全局變量,在命令行下輸入:nmppc --numeric -sort vxWorks.st >symTab.txt,將vxWork.st 中含有的函數(shù)和全局變量寫(xiě)到文件 symTab.txt 中,可以分別察看靜、動(dòng)態(tài)鏈接產(chǎn)生的vxWorks 對(duì)用戶程序中的函數(shù)包含情況。 這里使用命令arppc 同樣是因?yàn)镃PU 屬于PowerPC。 靜態(tài)鏈接有兩種方式:.c 的鏈接和.o 的鏈接。 .c 的鏈接方式:先在BSP 目錄下建立用戶程序文件夾usrAPI,將所有用戶源程序拷貝到 此目錄下,然后在usrConfig.c 的usrRoot()函數(shù)結(jié)尾處調(diào)用用戶程序,需要在usrConfig.c 程序 開(kāi)始添加聲明:#include “用戶程序名.c” .o 的鏈接方式:同樣建立目錄usrAPI,將在工程中編譯生成的.o 文件拷貝到usrAPI,在 makefile 中添加LIB_EXTRA的定義來(lái)將.o包括到vxWorks 中,例如用戶程序生成了a.o 和b.o, 則makefile 中加入:LIB_EXTRA = usrAPI/a.o usrAPI/b.o,同樣修改usrRoot()函數(shù),并在 usrConfig.c 程序開(kāi)始添加外部函數(shù)聲明:extern 函數(shù)類(lèi)型 函數(shù)名(參數(shù)??) 或者直接制作一個(gè)usrAPI.h,在這個(gè)文件中用上面的形式聲明所有出現(xiàn)在這些.o 中的函 數(shù),然后再需要使用到這些函數(shù)的文件頭部都加上#include “usrAPI/usrAPI.h”。這種方法更有 利于程序的規(guī)劃整齊,并且有助于日后察看函數(shù)的使用形式。 最后運(yùn)行已經(jīng)制作好的makeAll.bat,生成的vxWorks 已經(jīng)包含自啟動(dòng)的用戶程序了。 3) 基于動(dòng)態(tài)鏈接的自啟動(dòng)vxWorks 制作 動(dòng)態(tài)鏈接使用.a 文件。同樣制作usrAPI 目錄并拷貝.o 文件,然后在此目錄下建立批處理 文件makeA.bat。內(nèi)容如下: 首先是設(shè)定環(huán)境變量: set WIND_HOST_TYPE=x86-win32 set WIND_BASE=C:\Tornado set PATH=%WIND_BASE%\host\%WIND_HOST_TYPE%\bin;%PATH% 然后使用ar 工具將所有.o 加入到一個(gè)檔案庫(kù)文件usrAPI.a 中。需要說(shuō)明的是:arppc 是因 為我采用的bsp 是powerpc 類(lèi)型的,別的cpu 類(lèi)型也類(lèi)似。 arppc -crusv usrAPI.a a.o b.o 接下來(lái)類(lèi)似于靜態(tài)鏈接的.o 方式,建立usrAPI.h 并在需要的文件中引用。 最后在makefile 中加入LIB_EXTRA = usrAPI/usrAPI.a,運(yùn)行makeAll.bat 生成vxWorks。 4. 不同鏈接方法的對(duì)比 基于.c 的鏈接方法將所有用戶編寫(xiě)的源程序保留在BSP 文件夾中,移植時(shí)不利于程序的 版權(quán)保密。而在不同BSP 之間用戶程序的移植更是不方便,雖然這種方法不需要對(duì)makefile 進(jìn)行任何改動(dòng),修改的只是.c 文件,比較容易理解,但仍然不推薦使用。 基于.o 的鏈接方法保留了全部的的測(cè)試函數(shù)接口,并且移植時(shí)提供編譯過(guò)的.o 文件也比 提供源代碼.c 文件利于保密。用戶源程序和BSP 源程序分開(kāi),文檔結(jié)構(gòu)整齊,特別是對(duì)源程 序比較龐雜的時(shí)候,使用庫(kù)文件.o 或者.a 更加有利于文件管理。 基于.a 的鏈接方法只保留必要的函數(shù)接口,自動(dòng)優(yōu)化了vxWorks 的文件大小,因此將對(duì) 單板的flash大小要求降到最低。這種方法同時(shí)使用戶程序在不同BSP間的移植變得非常簡(jiǎn)單。 對(duì)于一個(gè)新的BSP,所需要的就是把usrAPI 目錄和makeA.bat 整個(gè)拷貝過(guò)去,用基于這個(gè)BSP 類(lèi)型的編譯方法制作.o 文件覆蓋usrAPI 目錄下的.o,拷貝原BSP 中makefile 中LIB_EXTRA = usrAPI/usrAPI.a 到新BSP 目錄下的makefile 中,使用原BSP 中usrConfig.c 和bootConfig.c 中 的autoboot()函數(shù)和usrRoot()函數(shù)結(jié)尾覆蓋新BSP 中相應(yīng)的部分,最后運(yùn)行makeA.bat 和 makeAll.bat,就將用戶程序完全移植了。全部移植工作只是一些文件和代碼的復(fù)制以及批處 理文件的運(yùn)行,十分方便。如果需要將新的.o 加入檔案庫(kù)文件,也只需要拷貝此文件到usrAPI 目錄,在makeA.bat 中的arppc -crusv usrAPI.a a.o b.o 后面加上這個(gè)新的.o,然后在運(yùn)行一次 makeA.bat 就可以了。 唯一需要注意的是,如果在生成了bootrom 和vxWorks 之后,希望通過(guò)更新.o 來(lái)更新 vxWorks 中包含的用戶程序,不僅需要重新運(yùn)行makeA.bat 重新usrAPI.a,還需要在命令行下 輸入make clean,將vxWorks 和bsp 目錄下(不含子目錄,因此用戶程序生成的.o 程序不受影 響)所有的*.o、*.rpo、vxWorks*、bootrom*、stdt.c、symTbl.c 和depend.[bspName]刪除,然 后運(yùn)行makeA.bat。因?yàn)榫幾g時(shí)會(huì)自動(dòng)檢查bootrom 和vxWorks 的存在以及原BSP 目錄下文 件有沒(méi)有改變,如果沒(méi)有改變,則認(rèn)為沒(méi)有重新編譯的必要。這樣運(yùn)行makeA.bat 不會(huì)更新 bootrom 和vxWorks,而使用make clean 之后,系統(tǒng)檢測(cè)不到bootrom 和vxWorks 的存在,就 會(huì)重新編譯了。如果覺(jué)得在命令行下輸入太麻煩,希望每次都強(qiáng)制更新,只需要在makeAll.bat 程序最開(kāi)始加上一行make clean 就可以了。 5. 總結(jié) 本文介紹了vxWorks 操作系統(tǒng)的軟件制作方法,分別總結(jié)基于.c 的靜態(tài)鏈接、基于.o 的 靜態(tài)鏈接和基于.a 的動(dòng)態(tài)鏈接編譯方法,并比較了各自的優(yōu)劣。著重推薦了基于檔案庫(kù).a 的 動(dòng)態(tài)鏈接編譯方法,應(yīng)用該方法使文檔管理方便、最終軟件大小被優(yōu)化到最小、并且十分有 利于用戶程序在不同BSP 間的移植,十分適用于制作結(jié)合用戶程序的自啟動(dòng)vxWorks |
|
來(lái)自: darkhero > 《我的圖書(shū)館》