嘉立創分了適配層和OSD(我稱它為圖片層)顧名思義,一個是能顯示視頻流到LCD屏幕,一個是只能顯示照片,也就是你可以對不同層進行操作而不影響其他層,解決的場景就是用于你畫了一個正方形在照片上,你現在不想要了,你刪去那個正方形會導致你的拍攝圖片缺了一塊成為白色,這是因為你山區的就是那個像素點,你沒有記錄之前的像素點那就恢復不回去了,所以圖像多層可以解決因為他兩層之間毫不相關,你刪去一層里的東西?不會影響其他層,其實若果你的圖像實時更新的也可以覆蓋的層刪正方形的缺口,但是不是很保險,所以有了多層顯示
這時候又出現一個bind_layer函數?
目前這個函數好像只能綁定視頻流,圖片不能綁定但能show_images到指定層
Display.bind_layer(**sensor_bind_info, layer = Display.LAYER_VIDEO1)
詳細文章:
嘉立創廬山派K230程序加速,解決卡頓思想總結-CSDN博客
他的作用是:可以讓我正在死循環中或者延時里都能持續顯示圖像,相當于多了一個線程,
bind_layer
函數通過硬件 DMA 或操作系統任務調度實現了視頻的異步顯示,使主線程能夠在死循環或延時中繼續執行其他任務,而視頻顯示不受影響。這是嵌入式系統中處理實時性任務(如視頻、音頻)的常見設計模式,本質上是利用硬件或系統的并行能力,而非真正的多線程。理解這一機制有助于優化系統資源,避免因主線程阻塞導致的顯示卡頓。
所以如果你綁定視頻流到lcd display,那以后你除非想要擁有拍攝的照片用來做某些分析操作的時候才需要調用sensor.snapshot 你顯示函數也是只需要你想把你操作完的結果顯示在lcd上時才調用show_image 其他情況下你都可以不用用它兩就能實時顯示圖像到lcd了且不懼怕任何中斷延時死循環還節省軟件資源因為用了dma完全由硬件接管
實際案例:
1.將圖像通道零的視頻流綁定到lcd的display去
他這個綁定好象只能綁定小于RGB888大小的eg:RGB565?YUV420不然會報錯太大
創建OSD圖像:
然后在while中snapshot拍攝攝像頭圖像(也就是提取綁定好的視頻流中的一幀)去完成一些視覺檢測山的算法
最后將結果保留在IMAGE OSD照片上最后將照片顯示在OSD層蓋住綁定視頻流顯示在LCD上
這樣你對照片的操作就不會影響到視頻的顯示而且完全不怕延時死循環
詳細解釋:
一、綁定視頻流與 DMA 硬件接管的核心機制
當通過bind_layer將視頻流綁定到 LCD 顯示時,系統會利用DMA(直接內存訪問)機制建立硬件級的數據傳輸通道,實現以下效果:
數據傳輸與顯示的硬件化:
攝像頭采集的視頻數據通過 DMA 直接從傳感器緩沖區傳輸到 LCD 顯存,無需 CPU 干預。
顯示控制器(如 LCD 驅動 IC)周期性讀取顯存數據并刷新屏幕,形成持續的視頻流顯示。
與sensor.snapshot()和show_image()的本質區別:
snapshot():主動捕獲一幀圖像(軟件觸發),需 CPU 參與數據讀取。
show_image():將處理后的圖像數據寫入顯存(軟件控制),需 CPU 占用時間。
綁定 + DMA 模式:數據傳輸由硬件自動循環執行,CPU 僅需在初始化時配置參數,后續完全脫離顯示流程。
二、為何無需調用snapshot和show_image即可實時顯示?
傳統顯示流程的局限性:
plaintext
軟件調用snapshot() → CPU讀取圖像數據 → 軟件處理圖像 → 調用show_image() → CPU寫入顯存 → 顯示刷新 ?
每幀顯示都需 CPU 全程參與,若 CPU 陷入死循環或延時,顯示會卡頓。
DMA 綁定后的流程優化:
plaintext
初始化bind_layer() → DMA自動建立「攝像頭緩沖區→LCD顯存」傳輸通道 → 顯示控制器周期性刷新顯存 ?
關鍵變化:CPU 僅在初始化時配置 DMA 參數(如源地址、目標地址、傳輸大小),后續每幀數據的傳輸和顯示由硬件自動完成,與 CPU 狀態無關(即使 CPU 進入死循環,DMA 仍持續工作)。
三、DMA 接管的優勢與適用場景
資源節省與實時性提升:
CPU 占用率降低:傳統方案中 CPU 需處理每幀圖像的讀取和寫入,而 DMA 模式下 CPU 可專注于其他任務(如算法處理、通信控制)。
抗干擾能力強:中斷、延時、死循環等軟件層面的阻塞不會影響 DMA 傳輸,確保顯示流暢(例如,在處理傳感器數據的同時,LCD 仍實時顯示視頻)。
適用場景:
實時監控系統:需持續顯示攝像頭畫面,同時 CPU 處理報警邏輯、數據上傳等任務。
資源受限的嵌入式設備:如單片機(STM32、ESP32),需在有限 RAM 和 CPU 算力下實現視頻顯示。
低功耗應用:DMA 傳輸功耗遠低于 CPU 參與的數據搬運,適合電池供電設備。
四、何時仍需調用snapshot和show_image?
需要處理單幀圖像時:
例如,抓拍照片用于 AI 分析(如人臉識別、物體檢測),此時需用snapshot()獲取特定時刻的圖像數據。
顯示非實時內容時:
如顯示 UI 界面、處理后的圖像(如添加文字標注、濾鏡效果),需用show_image()將軟件處理后的結果寫入顯存。
多圖層混合顯示:
若需在視頻流上疊加菜單、數據圖表等 UI 元素,通常需要:
視頻流通過 DMA 綁定到底層顯示層(如 LAYER_VIDEO)。
UI 元素通過show_image()繪制到頂層顯示層(如 LAYER_UI),實現圖層疊加。
五、總結:DMA 綁定的技術本質
通過bind_layer實現的實時顯示,本質是將「軟件驅動顯示」轉換為「硬件驅動顯示」:
傳統方案:軟件是顯示的 “主動執行者”(調用函數控制每一步)。
DMA 方案:軟件僅作為 “配置者”(初始化綁定參數),硬件成為顯示的 “主動執行者”(DMA + 顯示控制器自動循環)。
這種模式充分利用了硬件并行處理能力,在嵌入式系統中是平衡性能、功耗和開發效率的優選方案。