6

GPIO入力を監視するために、Raspberry Pi(組み込みプロセッサボード)のRaspbian(Linuxの一種)でPythonを使用しています。

以下の私のコードの簡略化されたバージョンを参照してください。GPIO i/p で何かが起こるのを待っている Python スクリプトに無限ループがあります。これは正しい方法ですか?つまり、これは、CPU がこのループを一周するだけでフル稼働していて、他のものに CPU サイクルが残っていないことを意味しますか? 特に、他のことを並行して実行する必要があるため(ブラウザなど)。

また、CPU が何か他のことをしているときにビジー状態になり、GPIO i/p が変更された場合はどうなりますか? GPIO イベントはどこかに保存されるので、最終的にはサービスが提供されますか?それとも失われるだけですか?

これを行うより良い方法はありますか?

(あなたの答えについては、私はLinuxが初めてで、v. Pythonとリアルタイムプログラミングが初めてであることに注意してください)

#!/usr/bin/python
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)

def ButtonHandler(channel):
    print "Button pressed " + str(channel)
    # do stuff here

GPIO.add_event_detect(16, GPIO.FALLING, callback=ButtonHandler, bouncetime=200)

while True:
    pass
4

1 に答える 1

5

はい、実行while True: passすると、何もせずに CPU の 100% (またはそれにできるだけ近く) が消費されます。

私が理解していることから (うまくいけば、これはどこかに文書化されています)、RPi.GPIO モジュールは、GPIO を待機し、callbackイベントごとに関数を呼び出すバックグラウンド スレッドを生成します。したがって、メインスレッドは実際には何もしません。これをサービスとして実行する場合はsleep、長期間実行します。インタラクティブに実行したい場合 (おそらくキャンセルしやすくしたい場合)、sleepより短い時間 (おそらく 0.5 秒) で、ループを終了する方法を追加します。

selectメイン スレッドで GPIO を実行するか、GPIO バックグラウンド スレッドへのハンドルを取得することができれば、さらに良いでしょうjoin。どちらも CPU をまったく消費しません。ただし、モジュールはそれを簡単にするように設計されているようには見えません。

しかし、ソースを見ると、wait_for_edge方法があります。GPIO.wait_for_edgeおそらく、コールバックを設定する代わりにループすることができます。しかし、ドキュメントがなく、自分でテストするデバイスがなければ、これを初心者に勧めたいとは思いません.

その間:

また、CPU が何か他のことをしているときにビジー状態になり、GPIO i/p が変更された場合はどうなりますか? GPIO イベントはどこかに保存されるので、最終的にはサービスが提供されますか?それとも失われるだけですか?

スレッドが何もしていない間、GPIO バックグラウンド スレッドは を待機しselectいるようで、selectイベントを見逃すことはありません。(名前に基づいて、そのwait_for_edge関数はレベル トリガーではなくエッジ トリガーのように聞こえますが、これは私がそれを推奨するのをためらっている理由の一部です.)

于 2013-08-10T00:14:12.797 に答える