我有一个GPIO引脚,其值在sysfs节点/sys/class/gpio/gpioXXXX/value
中表示),我想检测此GPIO引脚值的变化。根据{{3}},您应该使用the sysfs documentation或poll(2)。
但是,poll
和message
似乎只能作为系统调用而不是来自bash。是否有某种方法可以通过bash脚本中的GPIO引脚功能状态更改来触发?
我的目的是没有(半)忙碌等待或用户状态轮询。我还想从bash中简单地做到这一点,而不必考虑另一种语言。我不打算在整个项目中坚持使用bash,但我确实想在第一个版本中使用它。编写一个简单的C程序,可以从bash调用这个可能性,但在此之前,我想知道我是不是错过了什么。
答案 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缓冲区。