探傷波形數據傳輸驅動程序設計
探傷波形數據傳輸驅動程序是驅動層數據平面的實現,在整個系統中具有重要的作用,它完成探傷波形數據從 FPGA 子系統到 ARM 子系統的傳送,并將探傷波形數據從 Linux 操作系統的內核空間傳送到用戶空間。由于系統的重復頻率為 50Hz,即每隔 20ms 有一幀探傷波形數據,所以該設備驅動對時間性要求相對較高。由于探傷波形數據傳輸驅動程序主要是從 FPGA的 FIFO 中讀取數據,完成數據傳輸功能,功能單一,所以可以在一個驅動模塊中實現。超聲波探傷系統將其定義為 FIFO 驅動模塊。
設備驅動的工作方式有查詢和中斷兩種方式,由于本系統硬件控制采樣的時序比較嚴格,每隔 20ms 有一幀波形數據到達,所以該設備驅動的工作方式采用中斷方式。
FPGA 硬件設備每隔 20ms 會完成探傷波形的采集和高速數字信號處理,并將一幀探傷波形數據存入 FIFO 然后通過硬件中斷信號通知 ARM 處理器。ARM 處理器接收到中斷信號后,由 Linux 操作系統負責處理中斷,并最終調用該設備驅動已經注冊的中斷服務程序。在中斷服務程序中完成從 FPGA 的FIFO 中讀取探傷波形數據到操作系統的內核空間。
FIFO 驅動模塊在中斷服務程序中完成從 FPGA 的 FIFO 中讀取波形數據到系統內核空間,然后需要用一種方式通知上層應用程序數據已到達。傳統的進程間通信機制包括管道(Pipe)和命名管道(Named Pipe)、信號(Signal)、報文傳遞(Message)、共享內存(Shared Memory)、信號量(Semaphore)以及套接字(Socket)等。由于 FIFO 驅動模塊中的中斷服務程序運行于中斷上下文,而不是進程上下文,所以除了信號之外,無法直接使用這些機制。信號不僅可以用于兩個進程之間進行通信,也可以用于內核與進程之間的通信,但內核只能向進程發送信號而不能接收信號。一般來說,信號是對“中斷”概念在軟件層次上的模擬,所以也稱為“軟中斷”。所以在 FIFO 驅動模塊中,通過向上層應用程序發送信號來通知上層應用程序數據已經到達。在 Linux 操作系統中,內核提供了異步通知機制,該機制即采用設備驅動發送信號的方法,實現設備驅動和應用程序之間的通信,這樣應用程序就不需要使用查詢來關注數據何時到達。