博客專(zhuān)欄

        EEPW首頁(yè) > 博客 > 征程 6 VIO Frame buffer管理

        征程 6 VIO Frame buffer管理

        發(fā)布人:地平線(xiàn)開(kāi)發(fā)者 時(shí)間:2025-04-24 來(lái)源:工程師 發(fā)布文章

        1.底層 buffer 狀態(tài)機(jī)

        img

        系統(tǒng)通過(guò)五個(gè)狀態(tài)隊(duì)列實(shí)現(xiàn)幀緩沖區(qū)的全生命周期管理,各狀態(tài)定義及轉(zhuǎn)換邏輯如下:

        1.FREE(空閑態(tài))

        功能描述 :管理初始可用緩沖區(qū)

        初始化操作 :

        場(chǎng)景運(yùn)行時(shí)預(yù)分配所有 frame buffer 數(shù)組至該隊(duì)列

        記錄 buffer 的內(nèi)核虛擬地址及物理地址信息

        數(shù)據(jù)結(jié)構(gòu) :frame buffer 結(jié)構(gòu)體存儲(chǔ)地址映射關(guān)系

        2.REQUEST(請(qǐng)求態(tài))

        狀態(tài)轉(zhuǎn)換觸發(fā) :用戶(hù)層調(diào)用 qbuf 接口

        處理邏輯 :

        解析用戶(hù)傳入的 frame buffer index 參數(shù)

        校驗(yàn)?zāi)繕?biāo) frame buffer 狀態(tài)有效性

        更新 buffer 元數(shù)據(jù)并置為 REQUEST 狀態(tài)

        將 buffer 移入 REQUEST 隊(duì)列

        3.PROCESS(處理態(tài))

        狀態(tài)轉(zhuǎn)換觸發(fā) :Frame Start 硬件中斷

        處理邏輯 :

        從 REQUEST 隊(duì)列提取首幀 buffer

        置為 PROCESS 狀態(tài)并壓入處理隊(duì)列

        啟動(dòng)硬件模塊數(shù)據(jù)處理

        4.COMPLETE(完成態(tài))

        狀態(tài)轉(zhuǎn)換觸發(fā) :Frame End 硬件中斷

        處理邏輯 :

        從 PROCESS 隊(duì)列提取完成幀

        置為 COMPLETE 狀態(tài)并移入完成隊(duì)列

        生成幀元數(shù)據(jù)(時(shí)間戳、幀 ID 等)

        5.USED(用戶(hù)態(tài))

        狀態(tài)轉(zhuǎn)換觸發(fā) :用戶(hù)調(diào)用 dqbuf 接口

        處理邏輯 :

        檢測(cè) COMPLETE 隊(duì)列非空時(shí)觸發(fā)狀態(tài)轉(zhuǎn)換

        返回 frame buffer index 至用戶(hù)空間

        將 buffer 置為 USED 狀態(tài)并移入用戶(hù)隊(duì)列


        2.HAL 層交互

        img

        初始化階段

        層級(jí)操作內(nèi)容
        HAL 層申請(qǐng)用戶(hù)態(tài) buffer 空間
        驅(qū)動(dòng)層分配內(nèi)核態(tài) frame buffer
        協(xié)同操作建立雙向地址映射關(guān)系

        幀獲取階段:

        aW1hZ2U=.png

        用戶(hù)調(diào)用 hb_vio_get_data 接口,HAL 通過(guò) dqbuf 操作從驅(qū)動(dòng)層獲取包含幀識(shí)別信息,幀識(shí)別信息包含 frame index,timestamp,frame id 等幀信息,通過(guò) frame index,找到數(shù)組中的 image 結(jié)構(gòu)體,并把相關(guān)的幀識(shí)別信息賦值到 image 結(jié)構(gòu)體中,最后 memcpy 給用戶(hù);

        幀釋放階段:

        aW1hZ2U=.png

        用戶(hù)調(diào)用 hb_vio_free_xxxbuf 接口(每個(gè)模塊都有對(duì)應(yīng)的釋放接口)傳入需要釋放的 image 信息,HAL 通過(guò)獲取 image 信息中的 frame index 識(shí)別標(biāo)志,通過(guò) ioctl 接口通知驅(qū)動(dòng)層對(duì)應(yīng) frame index 的 buffer 使用完畢;


        3.調(diào)試舉例

        常見(jiàn)調(diào)用獲取幀失敗,可通過(guò) logcat 查看對(duì)應(yīng)的 buffer 狀態(tài),并通過(guò)分析對(duì)應(yīng)的 buffer 狀態(tài)信息,可以定位問(wèn)題的出錯(cuò)點(diǎn):

         E/        ( 2087): [4770.375488][vpf_ioctl.c]:[vio_dev_node_dqbuf_poll][1012]dev poll Timeout(4000): 0, Success
        I/        ( 2087): [4770.375488][vpf_ioctl.c]:[vio_dbg_log_show][964]
        I/        ( 2087): [S9] vin4_C2*-m2m-(dma)pym1_C6*(dma)
        I/        ( 2087): gtask-vin4: res 1 rcnt 0 [vin4:0]
        I/        ( 2087): gtask-pym1: res 0 rcnt 0 [pym1:0]
        I/        ( 2087): [4770.375488][vpf_ioctl.c]:[vio_dbg_log_show][964]
        I/        ( 2087): ----------------------------------------------------------
        I/        ( 2087): flowid    module    cid chn   FREE   REQ   PRO   COM  USED
        I/        ( 2087): ----------------------------------------------------------
        I/        ( 2087): 9         vin4      2   0       16     0     0     0     0
        I/        ( 2087): 9         vin4      2   8        0     6     0     0     0
        I/        ( 2087):
        I/        ( 2087): 9         pym1      6   0       10     0     0     0     6
        I/        ( 2087): 9         pym1      6   8        0     0     0     0     5

        通過(guò)出錯(cuò)通路的 buffer 狀態(tài)可知,PYM1 的輸出 buffer 都在 USED 隊(duì)列,說(shuō)明底層 buffer 都被用戶(hù)層拿走了,進(jìn)而導(dǎo)致用戶(hù)獲取幀失敗,需要用戶(hù)查看自己的持有幀邏輯和歸還邏輯;


        *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。




        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 丹凤县| 河间市| 策勒县| 陇南市| 四平市| 平乡县| 海林市| 泗水县| 曲松县| 民权县| 六盘水市| 东光县| 桑植县| 贵港市| 盐源县| 海口市| 惠东县| 巴东县| 嘉鱼县| 乾安县| 巴马| 古蔺县| 城口县| 宝应县| 新乐市| 林芝县| 信阳市| 行唐县| 辉县市| 徐水县| 田林县| 手游| 榆中县| 浙江省| 大关县| 托克托县| 南岸区| 沛县| 十堰市| 汉寿县| 梓潼县|