2016-11-22 64 views
1

GPIO狀態變化觸發我有一個GPIO引腳,其價值已在sysfs節點/sys/class/gpio/gpioXXXX/value)表示,我想檢測改變該GPIO引腳的價值。根據the sysfs documentation你應該使用poll(2)select(2)爲此。獲得通過在bash

但是,pollmessage只能用作系統調用,而不能用於bash。有沒有一種方法可以用來通過bash腳本中GPIO引腳功能的狀態變化來觸發?

我的目的是不具有(半)忙等待或用戶級輪詢。我也想簡單地從bash做到這一點,而不必浸入其他語言。我並不打算在整個項目中堅持使用bash,但我確實希望在第一個版本中使用它。編寫一個簡單的C程序,可以從bash中調用這個功能,但在這之前,我想知道我是否沒有錯過任何東西。

+1

簡稱:你不會失去了一些東西;如果不使用外部軟件(或者爲bash添加一個可加載模塊並添加一個內置命令),poll()不是直接可用的。 –

+0

......說,如果表現是主要目標,我可能會建議你考慮放棄bash。這當然可以寫更有效的shell腳本比大多數人做的(當然也有更快的炮彈比bash)的,但仍然對如何高性能他們將永遠是一個上限,而上限仍然是waaaay低於點擔心什麼樣的中斷正在使用是相關的。 –

+0

我沒有關於如何使用'poll()'的建議,但是如果這個gpio值在文件系統級別是可見的,那麼'tail -F'可能會把這個改變發送到標準輸出嗎?如果是這樣,一個超級簡單的解決方案,如[this](http:// stackoverflow。com/a/10958125/1072112)可能會做。 – ghoti

回答

2

是的,你需要一個C或Python的幫手 - 你可能會想放棄bash的這個項目完全。

這樣一個幫手的實現(名爲「WFI」,「手錶的中斷」,從a Raspberry Pi StackExchange question的回答修改見this gist


那說:

如果您希望以(半)有效地對GPIO信號變化的shell腳本監控,你會希望有使用poll()和寫入,每當一個值得注意的變化發生的stdout一個C幫手。鑑於這種情況,你就可以寫一個shell循環類似於以下內容:

這樣
while IFS= read -r event; do 
    echo "Processing $event" 
done < <(wfi /sys/class/gpio/gpioXXXX/value) 

使用進程替換確保您monitor-gpio-signal幫手啓動成本僅支付一次。注意一些注意事項:

  • 特別是如果你的循環體內部的任何調用外部命令(而不是單獨依靠shell內建命令),這仍然會比用C語言編寫的程序慢得多,轉到甚至是相對較慢的語言,如Python。

  • 如果shell腳本是沒有準備好接收寫入,該寫入可能會阻塞無限期地進行下去。一個工具,如pv可以到緩衝區添加到您的管道是有用的:

    done < <(wfi "name" | pv -q -B 1M) 
    

    ...例如,將建立一個1MB緩存。

+0

我編輯了關於性能的部分(用更精確地涵蓋我的意思的東西代替它)。這個答案絕對是有趣的,但是性能確實不是一個很大的挑戰,但我不會像它在這裏那樣讓它驅動整個設計。 – Jasper