无限循环服务GPI的效率

2024-09-22 14:39:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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

Tags: 方法代码版本类型gpiolinuxchannelpi
1条回答
网友
1楼 · 发布于 2024-09-22 14:39:05

是的,做while True: pass将消耗100%的CPU(或尽可能接近它)什么都不做。在

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

如果您可以在主线程中执行GPIO select,或者获得一个可以join的GPIO后台线程的句柄,这两种方法都不会消耗任何CPU,那就更好了。然而,这个模块的设计并不是为了让它变得简单。在

{1}不过,这是一种方法。假设您可以循环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,并且{}不会让它错过事件。(根据名称,wait_for_edge函数听起来可能是边缘触发的,而不是级别触发的,这也是我谨慎推荐它的部分原因。)

相关问题 更多 >