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

Linux環(huán)境下實現(xiàn)基于ARM9的CAN總線通信

Zynq UltraScale+ MPSoC 上的多個Linux UIO設(shè)計

基于FPGA的ARM并行總線和端口設(shè)計

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

基于Linux的ARM和單片機的串口通信設(shè)計

評論