關(guān)開發(fā)板實戰(zhàn):從嵌入式Linux到CAN FD與TSN)
說實話第一次看見這個板子的時候我的第一反應(yīng)是現(xiàn)在做嵌入式Linux的開發(fā)板已經(jīng)卷到車載網(wǎng)關(guān)級別了NXP這盤棋下得挺大直接把面向中央計算和域控制器的S32G SoC打包成一塊Networking Dev Kit再給你一套能跑Linux的完整BSP。上手之前你可能覺得它只是一塊“能跑Linux的ARM開發(fā)板”但真正把CAN FD、千兆車載以太網(wǎng)、TSN、PCIe這些外設(shè)全部拉起來之后你會發(fā)現(xiàn)它本質(zhì)上就是一臺把未來汽車中央網(wǎng)關(guān)搬上桌面的小型化實驗平臺。這塊板子最適合誰三類人。一類是做中央網(wǎng)關(guān)預(yù)研的系統(tǒng)工程師需要在Linux和AUTOSAR之間劃清邊界一類是做域控制器軟件平臺的Linux工程師要提前驗證多核調(diào)度、網(wǎng)絡(luò)加速、OTA升級鏈路還有一類是研究時間敏感網(wǎng)絡(luò)和車載通信協(xié)議棧的網(wǎng)絡(luò)工程師。如果你本來就在MCU網(wǎng)關(guān)的存量方案里掙扎想看看MPU網(wǎng)關(guān)到底能做到什么程度這篇文章也值得你花十分鐘看看我會把從BSP構(gòu)建、系統(tǒng)啟動到CAN和以太網(wǎng)實測的每一個坑都盡量寫清楚。1. 這塊板子要解決什么問題從分布式網(wǎng)關(guān)到中央計算1.1 汽車電子電氣架構(gòu)演進(jìn)為什么選S32G傳統(tǒng)汽車的電子電氣架構(gòu)是分布式的每個功能對應(yīng)一個ECU車門控制器、車窗控制器、BMS、VCU、T-Box各自為政通過CAN和LIN總線連起來。這種架構(gòu)最大的問題是線束多、算力分散、協(xié)同能力弱OTA升級更是噩夢——每升級一個控制器就要跑一遍整車的驗證流程。所以從大概2019年開始主流車廠都在做電子電氣架構(gòu)的集中化把幾十個ECU收縮成幾個域控制器再往上走就是中央計算加區(qū)域網(wǎng)關(guān)。S32G就是NXP針對這個趨勢做的旗艦產(chǎn)品它一顆芯片里面既要有大算力跑Linux應(yīng)用又要有實時的M7核跑AUTOSAR還要有硬件級網(wǎng)絡(luò)加速能力去處理幾十路CAN FD和大帶寬以太網(wǎng)流量同時還得滿足ISO 26262的功能安全要求。這也是為什么S32G跟i.MX系列有本質(zhì)區(qū)別。i.MX8也是一顆能跑Linux的SoC但你不能指望它去當(dāng)中樞網(wǎng)關(guān)。網(wǎng)關(guān)的核心工作是什么是報文搬運(yùn)。一臺現(xiàn)代智能汽車上的CAN FD報文總量每秒可能上千條以太網(wǎng)還有視頻流、點云數(shù)據(jù)、V2X消息如果所有的流量全部走到CPU中斷里讓內(nèi)核去處理再強(qiáng)的A53集群也會被打爆。S32G的思路是用專門的硬件引擎去處理數(shù)據(jù)面把CPU解放出來做策略面和應(yīng)用面這才是它敢叫“Networking SoC”的原因。1.2 Networking Dev Kit的定位一臺“能聯(lián)網(wǎng)的實驗室網(wǎng)關(guān)”NXP官方出的S32G Networking Dev Kit正式點的叫法是一塊評估板加一套軟件生態(tài)。它不像普通開發(fā)板那樣只有一顆SoC加幾個排針而是把S32G的通信能力盡可能完整地引出來。板子上通常有核心計算模塊加載板載板上集成了多路千兆RJ45以太網(wǎng)口、CAN FD接口、FlexRay引腳、PCIe Gen3插槽、USB 3.0、M.2接口可以插Wi-Fi或5G模組、MicroSD卡槽、調(diào)試串口還有標(biāo)準(zhǔn)的12V直流供電接口。這套硬件配置直接對應(yīng)的就是典型的中央網(wǎng)關(guān)部署場景以太網(wǎng)口用來連接域控制器和車聯(lián)網(wǎng)模塊CAN FD口用來連接傳統(tǒng)ECU節(jié)點PCIe可以外掛AI加速卡或高速存儲M.2接口做無線通信。在實驗室里你可以用這臺設(shè)備模擬整車網(wǎng)絡(luò)拓?fù)浒颜鎸岴CU、總線仿真工具、以太網(wǎng)節(jié)點全部接上來做聯(lián)調(diào)。你不需要為它專門設(shè)計一版驅(qū)動板NXP官方BSP已經(jīng)把大多數(shù)外設(shè)的Linux驅(qū)動都適配好了拿起來就能用。2. S32G SoC架構(gòu)深潛A53、M7、LLCE、PFE各司其職2.1 核心布局Linux跑在A53實時任務(wù)交給M7S32G SoC以S32G274A為代表型號的算力單元分兩大塊一塊是四核Cortex-A53處理器最高主頻1GHz帶有NEON SIMD指令集主要用來運(yùn)行Linux內(nèi)核、應(yīng)用層中間件、協(xié)議棧和網(wǎng)關(guān)策略管理另一塊是三顆Cortex-M7內(nèi)核其中兩顆以雙核鎖步Lockstep模式運(yùn)行負(fù)責(zé)功能安全相關(guān)的高實時性控制任務(wù)比如ASIL-D等級的網(wǎng)關(guān)監(jiān)控、安全校驗剩下的一顆M7可以跑一些非安全但延遲敏感的通信處理。這種異構(gòu)多核布局在汽車級SoC里非常典型。A53上有完整的虛擬內(nèi)存管理、文件系統(tǒng)、網(wǎng)絡(luò)協(xié)議棧適合跑復(fù)雜的軟件M7則追求確定性的實時響應(yīng)。你要理解的是Linux在這塊板子上并不能“獨(dú)占”所有資源它只是整個系統(tǒng)里的一部分M7核上可能跑著AUTOSAR或者跑著NXP提供的實時固件。開發(fā)早期你會覺得這種分工很麻煩但真正做量產(chǎn)項目時你會發(fā)現(xiàn)這恰恰是優(yōu)勢Linux崩潰了Safety域仍然可以接管車輛控制保證系統(tǒng)進(jìn)入安全狀態(tài)。芯片上還有最多4MB的片上SRAM可以靈活分配給不同核心使用。LPDDR4內(nèi)存雖然是掛在A53這邊的但在內(nèi)存控制器層面支持做硬件分區(qū)和訪問隔離這樣M7和A53之間可以考慮用共享內(nèi)存做核間通信設(shè)計思路上也更接近真實的異構(gòu)網(wǎng)關(guān)平臺。2.2 網(wǎng)絡(luò)加速引擎LLCE與PFE為什么是靈魂如果說A53和M7是S32G的大腦那LLCELow Latency Communications Engine和PFEPacket Forwarding Engine就是它的神經(jīng)網(wǎng)絡(luò)也是這芯片最值錢的地方。LLCE本質(zhì)是一組可配置的硬件通信微引擎專門處理低時延總線的收發(fā)和轉(zhuǎn)發(fā)。它能直接接管 CAN FD、LIN、FlexRay 這些傳統(tǒng)車載總線的數(shù)據(jù)收發(fā)在硬件層面完成幀過濾、掩碼匹配、ID路由、DLC校驗、周期消息發(fā)送、錯誤幀記錄和時間戳。比如你要把CAN0過來的某幾條報文轉(zhuǎn)發(fā)到CAN1傳統(tǒng)做法是CPU收到中斷后把數(shù)據(jù)搬進(jìn)內(nèi)存再從軟件層轉(zhuǎn)發(fā)出去如果報文量大CPU負(fù)載會直接失控。LLCE處理這種工作則是純硬件的CPU甚至感覺不到流量發(fā)生過。僅在需要特殊處理或者診斷網(wǎng)關(guān)策略時M7或A53才會介入。PFE則是以太網(wǎng)側(cè)的加速引擎針對的是車載以太網(wǎng)的數(shù)據(jù)包轉(zhuǎn)發(fā)。它支持多路10/100/1000M以太網(wǎng)MAC能夠做硬件路由、報文過濾、負(fù)載均衡甚至IPsec加解密卸載配合HSE這意味著原本Linux協(xié)議棧里需要消耗大量CPU周期的轉(zhuǎn)發(fā)計算可以被PFE直接扛下來。你可以在Linux里把PFE配置成硬件交換機(jī)模式或硬件防火墻模式數(shù)據(jù)面確定性大幅提升CPU占用率低到可以忽略。理解了這兩個引擎你就能明白為什么NXP敢把S32G的BSP里同時塞進(jìn)Linux和AUTOSAR還號稱是“軟件定義汽車”的基石。沒有硬件加速任何純軟件方案在整車總線的洪峰面前都是紙糊的。2.3 安全與功能安全HSE和鎖步M7智能汽車網(wǎng)關(guān)的另一個命門是安全。S32G內(nèi)置了HSEHardware Security Engine有一顆獨(dú)立的加密協(xié)處理器負(fù)責(zé)安全啟動、固件驗簽、密鑰存儲和管理、對稱非對稱加解密、真隨機(jī)數(shù)生成等。你在系統(tǒng)啟動時看到的Secure Boot校驗在OTA升級時做的鏡像簽名驗證在V2X通信中做的證書管理背后都是HSE在兜底。功能安全方面前面說的雙核鎖步M7配合芯片內(nèi)部的safety mechanism幫助客戶達(dá)到ISO 26262 ASIL-D等級要求。在Linux側(cè)雖然A53一般被劃分到QM等級但系統(tǒng)設(shè)計時可以利用M7的監(jiān)控通道對A53的異常進(jìn)行檢測和ASIL-D響應(yīng)。NXP的BSP里配套了安全相關(guān)例程和診斷庫量產(chǎn)項目做FMEA的時候這些積累會省不少事。3. Linux在S32G上從零跑通BSP構(gòu)建與啟動鏈路3.1 先搞懂啟動鏈路BootROM、SCFW、ATF、U-Boot拿到板子第一步不是急著接串口而是要搞清楚S32G的啟動鏈路。它跟普通i.MX板卡不一樣不是一個BootROM直接拉U-Boot就完事。S32G的完整啟動順序大致是片上BootROM先從SD卡或QSPI Flash讀取系統(tǒng)控制器固件SCFW并加載到專用M7核心上由SCFW負(fù)責(zé)DDR初始化、時鐘配置、電源管理和系統(tǒng)級安全策略接著ATFARM Trusted Firmware的BL2階段啟動驗證并加載U-BootU-Boot再引導(dǎo)Linux內(nèi)核和根文件系統(tǒng)。這個鏈路之所以復(fù)雜是因為S32G在一顆芯片里融合了多個異構(gòu)核心上電時要先把“系統(tǒng)控制域”跑起來才能讓應(yīng)用域安全地初始化內(nèi)存和外設(shè)。你要理解SCFW是NXP提供的一層固件開源程度不高但它是整個芯片穩(wěn)定運(yùn)行的基石千萬不要在網(wǎng)絡(luò)上隨便找一份“通用固件”替換。BSP里的SCFW、U-Boot、ATF版本是配套驗證過的混搭版本會讓你陷入莫名其妙的DDR初始化失敗。3.2 用Yocto構(gòu)建Linux鏡像的完整步驟NXP官方對S32G的Linux支持主打Yocto Project方式BSP源碼都放在NXP的Linux自動BSP倉庫里nxp-auto-linux用repo工具管理多個git倉庫。構(gòu)建環(huán)境建議用Ubuntu 20.04 LTS64位系統(tǒng)至少8GB內(nèi)存磁盤空閑越大越好因為整盤構(gòu)建大概需要100GB以上空間。首先安裝宿主機(jī)依賴。這里列一套我驗證過的命令sudo apt update sudo apt install -y gawk wget git-core diffstat unzip texinfo gcc-multilib \ build-essential chrpath socat libsdl1.2-dev xterm python3 python3-pip \ repo curl bison flex libssl-dev然后創(chuàng)建工作目錄并同步BSPmkdir -p ~/s32g-bsp cd ~/s32g-bsp repo init -u https://github.com/nxp-auto-linux/auto-bsp-manifest \ -b 版本標(biāo)簽例如BSP31.0 repo sync -j$(nproc)同步完成后用setup-environment腳本選擇目標(biāo)機(jī)器。S32G開發(fā)板對應(yīng)的機(jī)器名常見的是s32g274ardb2你在NXP的Release Notes里能確認(rèn)準(zhǔn)確寫法。source setup-environment s32g274ardb2這時環(huán)境變量已經(jīng)切到BitBake環(huán)境。構(gòu)建一個輕量又實用的鏡像bitbake core-image-base第一次構(gòu)建會反復(fù)下載源碼并編譯我的經(jīng)驗是這一步在配置良好的機(jī)器上也要跑四小時以上建議用screen或tmux掛著網(wǎng)絡(luò)不好時提前配好源鏡像。構(gòu)建結(jié)束后鏡像文件會出現(xiàn)在build- /tmp/deploy/images/ /目錄下看到.wic.gz結(jié)尾的文件就是可以直接寫入SD卡的完整鏡像。3.3 設(shè)備樹與板級配置改PHY地址和CAN節(jié)點足夠折騰一天BSP能直接跑起來前提是板級設(shè)備樹跟你手上的硬件一致。S32G的設(shè)備樹文件通常叫s32g274a-rdb2.dts或類似名字里面覆蓋了DDR配置、PCIe、以太網(wǎng)PHY、CAN控制器、M.2、PFE等節(jié)點。做量產(chǎn)定制時設(shè)備樹是必定要動的。最常見的兩處第一以太網(wǎng)PHY地址。你的載板上PHY芯片可能掛在MDIO地址1也可能掛在地址5設(shè)備樹里phy-handle和reg不匹配的話Linux內(nèi)核啟動時會報PHY link down或者根本找不到PHY。排查方式是在U-Boot里用mdio list查看實際PHY地址再回設(shè)備樹里改兩層要對齊。第二FLEXCAN的時鐘源配置。S32G上有多個FlexCAN實例在設(shè)備樹里要正確引用對應(yīng)的時鐘否則insmod flexcan驅(qū)動時會出現(xiàn)“clock not found”或can口初始化失敗。另外提示一個小細(xì)節(jié)設(shè)備樹的chosen節(jié)點里stdout-path要指向你實際使用的串口S32G的調(diào)試串口在Linux里通常對應(yīng)ttyLP0或ttyLP1。刷完鏡像如果串口完全沒輸出先看看這個節(jié)點有沒有配錯。4. 網(wǎng)絡(luò)模塊實測CAN FD、千兆以太網(wǎng)與TSN4.1 開發(fā)板接口巡覽RJ45、CAN、PCIe、M.2S32G開發(fā)板的載板接口布局跟一臺微型網(wǎng)絡(luò)設(shè)備高度相似。以太網(wǎng)口通常有多個千兆RJ45其中至少一個支持TSN/AVB功能連接到S32G的Ethernet MAC另外還可能通過PCIe轉(zhuǎn)出來的網(wǎng)口走的是Switch芯片或獨(dú)立PHY。CAN FD接口一般以DB9或接線端子方式引出具體用哪一路FlexCAN要在設(shè)備樹里查。PCIe Gen3插槽在載板上的位置比較顯眼它可以用來插NVMe硬盤做數(shù)據(jù)存儲也可以插一塊視頻采集卡模擬環(huán)視輸入或者接一塊高算力AI模組做推理加速。M.2接口則常常接到車上無線通信模組例如5G和Wi-Fi 6模塊走USB或PCIe通道。這意味著你在實驗室里搭的這套環(huán)境幾乎可以一比一映射到實車網(wǎng)關(guān)的交互邏輯上。4.2 SocketCAN環(huán)境下的CAN FD收發(fā)與路由Linux啟動后確認(rèn)CAN接口是否注冊成功ip link show如果設(shè)備樹配置正確能看到類似can0、can1這樣的接口。CAN FD配置需要同時指定仲裁段波特率和數(shù)據(jù)段波特率ip link set can0 down ip link set can0 up type can bitrate 500000 dbitrate 2000000 fd on這里bitrate 500000是標(biāo)準(zhǔn)CAN節(jié)點的常見配置dbitrate 2000000是CAN FD數(shù)據(jù)段速率實際速率要跟總線上其他節(jié)點對齊。配置成功后用ip -details link show can0能看到fd on標(biāo)志。接下來做最簡單的收發(fā)測試。一個終端監(jiān)聽candump can0另一個終端發(fā)送cansend can0 123#DEADBEEF如果監(jiān)聽端能看到123 [4] DE AD BE EF基本鏈路就通了。想模擬網(wǎng)關(guān)轉(zhuǎn)發(fā)可以用SocketCAN自帶的cangw工具把can0的指定ID報文全部路由到can1cangw -A -s can0 -d can1 -f 123執(zhí)行后can0收到的ID為123的報文會自動出現(xiàn)在can1上整個過程不經(jīng)過應(yīng)用層這也是快速驗證LLCE硬件路由效果的最直接方法。注意cangw的規(guī)則是基于“類CAN ID過濾”實際產(chǎn)品里你會把規(guī)則表配置到LLCE但實驗階段用cangw足夠驗證流程。4.3 用iperf3和linuxptp驗證以太網(wǎng)性能與時間同步以太網(wǎng)側(cè)先保證板子和PC在同一子網(wǎng)。板端啟動iperf3服務(wù)iperf3 -s -i 1PC端打流iperf3 -c 192.168.x.x -t 60 -P 4S32G千兆口在關(guān)閉TSN特性時TCP吞吐跑到930Mbps以上是正常水平。如果吞吐明顯偏低不要第一時間懷疑SoC先查PC網(wǎng)卡協(xié)商速率再查板上是否啟用了大量過濾規(guī)則。TSN驗證是S32G的一個重頭戲。車載TSN最基礎(chǔ)的是gPTP時間同步Linux下通常用linuxptp工具集。板端啟動ptp4l -i eth0 -f /usr/share/linuxptp/gPTP.cfg -mPC端需要支持PTP的網(wǎng)卡也啟動ptp4l或者用支持gPTP的交換機(jī)連接兩臺S32G板卡對比時鐘偏移。ptp4l -m會周期性打印offset值幾十納秒到幾百納秒的同步誤差在TSN里是正常量級。如果偏移一直很大檢查PHCPTP Hardware Clock驅(qū)動是否加載以及是否啟用了硬件時間戳ethtool -T eth0有hardware-transmit和hardware-receive字樣說明PHC功能正常。如果只支持軟件時間戳精度會差很多也說明設(shè)備樹或驅(qū)動沒有把TSN相關(guān)的時鐘節(jié)點配好。5. 開機(jī)到聯(lián)調(diào)我的手把手實操記錄5.1 硬件準(zhǔn)備與第一次上電我拿到的板子是標(biāo)準(zhǔn)開發(fā)套件包含核心板、載板、電源適配器、串口線、SD卡和散熱風(fēng)扇。上電前做三件事第一檢查板卡上的跳線或撥碼位置不同可能導(dǎo)致啟動介質(zhì)選擇錯誤第二用萬用表量一下12V供電口是否短路第三先把JTAG調(diào)試器拔掉避免影響啟動。第一次上電建議只接直流電源和調(diào)試串口串口線的USB端插到電腦用ls /dev/ttyUSB*確認(rèn)設(shè)備節(jié)點出現(xiàn)。串口工具我用的是minicom參數(shù)固定為115200-8-N-1無硬件流控。為了排查方便建議在minicom里記錄啟動日志到文件minicom -C bootlog.txt -D /dev/ttyUSB0上電瞬間看到串口滾動日志出現(xiàn)“DDR初始化成功”、“U-Boot版本號”等字樣說明SCFW和ATF已經(jīng)正常跑起來了。5.2 制作SD啟動卡并搞定串口SD卡是整個開發(fā)流程里最方便的操作介質(zhì)。一張16GB以上的Class 10卡就行插入電腦后先確認(rèn)設(shè)備節(jié)點我用的是lsblk一定不要看走眼選到系統(tǒng)盤。sudo dd if鏡像文件.wic.gz of/dev/sdX bs1M statusprogress convfsync sync寫入完成后把SD卡插回開發(fā)板重新上電。啟動完成后可以用root賬戶登錄NXP官方BSP默認(rèn)root無密碼或密碼在Release Notes里有說明。登錄后第一件事確認(rèn)系統(tǒng)版本cat /etc/os-release uname -a free -h df -h這些輸出會告訴你內(nèi)核版本、內(nèi)存大小和根文件系統(tǒng)掛載情況。如果根文件系統(tǒng)沒有掛載到mmcblk0p2而是落到initramfs里多半是bootargs里root參數(shù)寫錯了。5.3 網(wǎng)絡(luò)聯(lián)調(diào)從ifconfig到iperf3開發(fā)板上電后用ip addr查看網(wǎng)口IP默認(rèn)可能沒配地址。因為我的PC直連的是eth0我手動分配一個靜態(tài)地址測試ip addr add 192.168.1.100/24 dev eth0 ip link set eth0 upPC端同樣設(shè)置192.168.1.10/24然后互pingping -I eth0 192.168.1.10如果你發(fā)現(xiàn)雖然PHY link是up但ping不通先抓包看ARP請求是否到達(dá)再查PC防火墻。嵌入式開發(fā)里最常見的假象是PC端Windows防火墻把ICMP擋掉了導(dǎo)致“板子是通的但ping不通”的尷尬情況。網(wǎng)絡(luò)通了再跑一遍iperf3確認(rèn)物理鏈路帶寬正常。如果兩塊S32G板卡都有我建議直接用兩塊板子做TSN測試一臺當(dāng)gPTP主時鐘一臺當(dāng)從時鐘效果比用PC網(wǎng)卡好很多因為PC網(wǎng)卡對硬件時間戳的支持往往參差不齊。6. 常見問題與排查技巧實錄6.1 制作SD啟動卡后無法啟動現(xiàn)象是串口完全沒有輸出或卡在“Wait for DRC DFE ready”之類的DDR初始化階段。第一排查點是鏡像是否完整解壓寫入很多新手用unzip解壓.wic.gz但dd命令直接寫壓縮包肯定失敗正確做法是gunzip -k 鏡像文件.wic.gz sudo dd if鏡像文件.wic of/dev/sdX bs1M statusprogress convfsync第二檢查SD卡設(shè)備節(jié)點如果系統(tǒng)識別為/dev/mmcblk0要小心把整個塊設(shè)備寫掉中途斷電會造成不可逆損壞。第三確認(rèn)啟動開關(guān)位置S32G開發(fā)板通常由硬件管腳決定啟動源默認(rèn)支持SD卡啟動但某些板卡需要切到SD模式。6.2 串口無輸出或輸出亂碼無輸出先分清是根本沒啟動還是沒有輸出。萬用表量串口TX引腳電平如果一直保持高電平3.3V大概率芯片沒跑起來或者U-Boot階段就死了如果啟動過程中有波形跳動再看看串口轉(zhuǎn)接板是否共地。亂碼通常是波特率不對或電平不匹配S32G調(diào)試串口一般是115200且電平為3.3V你用5V的USB轉(zhuǎn)TTL模塊可能導(dǎo)致長期運(yùn)行燒壞引腳。6.3 上電后找不到can0或eth0CAN口沒有注冊先看內(nèi)核里flexcan驅(qū)動是否編入ls /sys/bus/platform/devices/ | grep flexcan如果設(shè)備樹節(jié)點和設(shè)備都存在但死活不出現(xiàn)can0再檢查時鐘。S32G的FlexCAN需要掛在一個可用的CAN時鐘下如果設(shè)備樹里時鐘引用錯亂驅(qū)動會加載失敗。查找方法dmesg | grep -i flexcaneth0消失優(yōu)先查PHY。dmesg | grep eth會顯示PHY探測結(jié)果常見的是“PHY address not found”就需要回到設(shè)備樹里核對PHY的reg地址。還有一種情況PCIe轉(zhuǎn)出的網(wǎng)口在啟動早期因為PCIe鏈路訓(xùn)練失敗被內(nèi)核丟棄那要先去lspci -v確認(rèn)PCIe設(shè)備是否枚舉成功。6.4 以太網(wǎng)性能上不去物理鏈路明明千兆u(yù)p但iperf3只有三四百M(fèi)bps。先跑一遍ethtool eth0確認(rèn)速率和雙工模式再檢查中斷親和性cat /proc/interrupts | grep eth0每顆A53收到的中斷數(shù)是否均衡如果不均衡可以用smp_affinity把中斷綁定到不同核心。另外軟件中斷softirq在Linux網(wǎng)絡(luò)收包路徑上消耗非常大嘗試開啟網(wǎng)卡的RSS多隊列支持以及調(diào)整net.core.netdev_budget和net.core.netdev_budget_usecs可以釋放更多吞吐。還有一個容易被忽略的點PC側(cè)的網(wǎng)卡如果是老USB千兆網(wǎng)卡實際速率可能只有400Mbps先換PCIe網(wǎng)卡對比測試。6.5 Windows虛擬機(jī)橋接驅(qū)動導(dǎo)致網(wǎng)絡(luò)聯(lián)調(diào)失敗這是一個讓我浪費(fèi)過兩小時的坑。很多開發(fā)者的Linux構(gòu)建環(huán)境跑在Windows宿主機(jī)上的VirtualBox或VMware里板子直連宿主機(jī)虛擬機(jī)網(wǎng)絡(luò)選擇橋接模式。結(jié)果VirtualBox在安裝時提示“安裝virtualbox ndis6 bridged networking driver找不到指定的模塊”橋接網(wǎng)卡根本起不來虛擬機(jī)連不上板子NFS掛載和SSH聯(lián)調(diào)全部廢掉。解決思路有三條。第一條卸載VirtualBox再重裝重點確保NDIS6驅(qū)動文件成功安裝第二條換用Vmware Workstation的橋接模式它走的是獨(dú)立的橋接協(xié)議棧在很多系統(tǒng)上比VirtualBox穩(wěn)定第三條網(wǎng)絡(luò)需求不大時直接用NAT模式加端口轉(zhuǎn)發(fā)把虛擬機(jī)的22端口映射到宿主機(jī)127.0.0.1上再從宿主機(jī)ssh到虛擬機(jī)。如果你只是需要開發(fā)板直連虛擬機(jī)更推薦在宿主機(jī)上完成串口和網(wǎng)絡(luò)共享再通過Windows自帶的路由能力讓虛擬機(jī)訪問板卡。7. 一些關(guān)于S32G開發(fā)的實際體會玩S32G這塊板子我最大的感觸是“別用老思路做新平臺”。很多熟悉i.MX或STM32MP1的開發(fā)者上手時會習(xí)慣性先改內(nèi)核配置、自己寫設(shè)備樹、自己調(diào)驅(qū)動但S32G的體系里L(fēng)LCE、PFE、HSE、SCFW這些組件之間的邊界比普通SoC復(fù)雜得多很多時候你要做的不是造輪子而是理解NXP已經(jīng)定義好的分工邏輯在里面填自己的業(yè)務(wù)代碼。另一個經(jīng)驗是啟動日志一定要完整保留。S32G啟動鏈路涉及BootROM、SCFW、ATF、U-Boot、內(nèi)核多階段任何一個階段的報錯信息都可能是定位問題的關(guān)鍵線索所以我強(qiáng)烈建議每次聯(lián)調(diào)都開著日志記錄等出問題的時候再去回溯。最后如果你準(zhǔn)備拿這塊板子做量產(chǎn)前的研究要預(yù)留足夠的時間在Yocto構(gòu)建和設(shè)備樹適配上面而不是幻想開箱即用。前期把這層殼磨透了后面調(diào)試應(yīng)用和網(wǎng)絡(luò)協(xié)議棧才會真正順暢。