python – 无限循环服务GPIO的效率

前端之家收集整理的这篇文章主要介绍了python – 无限循环服务GPIO的效率前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我在Raspberry Pi(嵌入式处理器板)上的Raspbian(一种Linux)上使用Python来监控GPIO输入.

请参阅下面的代码的简化版本.我在python脚本中有一个无限循环,等待GPIO i / p上发生的事情.这是正确的方法吗?即这是否意味着cpu正在全速运行,只是绕过这个循环,没有其他东西的cpu周期?特别是因为我需要并行运行其他东西(例如浏览器).

如果cpu忙于做其他事情并且GPIO i / p发生变化,会发生什么? GPIO事件是否存储在某处,以便最终得到服务,或者它是否会丢失?

有没有更好的方法呢?

(对于你的答案,请注意我是linux的新手,而且是对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
最佳答案
是的,在执行True时:pass会烧掉100%的cpu(或尽可能接近它),什么也不做.

根据我的理解(希望这在某处记录),RPi.GPIO模块产生一个后台线程,它等待GPIO并为每个事件调用你的回调函数.所以你的主线程真的无关紧要.如果您希望将其作为服务运行,请让它长时间休眠.如果你想以交互方式运行它(在这种情况下你可能希望它更容易取消),睡眠时间较短,可能是0.5秒,并添加一些方法退出循环.

如果你可以在主线程中进行GPIO选择,或者获得你可以加入的GPIO后台线程的句柄,那就更好了,其中任何一个都不会烧掉任何cpu.但是,该模块似乎并没有以简化方式设计.

但是,查看the source,有一个wait_for_edge方法.大概你可以循环GPIO.wait_for_edge而不是设置回调.但是没有文档,没有设备可以自己测试,我不确定我是否想向新手推荐这个.

与此同时:

Also what happens if the cpu is busy doing something else and a GPIO i/p changes? Does the GPIO event get stored somewhere so it is eventually serviced,or does it just get lost?

好吧,虽然你的线程没有做任何事情,但是GPIO后台线程似乎在等待select,并且select不会让它错过任何事件. (根据名称,wait_for_edge函数听起来可能是边缘触发而不是电平触发,但这是我担心推荐它的部分原因.)

猜你在找的Python相关文章