<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(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)機

img

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

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

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

初始化操作 :

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

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

數據結構 :frame buffer 結構體存儲地址映射關(guān)系

2.REQUEST(請求態(tài))

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

處理邏輯 :

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

校驗目標 frame buffer 狀態(tài)有效性

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

將 buffer 移入 REQUEST 隊列

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

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

處理邏輯 :

從 REQUEST 隊列提取首幀 buffer

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

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

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

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

處理邏輯 :

從 PROCESS 隊列提取完成幀

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

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

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

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

處理邏輯 :

檢測 COMPLETE 隊列非空時(shí)觸發(fā)狀態(tài)轉換

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

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


2.HAL 層交互

img

初始化階段

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

幀獲取階段:

aW1hZ2U=.png

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

幀釋放階段:

aW1hZ2U=.png

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


3.調試舉例

常見(jiàn)調用獲取幀失敗,可通過(guò) logcat 查看對應的 buffer 狀態(tài),并通過(guò)分析對應的 buffer 狀態(tài)信息,可以定位問(wèn)題的出錯點(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ò)出錯通路的 buffer 狀態(tài)可知,PYM1 的輸出 buffer 都在 USED 隊列,說(shuō)明底層 buffer 都被用戶(hù)層拿走了,進(jìn)而導致用戶(hù)獲取幀失敗,需要用戶(hù)查看自己的持有幀邏輯和歸還邏輯;


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




相關(guān)推薦

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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>