博客專欄

        EEPW首頁 > 博客 > 征程 6 VIO Frame buffer管理

        征程 6 VIO Frame buffer管理

        發布人:地平線開發者 時間:2025-04-24 來源:工程師 發布文章

        1.底層 buffer 狀態機

        img

        系統通過五個狀態隊列實現幀緩沖區的全生命周期管理,各狀態定義及轉換邏輯如下:

        1.FREE(空閑態)

        功能描述 :管理初始可用緩沖區

        初始化操作 :

        場景運行時預分配所有 frame buffer 數組至該隊列

        記錄 buffer 的內核虛擬地址及物理地址信息

        數據結構 :frame buffer 結構體存儲地址映射關系

        2.REQUEST(請求態)

        狀態轉換觸發 :用戶層調用 qbuf 接口

        處理邏輯 :

        解析用戶傳入的 frame buffer index 參數

        校驗目標 frame buffer 狀態有效性

        更新 buffer 元數據并置為 REQUEST 狀態

        將 buffer 移入 REQUEST 隊列

        3.PROCESS(處理態)

        狀態轉換觸發 :Frame Start 硬件中斷

        處理邏輯 :

        從 REQUEST 隊列提取首幀 buffer

        置為 PROCESS 狀態并壓入處理隊列

        啟動硬件模塊數據處理

        4.COMPLETE(完成態)

        狀態轉換觸發 :Frame End 硬件中斷

        處理邏輯 :

        從 PROCESS 隊列提取完成幀

        置為 COMPLETE 狀態并移入完成隊列

        生成幀元數據(時間戳、幀 ID 等)

        5.USED(用戶態)

        狀態轉換觸發 :用戶調用 dqbuf 接口

        處理邏輯 :

        檢測 COMPLETE 隊列非空時觸發狀態轉換

        返回 frame buffer index 至用戶空間

        將 buffer 置為 USED 狀態并移入用戶隊列


        2.HAL 層交互

        img

        初始化階段

        層級操作內容
        HAL 層申請用戶態 buffer 空間
        驅動層分配內核態 frame buffer
        協同操作建立雙向地址映射關系

        幀獲取階段:

        aW1hZ2U=.png

        用戶調用 hb_vio_get_data 接口,HAL 通過 dqbuf 操作從驅動層獲取包含幀識別信息,幀識別信息包含 frame index,timestamp,frame id 等幀信息,通過 frame index,找到數組中的 image 結構體,并把相關的幀識別信息賦值到 image 結構體中,最后 memcpy 給用戶;

        幀釋放階段:

        aW1hZ2U=.png

        用戶調用 hb_vio_free_xxxbuf 接口(每個模塊都有對應的釋放接口)傳入需要釋放的 image 信息,HAL 通過獲取 image 信息中的 frame index 識別標志,通過 ioctl 接口通知驅動層對應 frame index 的 buffer 使用完畢;


        3.調試舉例

        常見調用獲取幀失敗,可通過 logcat 查看對應的 buffer 狀態,并通過分析對應的 buffer 狀態信息,可以定位問題的出錯點:

         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

        通過出錯通路的 buffer 狀態可知,PYM1 的輸出 buffer 都在 USED 隊列,說明底層 buffer 都被用戶層拿走了,進而導致用戶獲取幀失敗,需要用戶查看自己的持有幀邏輯和歸還邏輯;


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。




        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 政和县| 谢通门县| 天祝| 霍林郭勒市| 东明县| 东丽区| 仁化县| 红河县| 安陆市| 武鸣县| 天全县| 无极县| 高青县| 平湖市| 寿光市| 凤城市| 邢台市| 宽甸| 和林格尔县| 长丰县| 永和县| 尖扎县| 惠州市| 桦甸市| 宁明县| 双城市| 洱源县| 慈溪市| 镇远县| 义乌市| 渝中区| 建德市| 治多县| 砀山县| 城口县| 岳池县| 九龙坡区| 科技| 怀仁县| 山阴县| 额敏县|