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