境搭建完整指南)
1. 先聊聊這套老環(huán)境VxWorks 6.8與Workbench 3.2先說結(jié)論VxWorks 6.8搭配Workbench 3.2是一套“年紀不小但生命力極強”的開發(fā)組合。VxWorks本身是風河公司推出的實時操作系統(tǒng)在航空航天、工業(yè)控制、軌道交通、醫(yī)療器械、網(wǎng)絡設備這些對穩(wěn)定性要求極高的領域它已經(jīng)穩(wěn)定運行了幾十年。而Workbench 3.2是配套的集成開發(fā)環(huán)境基于Eclipse內(nèi)核做了深度定制負責代碼編輯、交叉編譯、鏡像構(gòu)建、目標機調(diào)試這一整條鏈路。很多剛接觸這個領域的朋友會覺得奇怪現(xiàn)在都什么年代了怎么還在學6.8這么老的版本答案很簡單就像很多工廠里還在用XP系統(tǒng)控制設備一樣嵌入式行業(yè)對“能用、穩(wěn)定、經(jīng)過驗證”的追求遠高于對“新版、花哨、功能多”的追求。VxWorks 6.8在內(nèi)核穩(wěn)定性、BSP支持范圍、編譯工具鏈成熟度上都經(jīng)過了十幾年的生產(chǎn)驗證國內(nèi)大量存量設備、科研項目、教學實驗平臺都跑在這套環(huán)境上。你去翻很多大學的嵌入式實時操作系統(tǒng)課程、研究所的項目文檔用的還是vxworks6.8和workbench3.2這對組合。這篇文章要解決的事情很直接從零開始把VxWorks 6.8和Workbench 3.2的開發(fā)環(huán)境完整搭起來跑通一個最簡單的“下載-運行-打印”閉環(huán)然后用工程實踐的方式理解VxWorks的核心開發(fā)流程。適合誰看剛被老師或領導安排“你去把VxWorks環(huán)境裝一下”的新人準備做畢業(yè)設計的學生以及想從應用開發(fā)轉(zhuǎn)到嵌入式底層開發(fā)的工程師。就算你以前完全沒碰過Eclipse沒寫過RTOS應用按照下面的步驟走也能把環(huán)境跑起來。2. 環(huán)境搭建前先把這些事想清楚2.1 安裝包與許可證繞不開的第一道坎和普通軟件的“下一步下一步”不同VxWorks的安裝包和許可是兩個獨立的東西。安裝包本身是一張DVD鏡像文件名一般類似Wind River VxWorks 6.8之類的ISO里面包含Workbench IDE、交叉編譯工具鏈、BSP源碼、文檔和示例工程。你需要事先準備好虛擬光驅(qū)軟件或者解壓工具推薦直接用WinMount或者PowerISO掛載ISO比解壓更省事因為安裝程序?qū)獗P路徑的識別更穩(wěn)定。許可證這塊要特別說清楚因為頭一回裝的人十個有八個卡在這里。VxWorks 6.8的許可模式是“許可證服務器 客戶端”。也就是說你需要在一臺機器上運行Wind River License Server服務把獲得的.lic許可證文件加載進去然后Workbench啟動時會自動去這個服務器校驗。安裝包里面帶不帶許可證文件取決于你從什么渠道拿到的光盤。如果是商業(yè)采購風河會給你正式的許可文件和注冊碼如果是教學試用一般會提供帶有效期的評估許可。網(wǎng)上有各種關于“注冊機”“破解”的說法我強烈不建議走這條路——這套環(huán)境的安裝本來就夠磨人了許可問題搞得不干凈后面編譯調(diào)試還會出各種莫名其妙的幺蛾子。2.2 宿主機選擇為什么我勸你用Windows 7虛擬機VxWorks 6.8年代的Workbench 3.2官方支持的操作系統(tǒng)是Windows XP、Windows Vista、Windows 7。雖然它在Windows 10/11上也能裝但你會發(fā)現(xiàn)一堆兼容性問題菜單顯示錯位、Target Server連接不穩(wěn)定、調(diào)試時斷時續(xù)甚至Eclipse界面直接白屏。所以我給所有新人的第一個建議是不要在你的主力Windows 10/11上直接裝老老實實開一個Windows 7 SP1的虛擬機x64版本。VMware Workstation或者VirtualBox都行虛擬機配置給2核CPU、4GB內(nèi)存、60GB硬盤就足夠。Windows 7虛擬機里安裝Workbench 3.2運行效率、連接穩(wěn)定性、調(diào)試體驗比在Windows 10/11上強太多。我這幾年幫人排查環(huán)境問題相當一部分“連不上目標機”“編譯崩潰”的案例最后發(fā)現(xiàn)都是宿主機版本不匹配導致的。如果你實在不想用虛擬機那至少要做到兩點安裝路徑不要有中文和空格推薦C:\WindRiver安裝完成后把Workbench的快捷方式屬性里“兼容模式”設為Windows 7并以管理員身份運行。實測下來能減少大部分崩潰問題。2.3 安裝路徑與目錄規(guī)劃不然后面有你受的Workbench 3.2基于Eclipse 3.x內(nèi)核對路徑的“潔癖”很重。路徑一旦包含中文、空格、特殊符號編譯時會直接報一堆找不到頭文件的錯誤排查起來極其痛苦。我見過有人把WindRiver裝在D:\我的軟件\Wind River下面結(jié)果Boot Loader工程一編譯就是幾百個錯誤改路徑重裝才解決。規(guī)劃建議是主安裝目錄C:\WindRiver工作空間C:\WindRiver\workspace許可證服務器安裝目錄C:\WindRiver\license安裝程序默認會帶上但單獨建目錄便于管理另外注意Windows 7下C:\Program Files這類目錄有UAC權(quán)限問題Workbench寫文件時可能被攔截所以寧可用根目錄下的自定義目錄省得后面各種“Permission denied”。安裝時如果殺毒軟件在運行也建議暫時退出VxWorks安裝包里有大量底層工具和驅(qū)動容易被誤報。3. Workbench 3.2安裝實操一步步來別跳步3.1 主程序安裝選組件時別亂勾掛載ISO后運行安裝程序界面是典型的老式InstallAnywhere風格。前面幾步就是同意協(xié)議、填用戶名組織名沒有太多講究。真正需要注意的是組件選擇界面。Workbench 3.2的安裝組件按功能劃分比如Workbench IDE必選就是Eclipse殼VxWorks 6.8 Target Support必選包含目標機運行庫和BSPGNU編譯器工具鏈必選交叉編譯靠它Diab編譯器可選風河自家的編譯器商業(yè)許可另收費Documentation建議選上離線幫助文檔查起來方便Simulator必選VxSim仿真器就在這里你要是拿不準全選也沒問題就是多占幾個GB的磁盤空間。安裝過程大約20到40分鐘取決于機器性能。中途不要切出去干別的老安裝程序比較敏感最小化都會偶爾出錯。3.2 許可證服務器配置這個坑我一定要單獨拉出來講安裝接近尾聲的時候安裝程序會問你“是否安裝Wind River License Server”。第一次裝的人很容易忽略這一步或者出于“我只要開發(fā)環(huán)境”的心態(tài)直接跳過。然后等打開Workbench時發(fā)現(xiàn)新建工程、編譯下載全都灰著不能用提示License錯誤。正確的做法是在安裝向?qū)Ю锕催x安裝License Server。安裝完成后從開始菜單找到Wind River License Server的管理工具界面類似一個簡單的服務管理器。在這里你需要加載.lic許可證文件指定一個端口號默認27000然后啟動服務。要注意的是License Server運行后會在系統(tǒng)服務里生成一個WRLicenseServer服務。如果你重啟了虛擬機必須確認這個服務處于運行狀態(tài)再啟動Workbench。很多時候“Workbench打不開”“新建工程是灰的”都是這個服務沒啟動。提示如果Workbench提示連接License Server失敗先用瀏覽器訪問http://localhost:27000看服務是否響應不行就去Windows服務管理里手動啟動WRLicenseServer。3.3 首次啟動Workbenchworkspace與界面認知安裝完成并配上許可證后啟動Workbench。第一次啟動會彈窗讓你選擇workspace目錄這個目錄存的是你的工程文件和配置文件推薦放在C:\WindRiver\workspace勾選“Use this as the default and do not ask again”。進入主界面后你會看到非常典型的Eclipse布局左上Project Explorer、右側(cè)代碼編輯區(qū)、下方Console和Problems、左側(cè)Outline。如果你以前用過Eclipse開發(fā)Java或C/C上手沒有任何難度如果沒用過也不要緊記住三個關鍵位置Project Explorer看工程文件結(jié)構(gòu)所有源碼、配置、構(gòu)建文件都在這里Console編譯輸出、運行輸出、Target Shell交互都靠它Problems編譯錯誤警告列表雙擊可以直接跳到對應代碼Workbench默認的透視Perspective是“VxWorks開發(fā)”相關布局不用改默認就很順手。如果你發(fā)現(xiàn)界面上有很多帶“Target”字樣的視圖別慌那是連接目標機用的調(diào)試視圖后面跑VxSim時會用到。3.4 老Eclipse的內(nèi)存優(yōu)化不調(diào)真的會卡Workbench 3.2底層的Eclipse版本比較老默認內(nèi)存配置很低工程一多就卡得讓人崩潰。安裝目錄下有個workbench.ini文件用記事本打開找到-Xmx開頭的行默認可能是-Xmx256m直接改成-Xmx1024m有條件改到-Xmx2048m。同時確保-Xms設為128m避免啟動時反復分配內(nèi)存。改完之后重啟Workbench你會發(fā)現(xiàn)編譯大工程時的流暢度提升一個檔次。這個操作很多人不知道屬于典型的“老環(huán)境使用心得”實測下來效果非常明顯。4. 創(chuàng)建VxSim工程先把BSP和鏡像跑起來4.1 從Boot Loader工程開始理解BSPVxWorks的啟動流程大致是Boot ROM引導→加載VxWorks鏡像→啟動內(nèi)核→運行應用。在真實板卡上Boot ROM放在Flash里在開發(fā)階段我們用VxSim仿真器來代替這套流程。在Workbench里創(chuàng)建工程要先新建一個“VxWorks Boot Loader”工程。操作路徑是File → New → Project在類型列表里找到VxWorks相關的分類選擇Boot Loader工程。工程向?qū)屇氵xBSPVxWinSim或者VxSim for x86選對應x86的仿真BSP即可。BSP是VxWorks里一個非常高頻率出現(xiàn)的詞全稱Board Support Package板級支持包。它把CPU初始化、中斷控制器、定時器、串口、網(wǎng)卡這些硬件相關的東西都封裝了起來對上提供統(tǒng)一的接口。理解BSP基本上就理解了“VxWorks怎么適配一塊新板子”這件事。在仿真環(huán)境里VxSim就充當了“虛擬板子”的角色。Boot Loader工程創(chuàng)建后直接右鍵Build。編譯過程會調(diào)用GNU交叉編譯工具鏈生成bootrom相關的鏡像文件。第一次編譯會比較慢需要幾分鐘之后增量編譯就快了。編譯完成后在工程輸出目錄能看到bootrom_uncmp這樣的文件這就是Boot Loader鏡像。4.2 編譯VxWorks鏡像工程不是每個工程都能直接跑光有Boot Loader還不夠我們需要一個VxWorks操作系統(tǒng)鏡像。在Workbench里這個工程類型叫“VxWorks Image Project”。創(chuàng)建它的時候同樣要選擇BSP還是VxSim for x86然后會生成一個包含VxWorks內(nèi)核配置的工程。這個地方我要特別講一下“工程依賴”的概念。我們最終運行的應用要下載到目標機上而目標機上跑的是VxWorks鏡像。所以應用工程可下載內(nèi)核模塊DKM必須關聯(lián)到一個VxWorks鏡像工程編譯時才能拿到正確的頭文件和符號信息。Workbench里通過“Project References”來配置這個關聯(lián)后面創(chuàng)建DKM工程的時候要注意勾選。VxWorks鏡像工程創(chuàng)建完成后右鍵Build編譯產(chǎn)物是vxWorks這個文件。它是整個操作系統(tǒng)的二進制鏡像包含了內(nèi)核、驅(qū)動、文件系統(tǒng)、網(wǎng)絡協(xié)議棧等所有組件。編譯VxWorks鏡像還有一個隱藏的配置環(huán)節(jié)在工程屬性的“Build Properties”里可以裁剪組件——比如去掉不需要的網(wǎng)絡功能、文件系統(tǒng)或者添加調(diào)試組件。這玩意兒就是VxWorks最強大的地方之一模塊化裁剪想讓操作系統(tǒng)多小就能多小。新手階段不用動這些配置默認就行。4.3 啟動VxSim目標機從“沒有”到“在線”編譯好鏡像后啟動VxSim。在Workbench工具欄上有一個“Target”相關的下拉菜單選擇“Launch VxSim”或者類似選項。VxSim會在你的Windows上啟動一個獨立的仿真進程模擬一個跑著VxWorks的x86目標機。啟動VxSim后它會在后臺等待Target Server連接。Target Server是Workbench和目標機之間的一座橋負責下載鏡像、轉(zhuǎn)發(fā)調(diào)試命令、傳遞標準輸入輸出。首次連接Workbench會引導你創(chuàng)建一個Target Server配置關鍵參數(shù)是選擇目標機類型VxSim和通信方式默認WDB。配置完成后點擊連接過幾秒Target視圖里就會顯示目標機在線。這時候你在Workbench的Console里應該能看到VxSim的啟動日志類似VxWorks版本號、內(nèi)存大小、BSP名稱之類的信息。看到這行日志說明你的VxWorks系統(tǒng)已經(jīng)真正跑起來了。提示VxSim運行后不要手動關閉它的窗口否則Target Server會立刻斷連。我見過太多人連上后亂點把VxSim窗口關了然后跑來問“為什么Target Server時斷時續(xù)”。5. 跑通第一個DKM工程下載、運行、調(diào)試一條龍5.1 什么是DKM可下載內(nèi)核模塊DKMDownloadable Kernel Module是VxWorks 6.8里最常用的應用開發(fā)方式。它和普通Linux用戶態(tài)程序不同DKM是運行在內(nèi)核態(tài)的模塊擁有內(nèi)核的訪問權(quán)限編譯產(chǎn)物是.out文件通過Target Server下載到目標機的內(nèi)存中直接執(zhí)行。為什么開發(fā)應用要用DKM而不是直接編進VxWorks鏡像因為迭代快。鏡像是一次編譯整體燒錄的改一行代碼要重新編整個操作系統(tǒng)而DKM是動態(tài)加載的改完代碼重新編譯下載到目標機就能跑開發(fā)效率高得多。你在VxWorks上寫設備驅(qū)動、寫業(yè)務邏輯、寫控制算法絕大多數(shù)時候都在寫DKM。5.2 寫一個最小任務示例從zero到打印創(chuàng)建DKM工程File → New → Project選擇“VxWorks Downloadable Kernel Module”工程類型。向?qū)箨P聯(lián)一個VxWorks鏡像工程就是剛才編好的那個一定要勾上。然后新建一個C源文件比如demo.c寫一個最簡單的任務#include vxWorks.h #include stdio.h #include taskLib.h static void demoTask(void) { int count 0; while (1) { printf(VxWorks demo running, count %d\n, count); taskDelay(sysClkRateGet()); /* 延遲1秒 */ } } void demoStart(void) { taskSpawn(demo, 100, VX_FP_TASK, 20000, (FUNCPTR)demoTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); }這段代碼干了什么事taskSpawn是VxWorks創(chuàng)建任務的核心API參數(shù)分別是任務名、優(yōu)先級數(shù)值越小優(yōu)先級越高100是普通優(yōu)先級、任務選項、棧大小20000字節(jié)、函數(shù)入口以及最多10個參數(shù)。taskDelay讓任務暫停指定個數(shù)的系統(tǒng)時鐘周期sysClkRateGet()返回系統(tǒng)時鐘頻率即每秒多少個tick所以這里是延遲1秒。新手寫VxWorks代碼最常犯的錯有兩個一是棧開太小任務里一用printf這種吃棧的函數(shù)就棧溢出另一個是忘記用taskSpawn直接在初始化里寫while(1)死循環(huán)把整個系統(tǒng)卡死。記住VxWorks是RTOS所有業(yè)務邏輯都應該放在獨立任務里跑而不是在啟動函數(shù)里死等。5.3 編譯、下載、運行、調(diào)試寫好后右鍵工程Build編譯生成.out文件。然后在Target連接狀態(tài)正常的前提下右鍵demo.out選擇“Download to Target”把模塊下載到目標機內(nèi)存。下載完成后打開Workbench的Target Shell或者Console視圖輸入demoStart啟動任務。這里要注意DKM下載之后只是把代碼放到了目標機內(nèi)存里并不會自動執(zhí)行。你需要手動調(diào)用入口函數(shù)。Workbench的Target Shell里可以直接敲C函數(shù)名來調(diào)用就像在終端里執(zhí)行命令一樣。按下回車的一瞬間Console里會持續(xù)刷出VxWorks demo running, count 0之類的輸出??吹竭@個恭喜你整套VxWorks 6.8 Workbench 3.2環(huán)境從搭建到開發(fā)的全鏈路已經(jīng)徹底跑通了。調(diào)試的話Workbench支持源碼級調(diào)試。在代碼里打斷點右鍵demo.out選擇“Debug As”而不是“Download”它會進入調(diào)試模式和Eclipse調(diào)試Java的體驗幾乎一樣可以單步、看變量、看調(diào)用棧。VxWorks 6.8的WDB調(diào)試代理支持內(nèi)核態(tài)調(diào)試這對寫驅(qū)動的人來說簡直是救命的工具。6. 常見問題與排查技巧實錄6.1 安裝與許可問題速查現(xiàn)象常見原因解決思路Workbench啟動后新建工程菜單全灰License Server未啟動或許可無效啟動WRLicenseServer服務檢查.lic文件是否加載安裝過程中報“Permission denied”殺毒軟件攔截或UAC權(quán)限問題退出殺軟右鍵安裝程序以管理員身份運行Workbench啟動白屏或閃退Eclipse內(nèi)存不足或JDK不兼容修改workbench.ini加大Xmx確認使用安裝包自帶JRE編譯工程時報一堆“找不到頭文件”路徑含中文空格或工程未關聯(lián)鏡像工程重裝到C:\WindRiver檢查Project References下載DKM提示“No target available”Target Server未連接目標機確認VxSim還在運行檢查Target連接狀態(tài)6.2 編譯報錯不直觀從Build Console看真相Workbench的Problems視圖有時候會“謊報軍情”——顯示的錯誤不全或者跳轉(zhuǎn)位置不對。老Eclipse殼子的常見毛病。當你覺得編譯結(jié)果莫名其妙時一定要打開Console視圖切到“Build”標簽頁看完整的編譯輸出。真正的錯誤信息比如語法錯誤、未定義符號都在那里面比Problems視圖準確得多。GNU工具鏈的報錯格式一般是文件路徑:行號:列號: error: 描述照著這個格式去Console里搜索error:關鍵字一眼就能定位問題。6.3 運行時連接與調(diào)試問題運行階段的問題十個有七個出在Target Server連接上。我梳理了幾個高頻場景都實測驗證過第一VxSim成功啟動但Target Server連不上。先把防火墻關掉或者放行WorkbenchVxSim會占用某個端口和Windows通信防火墻經(jīng)常攔它。第二DKM下載成功但調(diào)用demoStart沒反應。檢查任務是否創(chuàng)建成功用Target Shell敲taskShow命令查看當前所有任務列表看看有沒有名為“demo”的任務。如果沒有說明taskSpawn參數(shù)有問題最常見的就是棧大小設太小任務創(chuàng)建直接失敗。第三printf輸出不顯示。先確認你看的是不是Target Console而不是本地的Console——VxSim上所有應用輸出都走Target Server轉(zhuǎn)發(fā)如果打印在Target上沒出現(xiàn)多半是Target Server的標準IO轉(zhuǎn)發(fā)配置沒打開回到Target Server的啟動參數(shù)里檢查“Enable I/O forwarding”選項。6.4 幾個讓我節(jié)省大量時間的避坑習慣每臺新環(huán)境裝完后立刻做一個干凈的虛擬機快照。以后環(huán)境搞壞了不用重裝直接回滾快照。修改工程配置前先備份.wpj和.wrm這類工程文件。Workbench的配置損壞恢復起來比重裝還麻煩。定期備份workspace目錄。Eclipse系列的workspace里有很多本地歷史記錄和工程狀態(tài)丟了很傷。在Windows 7虛擬機里把虛擬機的內(nèi)存鎖定、CPU分配調(diào)高一些VxSim和Workbench雙開時不至于卡死。7. 環(huán)境跑通之后學習路線與方向建議7.1 把WindShell當成你的朋友環(huán)境搭起來后很多人就急著寫任務、跑業(yè)務。但我更建議你先花時間把Target Shell也叫WindShell用熟。這是VxWorks最經(jīng)典的交互工具本質(zhì)是一個跑在目標機上的命令行解釋器直接敲命令就能和內(nèi)核交互。試試這些命令i查看所有任務狀態(tài)taskShow看任務詳細信息memShow查看內(nèi)存使用devs查看設備列表ls和cd操作文件系統(tǒng)。這些命令看起來簡單但能幫你建立對“正在運行的系統(tǒng)”的直覺。很多時候你寫代碼發(fā)現(xiàn)內(nèi)存泄漏第一反應就應該是用memShow看內(nèi)存趨勢。WindShell還支持直接調(diào)用C函數(shù)。你可以先用WindShell手動執(zhí)行一個函數(shù)確認行為正確再把它封裝成正式的任務函數(shù)。這種“先手動、后自動化”的開發(fā)方式在調(diào)試階段非常高效。7.2 用配置裁剪理解VxWorks的模塊化設計VxWorks一個極其重要的特性是組件可裁剪。一個完整的VxWorks鏡像可能幾MB但裁掉不需要的組件后可以做到幾百KB甚至更小特別適合資源受限的嵌入式場景。在Workbench的VxWorks鏡像工程里打開Build Properties的配置界面你會看到密密麻麻的組件列表內(nèi)核、POSIX接口、網(wǎng)絡協(xié)議棧、文件系統(tǒng)、USB、圖形庫等等。每個組件都可以勾選或取消。建議你嘗試在VxSim上裁剪掉文件系統(tǒng)和網(wǎng)絡組件重新編譯鏡像看看系統(tǒng)體積和啟動日志的變化。這個過程幫助你理解“操作系統(tǒng)由什么組成”這個底層問題。VxWorks不是一個固定的黑盒而是由大量組件拼裝出來的積木系統(tǒng)。哪些組件影響實時性哪些組件增加功耗哪些組件有依賴關系你只有親手裁剪過才知道。7.3 從仿真到真實板卡的過渡VxSim畢竟只是仿真它的實時性、中斷行為、外設模擬都和真實硬件有差距。等你在VxSim上把任務調(diào)度、信號量、消息隊列這些基礎概念玩明白之后一定要找一塊真實板卡練手哪怕是工控機、x86小板子甚至QEMU模擬的ARM環(huán)境。遷移到真實板卡的核心是BSP。工作內(nèi)容的重點從“寫應用”轉(zhuǎn)向“適配硬件”時鐘頻率的配置、內(nèi)存布局的規(guī)劃、串口驅(qū)動的移植、網(wǎng)卡驅(qū)動的綁定。在Workbench里創(chuàng)建新工程時選擇對應的BSP編譯燒錄然后跑起你之前在VxSim上寫好的任務代碼看看哪些能直接跑通哪些跟仿真環(huán)境不一樣。從仿真到板卡你會遇到中斷延遲不理想、任務切換抖動、外設驅(qū)動工作不正常這些真問題。這時候你才會真正理解VxWorks的價值不在API有多別致而在于它能給你多大的底層控制力——而這恰恰是Linux這類通用系統(tǒng)給不了的。我個人在實際項目里的體會是VxWorks這套東西入門曲線比Linux應用開發(fā)要陡但一旦把任務模型、內(nèi)存管理、BSP機制這幾個核心概念打通了你會發(fā)現(xiàn)RTOS的世界異常清晰。環(huán)境搭建只是萬里長征第一步但這一步穩(wěn)了后面的路就好走了。最后再分享一個小技巧以后凡是遇到Workbench行為怪異的問題先重啟License Server和Target Server再重啟Workbench別急著卸了重裝——這招能解決掉一半的靈異事件。