2017-05-27 131 views
0

我喜歡採樣由Raspberry Pi的引腳生成的信號。我取得了高採樣率難以實現的經驗。什麼是最好的方式來在Linux下采樣週期gpio引腳?

首先我用Python(超慢)做了一個快速的方法。然後我改爲ANSI C + bcm2835.h lib。我獲得了顯着的業績增長。

現在我問自己這個問題:如何在Linux下做最好的採樣?

我的嘗試是在用戶空間進行的。但是,切換到內核空間呢?我可以寫一個簡單的字符設備內核模塊。在這個模塊中,定期檢查引腳。如果狀態改變了一些信息被放入緩衝區。該I/O緩衝區由用戶空間中的應用程序讀取的同步文件進行輪詢。對我來說,最好的解決方案是,如果引腳檢查可以用固定頻率完成(採樣週期對於信號處理應該是恆定的)。

的設置爲,這可能是:

@kernel:字符模塊+內核線程+ GPIO設備樹接口+ DSP以恆定的採樣時間

@user空間:I/O的應用程序從讀出的同步字符模塊

想法/提示?

+1

如果您在GPIO更改時可以使用某種中斷,那麼在內核中執行此操作將會非常有用。如果你要編寫一個內核模式的線程,那麼你在用戶空間中的實時線程會更好。 – rodrigo

+1

如果你想在用戶空間中這樣做,你需要確保你有最近的內核並安裝了'libgpiod'。 – 0andriy

+0

libgpiod正在使用「gpio.h」內核接口。字符模塊像文件一樣從引腳讀取。 ppoll + timeout用於驗證是否發生更改。 lib bcm2845正在使用存儲器映射來訪問GPIO寄存器。我認爲這是最快的方法,因爲mmu僅將邏輯地址轉換爲物理地址。 使用mmap在檢查引腳時避免了設備層。讀取循環內存的一部分的組合mmap +線程是什麼? –

回答

1

我有一個解決方案給你。

我寫了這樣的模塊:

https://github.com/Appyx/gpio-reflect

您可以同步讀取來自GPIO引腳的任何信號。

您可以使用輸出並根據您的採樣率計算信號。 只需分割期間。

+0

該代碼正在檢測引腳的變化。這是基於事件的。我所問的問題是要在一個恆定的時基上採樣一個引腳(每100ms讀取引腳1,56和96)。儘管將引腳(文件源)與中斷連接似乎是最先進的解決方案。 @Appyx解決方案是基於http://derekmolloy.ie/kernel-gpio-programming-buttons-and-leds/ –

+1

亞我知道,但你可以採取發送的例子,只需更換gpio功能。最好的解決方案是使用hr_timer進行持續採樣,然後將值寫入讀取緩衝區。 – Appyx

+0

什麼更好 - 使用hrtimer而不是內核線程來定期讀/寫一個引腳? 可以在這裏找到一個很好的hrtimer示例:https://gist.github.com/maggocnx/5946907 –

相關問題