征程 6 VIO Frame buffer管理
1.底層 buffer 狀態(tài)機(jī)
系統(tǒng)通過五個(gè)狀態(tài)隊(duì)列實(shí)現(xiàn)幀緩沖區(qū)的全生命周期管理,各狀態(tài)定義及轉(zhuǎn)換邏輯如下:
1.FREE(空閑態(tài))
功能描述 :管理初始可用緩沖區(qū)
初始化操作 :
場景運(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(請求態(tài))
狀態(tài)轉(zhuǎn)換觸發(fā) :用戶層調(diào)用 qbuf 接口
處理邏輯 :
解析用戶傳入的 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(用戶態(tài))
狀態(tài)轉(zhuǎn)換觸發(fā) :用戶調(diào)用 dqbuf 接口
處理邏輯 :
檢測 COMPLETE 隊(duì)列非空時(shí)觸發(fā)狀態(tài)轉(zhuǎn)換
返回 frame buffer index 至用戶空間
將 buffer 置為 USED 狀態(tài)并移入用戶隊(duì)列
2.HAL 層交互
初始化階段
HAL 層 | 申請用戶態(tài) buffer 空間 |
驅(qū)動(dòng)層 | 分配內(nèi)核態(tài) frame buffer |
協(xié)同操作 | 建立雙向地址映射關(guān)系 |
幀獲取階段:
用戶調(diào)用 hb_vio_get_data 接口,HAL 通過 dqbuf 操作從驅(qū)動(dòng)層獲取包含幀識(shí)別信息,幀識(shí)別信息包含 frame index,timestamp,frame id 等幀信息,通過 frame index,找到數(shù)組中的 image 結(jié)構(gòu)體,并把相關(guān)的幀識(shí)別信息賦值到 image 結(jié)構(gòu)體中,最后 memcpy 給用戶;
幀釋放階段:
用戶調(diào)用 hb_vio_free_xxxbuf 接口(每個(gè)模塊都有對應(yīng)的釋放接口)傳入需要釋放的 image 信息,HAL 通過獲取 image 信息中的 frame index 識(shí)別標(biāo)志,通過 ioctl 接口通知驅(qū)動(dòng)層對應(yīng) frame index 的 buffer 使用完畢;
3.調(diào)試舉例
常見調(diào)用獲取幀失敗,可通過 logcat 查看對應(yīng)的 buffer 狀態(tài),并通過分析對應(yīng)的 buffer 狀態(tài)信息,可以定位問題的出錯(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
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。