環(huán)境搭建實戰(zhàn)指南(含踩坑記錄))
如果你剛拿到一臺下一個老項目的維護任務大概率會遇到這套組合VxWorks 6.8 加 Workbench 3.2。說句實話在 2024 年的今天這套工具鏈已經(jīng)屬于爺爺輩了——它大概是 2011 年前后的產物官方支持的主機系統(tǒng)還是 Windows XP 和 Windows 7。但存量市場擺在那里航空航天、國防、電力控制、軌道交通、工業(yè)機器人一大批已經(jīng)跑穩(wěn)定了的設備還在用 VxWorks 6.8。新人接手的第一關往往是把開發(fā)環(huán)境搭起來。這篇文章就是圍繞這件事寫的從零開始搭建 VxWorks 6.8 與 Workbench 3.2 的開發(fā)環(huán)境把環(huán)境模型講清楚把安裝、License、建工程、編譯、跑模擬器、下載 hello world 這條鏈路完整走一遍最后把我這些年遇到的高頻坑位和排查思路整理出來。適合剛接觸 VxWorks、需要維護老項目、或者純粹想搞明白這套環(huán)境到底怎么轉起來的嵌入式工程師。1. 這個組合的價值為什么要折騰 VxWorks 6.8 與 Workbench 3.21.1 VxWorks 在嵌入式江湖中的位置VxWorks 是個實時操作系統(tǒng)它的強項是確定性任務調度、中斷響應、內核服務都帶著可預測的時序再加上風河多年的商用操作系統(tǒng)生態(tài)讓它成了高可靠場景的老牌選擇。很多飛行器、導彈、艦載設備、電力保護裝置里面跑的就是 VxWorks。這類設備生命周期極長可能出廠十年八年還在服役于是老版本 VxWorks的需求并不會消失反而隨著新人入場不斷出現(xiàn)。Workbench 3.2 就是配套 VxWorks 6.x 的集成開發(fā)環(huán)境底層是 Eclipse 那一代框架但風河做了大量改造加入了工程管理、交叉編譯、Target Server 連接、調試器、內核級查看工具。它跟現(xiàn)在大家習慣的 VS Code 那種輕量 IDE 完全是兩回事更像是一個重武器所有和 VxWorks 相關的操作都被塞進同一個工具里了。1.2 為什么是 6.8 這個版本VxWorks 6.x 系列里6.8 算是比較成熟的收官版本。它引入并完善了 RTPReal Time Process用戶態(tài)進程機制和老的 5.x 那種所有代碼都塞進內核的玩法相比多了一層隔離。同時它的組件化配置已經(jīng)非常成熟內核裁剪、功能開關都能在 Workbench 里點出來。還有一個現(xiàn)實原因是很多老項目的 BSP、驅動、應用代碼都是基于 6.8 開發(fā)的升級到 VxWorks 7 是大工程BSP 結構變了、構建系統(tǒng)也變了沒幾個項目經(jīng)理愿意承擔這種風險。所以 6.8 的學習價值不僅僅是學新知識更多的是能看懂現(xiàn)網(wǎng)設備里跑的到底是什么。1.3 你需要的準備和預期搭這套環(huán)境你需要準備的東西不算多但有一點心理建設要先做好這套老工具對現(xiàn)代硬件的兼容性并不好所以大概率要開一臺虛擬機。我建議立刻確認三件事一是拿到 Workbench 3.2 的安裝包ISO 或者 DVD 都行二是拿到對應這套工具的 License不管是正版授權文件還是公司內部 License Server 地址三是確認你目標板卡對應的 BSP沒有 BSP 光有環(huán)境也沒法上板。這篇文章的路徑是宿主機 虛擬機 VxSim 模擬器先跑通再給你留出替換成真實目標板卡的接口。從零到能把鏡像編出來、能下載內核模塊跑起來完成這個目標大概需要半天到一天取決于你對老工具鏈的熟悉程度。2. 動手之前先把環(huán)境模型裝進腦子2.1 宿主機、目標機、工具鏈之間的關系很多人第一次接觸 VxWorks 環(huán)境會被一堆名詞繞暈Host、Target、BSP、VIP、DKM、Target Server、WDB、VxSim。其實它們之間的關系特別簡單就三塊宿主機Host你面前這臺開發(fā)電腦安裝 Workbench 3.2負責編輯代碼、交叉編譯、下載、調試。目標機Target真正運行 VxWorks 系統(tǒng)的設備可以是工控板、單板機、或者一個模擬器程序。工具鏈Toolchain交叉編譯器跑在宿主機上編譯出能在目標機上運行的代碼。VxWorks 6.8 默認用的是 GNU 工具鏈按目標 CPU 架構區(qū)分比如 x86、PowerPC、ARM、MIPS。它們之間的通信由 Target Server 負責。Target Server 是跑在宿主機里的一個服務進程它通過 WDB 協(xié)議跟目標機上的 Target Agent 通信實現(xiàn)下載模塊、啟動任務、讀寫內存、調試這些能力。你可以把它理解成宿主機 IDE 和目標機系統(tǒng)之間的橋梁。2.2 BSP 是什么為什么它決定后續(xù)一切BSPBoard Support Package是板級支持包。VxWorks 鏡像要能在一款板卡上起來必須知道怎么初始化 CPU、訪問內存、配置串口、網(wǎng)口等這些都在 BSP 里。官方安裝包里自帶一批 BSPx86 系列比如 Pentium4PowerPC 系列比如 mvme5500ARM 系列還有專門給模擬器用的 VxSim BSP。每個 BSP 都有配套的 config.h、sysLib.c、romInit.s 這些文件分別定義內存布局、時鐘、驅動配置、啟動入口。選擇 BSP 是搭建環(huán)境的第一步因為你后面所有鏡像工程的屬性都掛在 BSP 上。選對了編譯出來的鏡像能引導選錯了整個過程都會在目標機起不來的階段反復折騰。初學階段用 VxSim 模擬器對應的 BSP 最省心它可以繞開真實硬件。2.3 License、安裝包和目錄規(guī)劃Wind River 的授權機制用的是 FLEXlm 體系。授權方式主要有兩種本地 License 文件一個 .lic 文本文件或者指向一臺 License Server。環(huán)境變量WIND_LICENSE_FILE決定了 Workbench 去找哪個 license常見值是類似C:\WindRiver\license\license.lic或者170010.0.0.5這種 server 地址。安裝目錄規(guī)劃是一個特別值得提前注意的點整個安裝路徑絕對不能有中文也不建議放在帶空格的目錄比如 C:\Program Files因為 VxWorks 的構建腳本是 make 文件體系對路徑空格非常敏感。通常大家會直接裝在C:\WindRiver這種路徑下干凈利落。2.4 虛擬機方案讓老工具跑在現(xiàn)代硬件上Workbench 3.2 官方支持的是 Windows XP 和 Windows 7越老的系統(tǒng)反而跑得越穩(wěn)。如果你的主力機器是 Windows 10/11直接裝一定會遇到各種詭異問題最典型的就是安裝程序不兼容、激活時 FlexLM 服務起不來。我的建議是直接上虛擬機。VMware Workstation 或者 VirtualBox 都行。我給一個參考配置項目建議值說明客戶機系統(tǒng)Windows 7 32/64 位兼容性好內存管理比 XP 強CPU 核數(shù)2 核即可VxSim 不需要太多核內存2~4 GB虛擬機內跑 Workbench 和 VxSim 夠用磁盤40 GB安裝完 Workbench 約 10 GB后面工程會膨脹網(wǎng)絡橋接模式如果后續(xù)要連接真實目標板建議橋接快照安裝完成后打快照老工具經(jīng)不起折騰快照是后悔藥有一類問題要注意虛擬機本身有定時精度問題VxSim 模擬出的時間可能偶爾不準但這不影響學習。真正要核對的是網(wǎng)卡類型盡量選 e1000 或 VMXNET3后面 Target Server 通過網(wǎng)口連目標機時能少出毛病。3. 完整安裝與許可證聯(lián)調一次裝對的步驟清單3.1 Workbench 3.2 安裝過程安裝包拿到手后進入安裝流程我按實際能落地的順序寫一遍把 Workbench 3.2 的 ISO 掛載到虛擬機光驅進入根目錄找到 setup.exe管理員權限運行。安裝程序會進入 InstallShield 界面先選擇語言和安裝類型。這里強烈建議選自定義安裝不要無腦全選。到了組件選擇頁面你會看到一堆可選項。其中跟 VxWorks 直接相關的是 VxWorks 6.8 和 Workbench 兩大部分下面還能按 CPU 架構勾選目標支持。學習階段只勾 x86 和 VxSim 相關支持就夠了PowerPC/ARM 等后續(xù)有板卡需求再補裝能省不少時間和磁盤。設置安裝路徑我按前面說的用C:\WindRiver這種無空格路徑。安裝過程會跑挺久尤其是最后一兩步在配置 Eclipse 環(huán)境和注冊工具鏈的時候看起來像卡住了實際上在動耐心等。安裝完成之后建議檢查安裝根目錄下的結構C:\WindRiver\vxworks-6.8是 VxWorks 6.8 本體里面有 target 目錄target 下面是 config、lib、src 這些子目錄C:\WindRiver\workbench-3.2是 IDE 本體。這個結構認識一下后面很多路徑問題都要回到這里找答案。3.2 配置 Wind River License這一步是環(huán)境搭建的分水嶺License 配不好后面建任何工程都會在中途彈窗報錯。順序是這樣的找到你的 License 文件確認后綴是 .lic。如果是 License Server 授權先確認服務器地址和端口比如1700192.168.1.100。在 Windows 系統(tǒng)環(huán)境變量里新建WIND_LICENSE_FILE把 license 文件路徑或 server 地址填進去。首次啟動 Workbench 3.2它會讓你指定 workspace 路徑。這個路徑同樣別用中文我一般放在D:\wr_ws。在 Workbench 菜單欄打開Window - Preferences - Wind River - License確認 License 路徑已經(jīng)正確加載。這里的輸出看起來像一行普通配置但它決定了所有下游操作。如何驗證 License 是否真的有效最靠譜的不是看界面而是直接新建一個最小 VIP 工程并嘗試編譯編譯過程會校驗 license如果輸出窗口出現(xiàn)License error、Feature checkout fail之類的關鍵字說明 License 還是沒對上。3.3 驗證安裝啟動編譯一個最小工程新建最小工程這一步其實就是驗證環(huán)境的最終手段具體操作在下一節(jié)展開。先說明驗收標準新建一個 VxWorks Image Project選擇 x86 或 VxSim 對應的 BSP默認組件配置直接編譯能在工程輸出目錄下生成vxWorks文件那你的安裝和 License 就算徹底通了。如果你在編譯剛開始就報一堆Fatal error, cannot find ...不要慌先看是不是 License 環(huán)境變量沒生效——很多時候修改完環(huán)境變量需要重啟 Workbench 甚至重啟虛擬機才會加載。4. 創(chuàng)建 VxWorks 鏡像工程讓系統(tǒng)在模擬器上先轉起來4.1 三種工程類型的邊界Workbench 3.2 里最常用的工程類型有三種它們的邊界必須搞清楚工程類型產出物運行位置典型用途VxWorks Image ProjectVIPvxWorks 鏡像文件目標機啟動時加載生成目標系統(tǒng)本體Downloadable Kernel ModuleDKM.out 文件下載到目標機內核地址空間內核模塊、驅動、任務代碼調試Application 工程RTP.vxe 文件下載到目標機用戶態(tài)進程VxWorks 6.x 用戶態(tài)應用學習路徑里VIP 是第一步DKM 是第二步。因為 DKM 需要先有一個跑起來的 VxWorks 系統(tǒng)你才能把模塊下載進去。4.2 選擇 BSP 與 CPU 型號打開 Workbench執(zhí)行File - New - VxWorks Image Project或者直接在 Project Explorer 里右鍵新建進入向導。給它取個名字比如vxWorks_demo然后到了最關鍵的一步選擇 BSP。如果你準備用 VxSim 模擬器跑就找名字里帶sim或vxsim的 BSP例如vxsim-win32具體名稱跟你安裝時勾選的架構有關。如果要用真實 x86 工控機選x86或Pentium4這類。接下來會讓你選擇內核類型常見的是Uniprocessor和SMP。初學階段選Uniprocessor少一層復雜度和不確定性真要在多核板卡上跑再單獨研究 SMP 版本。4.3 組件配置與編譯工程創(chuàng)建完后Workbench 會顯示一個 Components 配置視圖默認加載的是一套開發(fā)型組件集已經(jīng)包含了不少基礎服務但不是全量的。這里我列出初學階段最需要注意的組件INCLUDE_SHELL對應 VxWorks 內核 Shell啟動后能在控制臺敲命令。調試階段沒有 Shell 會非常痛苦。INCLUDE_WDBWDB Target Agent宿主機的 Target Server 能不能連上目標機就看它有沒有編進去。INCLUDE_NETWORK 系列網(wǎng)絡協(xié)議棧相關如果后續(xù)要網(wǎng)口通信必須確認打開。INCLUDE_STANDALONE 這類代表系統(tǒng)引導方式一般不手動改保持默認。組件配置不是隨便勾的VxWorks 6.x 組件之間存在依賴關系你打開 A 組件如果 A 依賴 B編譯器會要求 B 也出現(xiàn)在配置里。Workbench 通常能自動處理大部分依賴但偶爾也會出現(xiàn)undefined symbol或者編譯中途停止的情況那時就要回頭檢查組件依賴樹。配置完后右鍵工程 -Build Project。第一次編譯可能要等幾分鐘因為要生成 BSP 相關的目標文件。編譯輸出日志在 Console/Output 窗口最后能在工程的default目錄下看到著名的兩個產物文件bootrom引導程序和vxWorks內核鏡像。4.4 用 VxSim 模擬器把鏡像跑起來拿到 vxWorks 鏡像之后最直觀的驗證方式是啟動 VxSim。在 Workbench 的 Target 相關菜單里可以新建一個 Target Server 配置連接類型選擇 VxSim然后啟動。它會拉起一個模擬目標機進程加載你編譯好的鏡像之后模擬機會輸出內核啟動日志一路顯示到 Shell 就緒。這個時候其實你已經(jīng)完成了環(huán)境搭建的第一個里程碑能編譯、能啟動、能看見運行輸出。很多初學者卡在編譯不了或不知道編譯完怎么算成功到這里至少心里有底了。5. Hello World 與 Target Server 聯(lián)調從能編譯到能調試5.1 DKM 工程怎么建鏡像跑起來之后下一步是編譯一個可以下載到目標機運行的內核模塊。在 Workbench 里新建工程選擇Downloadable Kernel Module給工程起名hello_dkm然后添加一個源文件hello.c#include vxWorks.h #include stdio.h void helloInit(void) { printf(hello from vxworks\n); }注意函數(shù)名不要叫main內核模塊沒有 main 入口。把它編譯成hello.out這個文件就是 DKM 成品。5.2 配置 Target Server 連上目標機Target Server 是宿主機側的關鍵服務。在 Workbench 的 Target Server 視圖里新建配置連接類型依賴你自己選擇的方式如果用了 VxSim就選 vxsim 連接如果后面接真實目標板選網(wǎng)絡連接并填目標板 IP。配置時要注意 Target Server 的啟動參數(shù)里是否指定了正確的 WDB 端口和目標機 IP。VxSim 場景下大多數(shù)默認值就能工作真實板卡場景下目標機上的 WDB 網(wǎng)絡配置IP、端口、target agent 的啟動參數(shù)和宿主機 Target Server 的配置必須一一對應。連接建立成功后Target Server 視圖的狀態(tài)會變成 connected。此時 Workbench 已經(jīng)能夠和目標機內核交互。5.3 下載、運行并查看輸出下載 DKM 有以下常見方式右鍵工程里的hello.out選擇Target - Download File這個操作會把模塊加載到目標機內核地址空間但還沒有啟動函數(shù)。打開 Kernel Shell 視圖也就是 Workbench 里的 WindSh在里面執(zhí)行l(wèi)d hello.out這個命令會把文件加載到內核。加載之后調用函數(shù)helloInit如果一切正常Target Console 或者 Kernel Shell 的輸出窗口會打出hello from vxworks。如果沒有任何輸出先別急著懷疑代碼。按照排查順序看Target Server 是不是真的連接成功模塊是不是真的加載了可以用lkup命令查模塊列表以及 printf 的輸出是不是被 console 重定向到了別的地方。5.4 為什么這套聯(lián)調邏輯值得花時間弄明白Hello World 簡單但背后跑通的是一條完整鏈路交叉編譯 - 鏡像啟動 - 目標機系統(tǒng)就緒 - 宿主機通過 WDB 通信 - 模塊加載 - 函數(shù)調用 - 輸出回傳。這條鏈路正是你后面所有開發(fā)工作的主心骨。后面寫驅動、調任務、查內存全都走這條路。在這里多花時間后面會省大量排查時間。6. 高頻踩坑記錄與排查思路6.8 時代的老朋友6.1 License 相關坑位我見過最多的問題是License not found或者Feature expired。這類問題有一個共性套路不是 license 壞了是路徑配錯了。排查鏈路確認環(huán)境變量WIND_LICENSE_FILE是否被正確設置命令行執(zhí)行echo %WIND_LICENSE_FILE%查看。確認 license 文件里的服務器 IP、端口是否可達如果是 License Server用 ping 或者 telnet 測試 1700 端口是否通。檢查系統(tǒng)時間。FLEXlm 的 license 對時間非常敏感系統(tǒng)時間往回撥哪怕一分鐘都可能直接失效。最后確認 license 里的 hostid 是否和當前機器 MAC 匹配很多企業(yè)授權是綁定網(wǎng)卡的。還有一種隱藏問題Windows 7 虛擬機的網(wǎng)卡 MAC 地址在多次掛起/恢復后發(fā)生變化導致 hostid 對不上。這種情況在虛擬機設置里固定網(wǎng)卡 MAC 地址即可。6.2 Target Server 連不上連接失敗可以分三層來查Target Server 服務本身有沒有起來看 Workbench 里 Target Server 狀態(tài)如果紅色 disconnected先重啟服務看日志。WDB 通信鏈路通不通VxSim 場景下檢查模擬機是否真正啟動真實板卡場景下在宿主機 ping 目標板 IP確認鏈路通。組件配置對不對目標系統(tǒng)里沒編入 INCLUDE_WDB或者 WDB 網(wǎng)絡端口沒配置宿主機再努力也連不上。這種問題只能回到內核鏡像重新配置組件、重新編譯、重新啟動目標系統(tǒng)。在實際調試里我還碰到過防火墻把 WDB 端口攔掉的情況尤其 Windows 新版本默認防火墻策略比較嚴。給 Workbench 進程加一條放行規(guī)則問題就消失了。6.3 編譯相關坑位VxWorks 6.8 的編譯體系對路徑和文件名的要求比現(xiàn)代工具鏈苛刻得多。高頻報錯和對應解法報錯癥狀常見根因處理方式cannot open source file vxWorks.h頭文件搜索路徑?jīng)]配上檢查工程屬性里的 include path是否指向target/hUnknown type name一堆報錯沒加對應頭文件或宏定義確認 CPU 宏和工具鏈宏是否一致中文路徑導致編譯亂碼源碼文件路徑含中文把所有文件挪到純英文路徑No rule to make targetmake 依賴關系被打亂干凈重編譯Clean 后重新 Build工具鏈找不到安裝時未勾選對應架構支持回安裝程序補裝架構支持編譯報錯時要先看輸出日志的最前面一行一行往上翻。Workbench 的編譯日志默認不會高亮真正的首個錯誤經(jīng)常是后面的錯誤淹沒了前面的根因。6.4 VxSim 與虛擬機的坑VxSim 在虛擬機里跑本質是虛擬機里跑模擬器對資源有些要求。如果遇到 VxSim 啟動后界面沒有反應、內核日志停在啟動早期我的經(jīng)驗是優(yōu)先檢查虛擬機的 CPU 配置是否開啟了虛擬化引擎以及內存是否足夠。VxSim 鏡像加載需要的內存并不小給虛擬機 2GB 以上比較穩(wěn)。另外VxSim 的網(wǎng)絡模式依賴宿主機網(wǎng)絡環(huán)境。如果你用 NAT 模式VxSim 的網(wǎng)絡設備可能工作不正常改成橋接模式常常立刻見效。7. 環(huán)境跑通之后接下來怎么學7.1 補上 VxWorks 內核的基本功Hello World 只是起點。你接下來要面對的是 VxWorks 的內核編程模型和 Linux 用戶態(tài)編程完全是兩個世界。我建議按這個順序打基礎任務taskSpawn、taskDelete、taskPrioritySet理解優(yōu)先級搶占調度和時間片輪轉。同步與互斥semBCreate、semMCreate、semTake、semGive這是多任務編程的核心。消息隊列msgQCreate、msgQSend、msgQReceive理解任務間數(shù)據(jù)傳遞。中斷intConnect、中斷服務程序寫法注意中斷里不能調用可能阻塞的服務。看門狗wdStart理解定時回調機制??磿臅r候你會發(fā)現(xiàn) VxWorks 的 API 特別老派全是前綴縮寫但恰恰因為這種穩(wěn)定老項目的代碼才那么容易一眼看懂。7.2 從模擬器走向真實板卡模擬器只能幫你驗證邏輯真實板卡的難點在于 BSP 和驅動。VxWorks 6.8 的 BSP 目錄在target/config下每個 BSP 包含啟動代碼romInit.s、板級初始化sysLib.c、配置頭文件config.h。理解 BSP 的方法是打印它的啟動流程CPU 上電執(zhí)行 ROM 啟動代碼。初始化最小硬件環(huán)境時鐘、串口。解壓并搬移 vxWorks 鏡像到內存。內核啟動執(zhí)行usrInit、usrKernelInit等 C 初始化例程。進入usrRoot創(chuàng)建系統(tǒng)任務最終啟動 Shell。這份流程在《VxWorks BSP Developers Guide 6.8》里寫得很清楚對照你自己的 BSP 看一遍收獲會非常大。7.3 別急著升級先把老代碼讀透環(huán)境跑通之后我特別想提醒一句你手上很可能有一堆歷史代碼。先別覺得老代碼丑VxWorks 6.8 時代的代碼風格和現(xiàn)在的嵌入式代碼風格差異很大里面蘊含了大量對硬件時序、中斷處理的經(jīng)驗。把老代碼讀懂的過程其實就是對系統(tǒng)理解加深的過程。7.4 學習資料怎么選就我自己的經(jīng)驗最正經(jīng)的資料就是風河官方文檔。VxWorks 6.8 對應的 Programmers Guide 系列包括 Kernel Programmers Guide、BSP Developers Guide、Application Programmers Guide這三本足夠啃很久。網(wǎng)絡上有不少論壇和舊帖子還在討論 VxWorks 6.8 的問題雖然發(fā)布時間早但技術內容依然有效。最后分享一個我自己的習慣每次搭完這套環(huán)境我都會在同一臺虛擬機里打一個干凈快照再把 License 文件、安裝包 ISO、常用腳本一并歸檔到一個固定目錄。原因很簡單老工具鏈太脆弱誰也不能保證哪次操作把系統(tǒng)搞壞。有了快照十分鐘就能恢復到可用的基線狀態(tài)這比任何教程都管用。另外我習慣給每個目標板卡單獨建一個 BSP 備份目錄把被改動過的 config.h、sysLib.c 等文件統(tǒng)一管理。VxWorks 6.8 的 BSP 改動很容易被覆蓋而這個版本又沒有特別好的版本管理工具配合手動備份成本不高但關鍵時刻能救命。環(huán)境搭建這件事做一次是踩坑做三次就變成熟練工了。