python – 无限循环服务GPIO的效率
我在Raspberry Pi(嵌入式处理器板)上的Raspbian(一种Linux)上使用Python来监控GPIO输入. 请参阅下面的代码的简化版本.我在python脚本中有一个无限循环,等待GPIO i / p上发生的事情.这是正确的方法吗?即这是否意味着CPU正在全速运行,只是绕过这个循环,没有其他东西的CPU周期?特别是因为我需要并行运行其他东西(例如浏览器). 如果CPU忙于做其他事情并且GPIO i / p发生变化,会发生什么? GPIO事件是否存储在某处,以便最终得到服务,或者它是否会丢失? 有没有更好的方法呢? (对于你的答案,请注意我是linux的新手,而且是对python和实时编程的新手)
最佳答案
是的,在执行True时:pass会烧掉100%的CPU(或尽可能接近它),什么也不做.
根据我的理解(希望这在某处记录),RPi.GPIO模块产生一个后台线程,它等待GPIO并为每个事件调用你的回调函数.所以你的主线程真的无关紧要.如果您希望将其作为服务运行,请让它长时间休眠.如果你想以交互方式运行它(在这种情况下你可能希望它更容易取消),睡眠时间较短,可能是0.5秒,并添加一些方法来退出循环. 如果你可以在主线程中进行GPIO选择,或者获得你可以加入的GPIO后台线程的句柄,那就更好了,其中任何一个都不会烧掉任何CPU.但是,该模块似乎并没有以简化方式设计. 但是,查看the source,有一个wait_for_edge方法.大概你可以循环GPIO.wait_for_edge而不是设置回调.但是没有文档,没有设备可以自己测试,我不确定我是否想向新手推荐这个. 与此同时:
好吧,虽然你的线程没有做任何事情,但是GPIO后台线程似乎在等待select,并且select不会让它错过任何事件. (根据名称,wait_for_edge函数听起来可能是边缘触发而不是电平触发,但这是我担心推荐它的部分原因.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |