我喜歡採樣由Raspberry Pi的引腳生成的信號。我取得了高採樣率難以實現的經驗。什麼是最好的方式來在Linux下采樣週期gpio引腳?
首先我用Python(超慢)做了一個快速的方法。然後我改爲ANSI C + bcm2835.h lib。我獲得了顯着的業績增長。
現在我問自己這個問題:如何在Linux下做最好的採樣?
我的嘗試是在用戶空間進行的。但是,切換到內核空間呢?我可以寫一個簡單的字符設備內核模塊。在這個模塊中,定期檢查引腳。如果狀態改變了一些信息被放入緩衝區。該I/O緩衝區由用戶空間中的應用程序讀取的同步文件進行輪詢。對我來說,最好的解決方案是,如果引腳檢查可以用固定頻率完成(採樣週期對於信號處理應該是恆定的)。
的設置爲,這可能是:
@kernel:字符模塊+內核線程+ GPIO設備樹接口+ DSP以恆定的採樣時間
@user空間:I/O的應用程序從讀出的同步字符模塊
想法/提示?
如果您在GPIO更改時可以使用某種中斷,那麼在內核中執行此操作將會非常有用。如果你要編寫一個內核模式的線程,那麼你在用戶空間中的實時線程會更好。 – rodrigo
如果你想在用戶空間中這樣做,你需要確保你有最近的內核並安裝了'libgpiod'。 – 0andriy
libgpiod正在使用「gpio.h」內核接口。字符模塊像文件一樣從引腳讀取。 ppoll + timeout用於驗證是否發生更改。 lib bcm2845正在使用存儲器映射來訪問GPIO寄存器。我認爲這是最快的方法,因爲mmu僅將邏輯地址轉換爲物理地址。 使用mmap在檢查引腳時避免了設備層。讀取循環內存的一部分的組合mmap +線程是什麼? –