套件實戰(zhàn):從燒錄到圖像加速)
開箱一塊車載視覺開發(fā)板先別急著接屏幕。做ADAS高級駕駛輔助和環(huán)視方案的朋友應(yīng)該都懂項目前期最耽誤時間的往往不是算法本身而是把底層SoC跑起來、把圖像鏈路打通的過程。R-Car V3M這顆芯片在瑞薩的產(chǎn)品線里定位很明確面向車載攝像頭的實時圖像處理跟那些動輒幾十瓦的桌面級平臺完全是兩個路子。今天聊的這塊Starter Kit官方名字就叫“Kit for R-Car V3M SoC Speeds Development”本質(zhì)就是官方給的評估板加完整軟件棧目標很直接讓你在拿到板子的第一天就把Linux跑起來而不是花兩周去啃數(shù)據(jù)手冊。我拿這套件實際折騰了一段時間從硬件查錯到軟件編譯都過了一遍。這篇文章不打算復(fù)讀規(guī)格書而是把套件里的門道、開發(fā)流程里容易卡殼的地方、以及一些手冊上沒寫透的細節(jié)梳理出來。無論你是剛接手車載項目想快速驗證方案還是準備基于V3M做產(chǎn)品預(yù)研這篇應(yīng)該都能幫你省下不少時間。1. 為什么選擇R-Car V3M一款面向車載視覺應(yīng)用的SoC1.1 從芯片定位看套件價值R-Car V3M不是一顆通用應(yīng)用處理器。它最核心的戰(zhàn)場是車載攝像頭應(yīng)用包括環(huán)視監(jiān)控AVM、電子后視鏡CMS、以及部分前視輔助功能。這類場景有一個共同特點對實時性要求極高同時又對功耗和成本非常敏感。跟手機SoC那種追求跑分的思路不同V3M強調(diào)的是以最低功耗完成持續(xù)的圖像采集、拼接、識別和輸出。這顆SoC的計算單元很有意思。它沒有堆砌一堆大核而是走異構(gòu)路線兩個Cortex-A53核負責(zé)跑Linux系統(tǒng)和應(yīng)用邏輯一個Cortex-R7鎖步核負責(zé)實時控制和功能安全相關(guān)的任務(wù)再加上瑞薩自研的圖像處理加速器IMP來處理視覺算法。這種架構(gòu)意味著你在開發(fā)時要養(yǎng)成一個習(xí)慣先想清楚任務(wù)該跑在哪個核上而不是一股腦全丟給A53。Starter Kit的價值就在于此。它把這些異構(gòu)資源全部引出來配上對應(yīng)的驅(qū)動和示例讓你不用在硬件設(shè)計完成之前就開始寫軟件。很多團隊習(xí)慣等自研板卡回來才開始調(diào)軟件結(jié)果硬件一改版軟件全部返工。用開發(fā)套件先跑通軟件方案再反哺硬件設(shè)計這個順序能省下至少一個迭代周期。1.2 R-Car V3M核心硬件規(guī)格解析在深入套件之前有必要把V3M的關(guān)鍵參數(shù)理清楚。我整理了一張表方便你對照自己的項目需求模塊規(guī)格說明CPU2 x Cortex-A53 1GHz用于Linux操作系統(tǒng)和應(yīng)用層實時核1 x Cortex-R7 鎖步 800MHz用于實時控制和功能安全圖像處理圖像信號處理器ISP IMP支持多路攝像頭輸入與視覺加速視頻編解碼支持H.264/H.265用于編碼輸出與回放內(nèi)存接口DDR3L/DDR4支持ECC提升系統(tǒng)穩(wěn)定性功能安全符合ISO 26262鎖步核與安全機制典型功耗約3-5W視負載適配車載散熱環(huán)境注意看內(nèi)存接口支持ECC。這一點對車載應(yīng)用非常關(guān)鍵因為內(nèi)存位翻轉(zhuǎn)在高溫振動環(huán)境下并不罕見ECC能在硬件層面糾正單比特錯誤避免系統(tǒng)跑著跑著突然崩潰。如果你的項目對穩(wěn)定性有硬性要求選型時一定要把是否支持ECC列為必選項而不是只看CPU頻率。ISP支持多路攝像頭輸入這是做環(huán)視方案的硬件基礎(chǔ)。實際項目中經(jīng)常遇到的問題是ISP的驅(qū)動配置和攝像頭模組的適配這部分在套件里已經(jīng)有了比較完整的參考實現(xiàn)后面第三章會細說。2. 套件構(gòu)成與整體設(shè)計思路2.1 開發(fā)套件里到底有什么拆開包裝里面除了核心板之外還有底板、電源適配器、USB線纜和串口調(diào)試線。這里要特別提醒一個容易犯的錯很多人拿到板子第一件事就是找HDMI接口想接顯示器但V3M這塊板子的定位是嵌入式視覺處理不靠顯示器交互一切操作都通過串口終端完成。如果你習(xí)慣用桌面系統(tǒng)第一次面對純串口的開發(fā)環(huán)境可能會有點不適應(yīng)但這個思路其實更貼近車載產(chǎn)品的真實形態(tài)——車載設(shè)備本來就沒有人給你接顯示器。核心板與底板分離的設(shè)計是一個值得點贊的細節(jié)。核心板上集成了SoC、內(nèi)存和電源管理底板則引出各種接口。這個設(shè)計有兩個實際好處一是如果底板上的某個接口燒了換底板就行不用整板報廢二是你可以基于核心板去設(shè)計自己的載板核心板上的啟動配置已經(jīng)驗證過省去你自己畫電源樹和DDR走線的風(fēng)險。2.2 板級布局與外設(shè)接口說明底板上的接口布局需要重點關(guān)注。V3M套件引出的接口包括多路CSI-2攝像頭接口、以太網(wǎng)口、CAN接口、USB口、SD卡槽和調(diào)試串口。從這些接口就能看出瑞薩的設(shè)計意圖CAN口直接對應(yīng)車載總線CSI-2接口對著攝像頭的MIPI輸出以太網(wǎng)口則用于數(shù)據(jù)回傳或者OTA升級。這個外設(shè)組合基本就是一輛車端感知單元的最小閉環(huán)。攝像頭接口的位置比較講究它被安排在板邊靠近SoC的一側(cè)這樣走線短信號完整性更容易保證。如果你打算自己設(shè)計載板攝像頭接口的位置也要盡量靠近SoC不要為了布板方便把MIPI走線繞一大圈。MIPI信號對長度匹配和阻抗連續(xù)性要求很高走線太長或打過孔太多輕則圖像花屏重則根本采不到信號。2.3 選型建議Starter Kit vs 自研板卡很多團隊會糾結(jié)一個問題項目初期是買官方套件還是直接畫自己的板子我的建議很直接除非你的硬件團隊對車載電源設(shè)計和DDR布線非常熟練否則務(wù)必先買一套官方Starter Kit。原因有三點第一軟件驗證需要硬件平臺串口啟動、網(wǎng)絡(luò)調(diào)試、攝像頭采集這些基礎(chǔ)能力需要一塊穩(wěn)定可靠的板子來支撐第二官方套件的原理圖、PCB文件和物料清單都是開放的這等于給了你一份經(jīng)過驗證的參考設(shè)計比自己從零畫板省力得多第三遇到問題時你用開發(fā)板復(fù)現(xiàn)問題給瑞薩FAE看對方的支持效率會高很多。等軟件方案跑通了再根據(jù)開發(fā)板的經(jīng)驗去設(shè)計量產(chǎn)板卡風(fēng)險會小很多。3. 開始前的準備搭建開發(fā)環(huán)境3.1 所需硬件與軟件清單拿到套件后先別急著上電。你還需要準備幾樣?xùn)|西一臺運行Ubuntu 18.04或20.04的x86主機用來編譯代碼和燒錄鏡像一條USB轉(zhuǎn)串口線如果套件沒有附帶用來連接調(diào)試串口一張至少8GB的microSD卡用來存放啟動鏡像一個5V/3A以上的電源適配器如果套件沒有附帶一臺以太網(wǎng)交換機或直連網(wǎng)線用于網(wǎng)絡(luò)調(diào)試如果涉及攝像頭開發(fā)還需要一套MIPI CSI-2接口的攝像頭模組軟件方面主要需要安裝交叉編譯工具鏈、串口終端軟件和鏡像燒錄工具。下面逐個說。3.2 交叉編譯工具鏈安裝V3M的A53核是64位ARM架構(gòu)所以需要安裝aarch64版本的交叉編譯工具鏈。在Ubuntu上執(zhí)行sudo apt update sudo apt install gcc-aarch64-linux-gnu安裝完成后驗證一下aarch64-linux-gnu-gcc --version如果能正常輸出版本號說明工具鏈已經(jīng)可用。這里有個小坑有些項目的BSP會要求特定的工具鏈版本比如GCC 7.5或9.2直接裝系統(tǒng)自帶的版本可能編譯出來的程序在目標板上無法運行報錯一般是Floating point exception或者Illegal instruction。遇到這種情況別慌大概率是工具鏈版本不匹配去BSP文檔里找到指定版本重新安裝即可。3.3 串口調(diào)試終端配置串口是嵌入式開發(fā)的生命線尤其是這種沒有顯示接口的板子。用USB轉(zhuǎn)串口線連接開發(fā)板的調(diào)試串口然后在Ubuntu上安裝minicom或picocomsudo apt install picocom先看一下設(shè)備名ls /dev/ttyUSB*通常是/dev/ttyUSB0。然后啟動終端sudo picocom -b 115200 /dev/ttyUSB0波特率一般是1152008N18數(shù)據(jù)位、無校驗、1停止位這是嵌入式調(diào)試串口最常見的配置。如果連接后按回車沒有反應(yīng)先檢查USB轉(zhuǎn)串口線是否被識別再檢查開發(fā)板是否已經(jīng)上電、啟動開關(guān)是否撥到了正確位置。注意串口終端里顯示的亂碼多半是波特率不對或者開發(fā)板沒有正確進入下載/啟動模式。不要反復(fù)改波特率碰運氣先確認啟動配置。4. 核心實操從燒錄鏡像到Linux啟動4.1 獲取與構(gòu)建啟動鏡像R-Car系列的軟件BSP可以從瑞薩官網(wǎng)下載一般包含三個部分引導(dǎo)程序Bootloader、內(nèi)核Linux Kernel和根文件系統(tǒng)RootFS。瑞薩提供了一套基于Yocto的構(gòu)建系統(tǒng)可以一鍵生成完整的啟動鏡像但對初次接觸的用戶來說直接使用預(yù)編譯鏡像更省事。官網(wǎng)提供的預(yù)編譯鏡像通常是一個壓縮包解壓后可以看到以下關(guān)鍵文件ImageLinux內(nèi)核鏡像r8a77970.dtb設(shè)備樹文件描述了硬件平臺信息u-boot.bin引導(dǎo)加載程序rootfs.ext4根文件系統(tǒng)鏡像如果要做定制修改再上Yocto去折騰。這里要說一個經(jīng)驗第一輪開發(fā)一定是先用預(yù)編譯鏡像把環(huán)境跑熟不要一上來就搞Yocto。Yocto的構(gòu)建時間極長第一次構(gòu)建可能要幾個小時甚至一個晚上如果build過程中網(wǎng)絡(luò)不好還會頻繁失敗極易勸退新手。4.2 燒錄SD卡拿到預(yù)編譯鏡像后需要制作一張可啟動的SD卡。首先用fdisk或gparted將SD卡分成兩個分區(qū)第一個分區(qū)格式化為FAT32存放內(nèi)核和設(shè)備樹第二個分區(qū)格式化為ext4存放根文件系統(tǒng)。更快的做法是直接用dd命令寫入整卡鏡像。如果瑞薩提供的是sdcard.img整卡鏡像操作就非常簡單sudo dd ifsdcard.img of/dev/sdb bs4M statusprogress sync這里的/dev/sdb是你的SD卡設(shè)備名用之前務(wù)必用lsblk確認一下千萬不要寫錯設(shè)備名否則可能把整個硬盤的數(shù)據(jù)清掉。整個過程可能需要幾分鐘看到sync執(zhí)行完成后才能拔卡否則數(shù)據(jù)可能沒寫完。4.3 啟動開關(guān)與啟動流程把燒錄好的SD卡插入開發(fā)板然后查看底板上的啟動配置撥碼開關(guān)。V3M支持從多種介質(zhì)啟動SD卡、eMMC、串口下載等具體由撥碼開關(guān)的狀態(tài)決定。套件出廠默認通常是SD卡啟動如果需要手動設(shè)置參考底板絲印上的標注一般有BOOT相關(guān)的字樣。上電后串口終端會輸出U-Boot的啟動日志??吹筋愃葡旅娴妮敵鼍驼f明U-Boot已經(jīng)在運行了U-Boot 2020.01 (Jan 01 2022 - 00:00:00 0000) CPU: Renesas Electronics R8A77970 DRAM: 2 GiB MMC: sdee140000: 0 Loading Environment from MMC... OK接著會自動加載內(nèi)核和設(shè)備樹最終進入Linux登錄提示符。V3M的標準Linux登錄名一般是root密碼為空或者為root具體看BSP文檔說明。4.4 啟動日志分析與驗證系統(tǒng)啟動完成后先做幾個驗證步驟確保平臺基本功能正常cat /proc/cpuinfo查看CPU信息和核心數(shù)應(yīng)該能看到兩個A53核。再查看內(nèi)存free -h如果顯示的內(nèi)存與開發(fā)板參數(shù)不符比如標稱2GB但只識別到1GB需要檢查設(shè)備樹中的內(nèi)存配置是否正確。接著測試網(wǎng)絡(luò)ifconfig eth0 up udhcpc如果網(wǎng)絡(luò)正常會通過DHCP獲取到IP地址。到這里一套最基本的啟動驗證流程就完成了。提示啟動日志中如果出現(xiàn)Kernel panic - not syncing: VFS: Unable to mount root fs說明根文件系統(tǒng)加載失敗大概率是SD卡分區(qū)表不正?;蛟O(shè)備樹中的root分區(qū)號不對優(yōu)先檢查這兩項。5. 上層應(yīng)用開發(fā)跑通第一個示例程序5.1 編寫并交叉編譯程序平臺跑起來了接著寫第一個應(yīng)用程序。在Ubuntu主機上創(chuàng)建一個hello.c#include stdio.h int main(void) { printf(Hello from R-Car V3M!\n); return 0; }然后用交叉編譯工具鏈編譯aarch64-linux-gnu-gcc -o hello hello.c注意不要用系統(tǒng)的gcc直接編譯那樣編出來的是x86程序在ARM板子上跑不了。文件類型可以用file命令檢查file hello輸出應(yīng)該包含ARM aarch64字樣這才說明是一個能在目標板上運行的可執(zhí)行文件。5.2 部署并運行程序把編譯好的程序傳到開發(fā)板上最方便的方式是網(wǎng)絡(luò)傳輸。先在開發(fā)板上確認IP地址然后用scp拷貝scp hello root開發(fā)板IP:/root/在開發(fā)板上執(zhí)行chmod x /root/hello /root/hello看到輸出Hello from R-Car V3M!恭喜你完整的嵌入式開發(fā)流程已經(jīng)跑通了。這個流程雖然簡單但它是之后所有開發(fā)工作的基礎(chǔ)編寫代碼、交叉編譯、網(wǎng)絡(luò)傳輸、目標板運行。后續(xù)開發(fā)攝像頭例程、網(wǎng)絡(luò)服務(wù)甚至深度學(xué)習(xí)推理程序走的都是這條路。這里分享一個日常開發(fā)效率技巧在主機上用SSH密鑰登錄開發(fā)板再配合rsync做文件同步可以省去反復(fù)輸入密碼的麻煩。我個人的習(xí)慣是寫一個同步腳本把編譯輸出的目錄通過rsync推到開發(fā)板上每次編譯完只需要執(zhí)行一條命令就能完成部署比來回scp省事很多。5.3 進階方向利用IMP進行圖像加速V3M的視覺處理核心IMPImage Processing Accelerator是這顆SoC的精華所在。它就像一塊專用的圖像處理加速器能把色彩空間轉(zhuǎn)換、縮放、濾波這類操作從CPU上卸載下來。瑞薩提供的軟件包中包含了IMP的驅(qū)動和示例代碼但說實話它的API文檔風(fēng)格和Linux社區(qū)的一般驅(qū)動不太一樣學(xué)習(xí)曲線比較陡。我的建議是先用官方示例把數(shù)據(jù)通路跑通比如從攝像頭采集圖像、經(jīng)過ISP處理、通過IMP加速后輸出到顯示器或編碼器。跑通之后再嘗試修改參數(shù)逐步理解每個模塊的作用。這里要特別提醒IMP的緩沖區(qū)對齊要求很嚴格分配內(nèi)存時一定要用支持物理連續(xù)的內(nèi)存分配接口比如ION或DMA-BUF如果直接用普通的malloc圖像數(shù)據(jù)很容易出現(xiàn)莫名其妙的撕裂或花屏排查起來非常費勁。6. 常見問題與排查技巧實錄6.1 啟動階段問題速查表整個開發(fā)過程中啟動階段是最容易出問題的環(huán)節(jié)。我把實際遇到的高頻問題和解決思路整理成了表格方便你對照排查現(xiàn)象可能原因排查與解決上電后串口無輸出電源沒接好、串口線接觸不良、波特率錯誤檢查電源指示燈更換串口線確認終端設(shè)置為115200/8N1U-Boot啟動后卡住SD卡分區(qū)表異常或鏡像文件損壞重新燒錄SD卡必要時用整卡鏡像內(nèi)核啟動時反復(fù)重啟設(shè)備樹與硬件不匹配檢查DTB文件是否正確確認dts中內(nèi)存大小參數(shù)掛載根文件系統(tǒng)失敗root分區(qū)編號不對檢查內(nèi)核啟動參數(shù)中的root/dev/mmcblk0p2是否對應(yīng)實際分區(qū)網(wǎng)絡(luò)不通IP地址未配置、網(wǎng)線未插好先用ifconfig確認網(wǎng)卡狀態(tài)再用udhcpc獲取IP攝像頭采集不到圖像MIPI線序錯誤、ISP驅(qū)動未加載檢查攝像頭排線方向確認dmesg中ISP相關(guān)日志正常6.2 開發(fā)過程中的幾個坑除了啟動階段的問題開發(fā)過程中的坑也很有代表性。第一個坑是電源紋波問題。V3M對電源質(zhì)量比較挑剔如果你用的是自研底板電源設(shè)計一定要嚴格按照數(shù)據(jù)手冊的要求來尤其是DVFS動態(tài)調(diào)壓的部分。我遇到過一塊板子在低負載時一切正常一旦進入高負載運算就隨機重啟查了很久才發(fā)現(xiàn)是電源紋波超標導(dǎo)致SoC內(nèi)部邏輯誤觸發(fā)復(fù)位。用示波器測紋波時測量點要盡量靠近SoC電源引腳不要測在電源模塊輸出端兩者之間的PCB走線阻抗會造成測量結(jié)果偏差。第二個坑是DDR的穩(wěn)定性問題。官方套件的DDR參數(shù)已經(jīng)調(diào)好不用動。但如果你自己畫板DDR的布線長度匹配和參考平面是決定穩(wěn)定性的關(guān)鍵。很多自研板卡跑Linux沒問題一跑內(nèi)存壓力測試就掛基本都是DDR信號完整性問題。調(diào)試時可以先降頻比如從1866MHz降到1600MHz跑測試如果降頻后穩(wěn)定說明是高速信號完整性問題而不是芯片本身的問題。第三個坑是MIPI攝像頭調(diào)試。調(diào)試攝像頭時如果發(fā)現(xiàn)圖像色彩異常比如偏綠或偏紅先別急著調(diào)算法先檢查ISP的白平衡配置是否與攝像頭模組的sensor型號匹配。V3M的ISP有大量的寄存器配置不同的sensor在色彩矩陣、黑電平、增益上都有差異直接用默認配置經(jīng)常會出現(xiàn)色彩偏色。瑞薩的參考代碼中一般會帶一兩個常用sensor的配置比如IMX390或OV10640需要根據(jù)自己實際使用的sensor進行適配。第四個坑是功能安全相關(guān)的實時核開發(fā)。V3M的Cortex-R7核是鎖步運行的主要用于執(zhí)行功能安全相關(guān)的任務(wù)比如車輛狀態(tài)監(jiān)控、故障診斷等。這個核跑的通常是裸機程序或?qū)S玫腞TOS跟Linux的A53核是完全隔離的。開發(fā)時要注意A53和R7之間的通信需要通過共享內(nèi)存和Mailbox機制來實現(xiàn)不能直接用全局變量跨核訪問。初次接觸異構(gòu)多核開發(fā)的工程師最容易在這里出問題程序編譯都通過一運行就異常最后排查下來發(fā)現(xiàn)是核間通信機制沒用對。6.3 提升開發(fā)效率的幾個小工具工欲善其事必先利其器。除了官方提供的工具鏈還有幾個工具能讓開發(fā)效率明顯提升buildroot如果不想搞重量級的Yocto只想快速生成一個精簡的根文件系統(tǒng)buildroot是很好的選擇。配置簡單、構(gòu)建速度快適合早期原型驗證階段使用。crash工具如果遇到內(nèi)核崩潰問題crash配合vmlinux可以分析內(nèi)核轉(zhuǎn)儲文件快速定位崩潰點。車載場景中偶發(fā)性的內(nèi)核崩潰最難排查有了crash工具能省下無數(shù)時間。trace-cmd用于跟蹤內(nèi)核事件在調(diào)試驅(qū)動程序性能問題時非常有用。比如想確認ISP驅(qū)動中斷頻率是否正??梢杂胻race-cmd記錄中斷事件分析是否存在異常。7. 一些更深入的建議7.1 從套件到量產(chǎn)注意這幾個差異用Starter Kit開發(fā)完原型距離量產(chǎn)還有一段路要走。有幾個差異需要提前規(guī)劃散熱方案是第一個需要重新考慮的點。開發(fā)板的散熱設(shè)計比較保守因為要保證芯片在長時間運行不降頻測試時看到的現(xiàn)象和量產(chǎn)的散熱設(shè)計會有差異。量產(chǎn)時如果整機體積小、散熱條件差可能需要通過軟件策略限制CPU最高頻率或者調(diào)整DVFS表讓SoC在高負載下不會快速升溫。存儲方案也需要調(diào)整。開發(fā)板用SD卡是為了方便但量產(chǎn)產(chǎn)品一般會用eMMC啟動速度和可靠性都更好。從SD卡啟動切換到eMMC啟動時U-Boot和內(nèi)核的設(shè)備樹需要做相應(yīng)修改啟動參數(shù)和分區(qū)表也要重新設(shè)計。攝像頭模組也需要換。開發(fā)套件上的攝像頭模組通常是評估用的型號量產(chǎn)時如果換用了不同型號的sensorISP調(diào)試的工作量不容小覷。我見過一個項目因為換了sensor整個圖像調(diào)試就花了兩個月主要是色彩矩陣、自動曝光、自動白平衡的參數(shù)都要重新調(diào)。這個時間預(yù)算一定要留在項目計劃里。7.2 從V3M后續(xù)型號遷移的可能性如果你評估之后覺得V3M的性能略有余量但不算太充??梢钥紤]它同系列的R-Car V3H或者新一代產(chǎn)品。瑞薩的R-Car系列在軟件架構(gòu)上保持了較好的兼容性很多驅(qū)動程序可以直接沿用這算是用官方套件做開發(fā)的一個隱藏紅利。另外V3M的后續(xù)產(chǎn)品往往在IMP算力和AI加速能力上有明顯提升如果你的產(chǎn)品規(guī)劃中包含后續(xù)迭代選型時就要把軟件遷移成本一并考慮進去。我個人在實際操作中的體會是做車載視覺開發(fā)工具鏈的成熟度往往比芯片的紙面參數(shù)更重要。V3M這顆SoC的算力在當(dāng)前看來不算頂尖但它的開發(fā)資料齊全、軟件棧完善、社區(qū)案例豐富這些恰恰是實際項目中最值錢的資源。很多團隊在這類項目上栽跟頭不是芯片性能不行而是低估了軟件生態(tài)的價值。如果你打算從零開始做車載視覺方案V3M這套Starter Kit絕對值得你先上手試一輪——至少在它的幫助下你踩過的坑會少很多。