spi*_*nt0 5 python real-time raspberry-pi
我在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
Run Code Online (Sandbox Code Playgroud)
是的,while True: pass
什么都不做会消耗 100% 的 CPU(或尽可能接近它)。
据我了解(希望在某处记录),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
函数听起来可能是边沿触发而不是电平触发,然而,这也是我对推荐它持谨慎态度的部分原因。)