應用背景
在 ARM 和 FPGA 之間通信的通信過程中,通信開始或者完成時,需要實時通知對方,如果 ARM 使用類似 while (1) 循環進行反復查看標志位,會造成 CPU 空轉,影響工作效率。如果使用中斷加內核驅動的方式,雖然可以提高效率,但這對開發驅動的工程師有較高的技術要求,因為內核驅動運行在內核態,一旦出現錯誤,可能會造成整個內核的崩潰,因此需要一種既高效又不依賴復雜內核驅動的解決方案。
UIO 簡介
UIO (Userspace I/O) 是運行在用戶空間的 I/O 技術,Linux 系統中一般的驅動設備都是運行在內核空間,應用程序在用戶空間調用即可。UIO 則是將驅動的小部分運行在內核空間,在用戶空間實現驅動的絕大多數功能,使用 UIO 可以避免設備的驅動程序需要隨著內核的更新而更新的問題。
相比傳統內核態驅動,UIO 的優勢包括:
簡化了驅動開發流程,降低了內核崩潰的風險
避免了因內核版本更新而需要同步更新驅動的問題
支持用戶空間直接訪問硬件,提高開發靈活性和效率
圖1 UIO 驅動的內核部分、用戶空間部分和 UIO 框架以及內核的關系
實現方案及步驟
配置內核設備樹
首先對設備樹節點進行修改,將設備的 compatible 屬性設置為 generic-uio,以加載通用 UIO 驅動,如下圖 (圖2) 所示:
圖2 將設備的 compatible 屬性設置為 generic-uio
配置內核
Linux 內核中已有 UIO 驅動,但是我們需要使能,才能在內核啟動。根據內核設備樹,加載相應的驅動。具體的內核增加的配置,參考下圖 (圖3):
圖3 增加的內核驅動配置
應用層使用
下圖 (圖4) 為大家提供一套相對完整的參考代碼:
圖4 應用層使用參考代碼
說明
在步驟 3 中,read 為阻塞讀。設備沒有讀到數值,該線程進入阻塞態。待時機合適,立馬進入運行態。在進入阻塞態,釋放處理器的占用。待有數值以后,處理器立馬進入運行態,如此即可高效完成工作任務。
UIO 框架說明
Linux UIO 框架的代碼位于內核源碼 drivers/uio/uio.c。Linux UIO 框架也會調用內核提供的其他 API 接口函數。通過一個設備文件和幾個 sysfs 屬性文件訪問 UIO 設備。第一個設備的設備文件被稱為 /dev/uio0,后續的設備被稱為 /dev/uio1、/dev/uio2 等。
中斷是通過讀取 /dev/uioX 來處理的。一旦中斷發生,來自 /dev/uioX 的 blocking read () 將立即返回。除此以外,也可以在 /dev/uioX 上使用 select() 來等待中斷。從 /dev/uioX 讀取的整數值表示總的中斷數,可以使用這個數來計算是否錯過了一些中斷。
優勢與總結
使用 UIO 框架實現 ARM 和 FPGA 的高效通信,不僅減少了 CPU 的資源占用,還降低了開發門檻,提升了系統穩定性。通過用戶空間完成大部分驅動邏輯,既實現了高效中斷處理,又簡化了驅動維護,是一種高效可靠的通信方案。
本文主要介紹如何通過 UIO 技術,在 ARM 與 FPGA 通信中利用用戶態實現高效中斷處理,避免內核驅動的復雜性和風險。
-
FPGA
+關注
關注
1634文章
21818瀏覽量
607208 -
ARM
+關注
關注
134文章
9194瀏覽量
370206 -
通信
+關注
關注
18文章
6096瀏覽量
136634 -
Linux
+關注
關注
87文章
11358瀏覽量
210868
原文標題:基于 Linux UIO 的高效 ARM-FPGA 通信中斷處理方案
文章出處:【微信號:駿龍電子,微信公眾號:駿龍電子】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
FPGA linux 以太網 ARM
ARM-Linux平臺實現多種FPGA芯片的程序加載
一種基于ARM-Linux的FPGA程序加載方法
Linux環境下實現ARM9的CAN總線通信

Linux環境下實現基于ARM9的CAN總線通信

Zynq UltraScale+ MPSoC 上的多個Linux UIO設計

基于FPGA的ARM并行總線和端口設計

浪潮發布全球首個FPGA高效計算框架
浪潮全球首發完整方案的FPGA高效計算框架
如何在 Vitis 中使用 UIO 驅動框架創建簡單的 Linux 用戶應用
基于OpenAMP框架的雙核ARM通信案例
一文詳解Linux UIO技術

評論