由bash中的GPIO状态更改触发

时间:2016-11-22 17:22:12

标签: linux bash gpio sysfs

我有一个GPIO引脚,其值在sysfs节点/sys/class/gpio/gpioXXXX/value中表示),我想检测此GPIO引脚值的变化。根据{{​​3}},您应该使用the sysfs documentationpoll(2)

但是,pollmessage似乎只能作为系统调用而不是来自bash。是否有某种方法可以通过bash脚本中的GPIO引脚功能状态更改来触发?

我的目的是没有(半)忙碌等待或用户状态轮询。我还想从bash中简单地做到这一点,而不必考虑另一种语言。我不打算在整个项目中坚持使用bash,但我确实想在第一个版本中使用它。编写一个简单的C程序,可以从bash调用这个可能性,但在此之前,我想知道我是不是错过了什么。

1 个答案:

答案 0 :(得分:2)

是的,你需要一个C或Python帮助器 - 你可能会考虑完全放弃这个项目的bash。

请参阅this gist以获取此类帮助程序的实现(名为“wfi”,“watch-for-interrupt”,根据a Raspberry Pi StackExchange question的答案进行修改。

那说:

如果你想(半)有效地拥有一个用于GPIO信号变化的shell脚本监视器,你将需要一个使用poll()的C助手,并在发生值得注意的变化时写入stdout。鉴于此,您可以编写类似于以下内容的shell循环:

while IFS= read -r event; do
  echo "Processing $event"
done < <(wfi /sys/class/gpio/gpioXXXX/value)

以这种方式使用流程替换可确保您的monitor-gpio-signal帮助程序的启动成本仅支付一次。请注意一些警告:

  • 特别是如果循环体内的任何内容调用外部命令(而不是单独依赖shell内置函数),这仍然比使用C,Go甚至是其他程序编写的程序慢得多 - 相对慢的语言,如Python。

  • 如果shell脚本尚未准备好接收写入,则该写入可能会无限期地阻塞。像pv这样的工具可能对管道添加缓冲区很有用:

    done < <(wfi "name" | pv -q -B 1M)
    
    例如,

    将建立1MB缓冲区。