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

标签 python real-time raspberry-pi

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

请参阅下面我的代码的简化版本。我在 python 脚本中有一个无限循环等待 GPIO i/p 上发生的事情。这是正确的方法吗? IE。这是否意味着 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(或尽可能接近它)什么都不做。

据我了解(希望这在某处有记录),RPi.GPIO 模块生成一个后台线程,等待 GPIO 并为每个事件调用您的 callback 函数。所以你的主线程真的没什么可做的。如果您希望它作为服务运行,请使其 sleep 很长一段时间。如果你想以交互方式运行它(在这种情况下你可能希望它更容易取消), sleep 更短的时间,可能是 0.5 秒,并添加一些退出循环的方法。

如果您可以在主线程中执行 GPIO select,或者获取您可以join 的 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 - 无限循环服务GPIO的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18157130/

相关文章:

linux - 使用树莓派直接读取以太网端口上的信号

python - 如何让用户在 python 中输入 true/false?

Python Pickle 不保存整个对象

java - iOS - JAVA 实现实时数据同步的最佳方法

javascript - 客户端浏览器的 Socket.IO 检测有时会失败

linux - startx 后自动运行脚本

python - Pandas 在相同事件但不同时间戳上展平时间序列数据帧

python - 在Python中比较两个不同字典中的值?

real-time - Apache Beam - 从开始到记录时间戳的聚合日期

html - 将 SSL/HTTPS 用于动态视频流