我在Raspberry Pi(嵌入式处理器板)上使用Raspbian(一种linux的一种类型)上的Python来监视GPIO输入。在
请参阅下面我的代码的简化版本。我在python脚本中有一个无限循环,等待GPIO I/p上发生什么。这是正确的方法吗?一、 这是否意味着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
是的,做
while True: pass
将消耗100%的CPU(或尽可能接近它)什么都不做。在据我所知(希望这是记录在某个地方),这个零售物价指数模块生成一个等待GPIO的后台线程,并为每个事件调用您的
callback
函数。所以你的主线真的没有什么关系。如果您希望它作为服务运行,请使其sleep
长时间运行。如果您想以交互方式运行它(在这种情况下,您可能希望它更容易取消),sleep
的时间更短,可能是0.5秒,并添加一些退出循环的方法。在如果您可以在主线程中执行GPIO
select
,或者获得一个可以join
的GPIO后台线程的句柄,这两种方法都不会消耗任何CPU,那就更好了。然而,这个模块的设计并不是为了让它变得简单。在{1}不过,这是一种方法。假设您可以循环
GPIO.wait_for_edge
,而不是设置回调。但是如果没有文档,也没有自己测试的设备,我不确定我是否会向新手推荐这个。在同时:
好吧,虽然你的线程没有做任何事情,GPIO后台线程似乎正在等待}不会让它错过事件。(根据名称,
select
,并且{wait_for_edge
函数听起来可能是边缘触发的,而不是级别触发的,这也是我谨慎推荐它的部分原因。)相关问题 更多 >
编程相关推荐