2016-11-22 36 views
1

GPIO状态变化触发我有一个GPIO引脚,其价值已在sysfs节点/sys/class/gpio/gpioXXXX/value)表示,我想检测改变该GPIO引脚的价值。根据the sysfs documentation你应该使用poll(2)select(2)为此。获得通过在bash

但是,pollmessage只能用作系统调用,而不能用于bash。有没有一种方法可以用来通过bash脚本中GPIO引脚功能的状态变化来触发?

我的目的是不具有(半)忙等待或用户级轮询。我也想简单地从bash做到这一点,而不必浸入其他语言。我并不打算在整个项目中坚持使用bash,但我确实希望在第一个版本中使用它。编写一个简单的C程序,可以从bash中调用这个功能,但在这之前,我想知道我是否没有错过任何东西。

+1

简称:你不会失去了一些东西;如果不使用外部软件(或者为bash添加一个可加载模块并添加一个内置命令),poll()不是直接可用的。 –

+0

......说,如果表现是主要目标,我可能会建议你考虑放弃bash。这当然可以写更有效的shell脚本比大多数人做的(当然也有更快的炮弹比bash)的,但仍然对如何高性能他们将永远是一个上限,而上限仍然是waaaay低于点担心什么样的中断正在使用是相关的。 –

+0

我没有关于如何使用'poll()'的建议,但是如果这个gpio值在文件系统级别是可见的,那么'tail -F'可能会把这个改变发送到标准输出吗?如果是这样,一个超级简单的解决方案,如[this](http:// stackoverflow。com/a/10958125/1072112)可能会做。 – ghoti

回答

2

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

这样一个帮手的实现(名为“WFI”,“手表的中断”,从a Raspberry Pi StackExchange question的回答修改见this gist


那说:

如果您希望以(半)有效地对GPIO信号变化的shell脚本监控,你会希望有使用poll()和写入,每当一个值得注意的变化发生的stdout一个C帮手。鉴于这种情况,你就可以写一个shell循环类似于以下内容:

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

使用进程替换确保您monitor-gpio-signal帮手启动成本仅支付一次。注意一些注意事项:

  • 特别是如果你的循环体内部的任何调用外部命令(而不是单独依靠shell内建命令),这仍然会比用C语言编写的程序慢得多,转到甚至是相对较慢的语言,如Python。

  • 如果shell脚本是没有准备好接收写入,该写入可能会阻塞无限期地进行下去。一个工具,如pv可以到缓冲区添加到您的管道是有用的:

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

    ...例如,将建立一个1MB缓存。

+0

我编辑了关于性能的部分(用更精确地涵盖我的意思的东西代替它)。这个答案绝对是有趣的,但是性能确实不是一个很大的挑战,但我不会像它在这里那样让它驱动整个设计。 – Jasper