加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-16 21:49:43 所属栏目:Python 来源:网络整理
导读:我在Raspberry Pi(嵌入式处理器板)上的Raspbian(一种Linux)上使用Python来监控GPIO输入. 请参阅下面的代码的简化版本.我在python脚本中有一个无限循环,等待GPIO i / p上发生的事情.这是正确的方法吗?即这是否意味着CPU正在全速运行,只是绕过这个循环,没有其

我在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函数听起来可能是边缘触发而不是电平触发,但这是我担心推荐它的部分原因.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读