如何在linux嵌入式系统上使用Golang管理I/O



我有一个linux嵌入式系统。我可以用shell命令管理I/O。此命令更改GPIO#48:的状态

/sys/class/gpio# echo 48 > /sys/class/gpio/export
/sys/class/gpio# echo out > /sys/class/gpio/gpio48/direction
/sys/class/gpio# echo high > /sys/class/gpio/gpio48/direction
/sys/class/gpio# echo low > /sys/class/gpio/gpio48/direction

如何使用Goland高效管理I/O?是否可以在不经过shell命令的情况下管理它们?

在Linux上,GPIO接口通过/sys/class/gpio层次结构中的sys文件系统导出,因此在您的shell示例中,您只需要将数据写入这些文件,例如:

// To export pin 48 (same as echo 48 > /sys/class/gpio/export)
ioutil.WriteFile("/sys/class/gpio/export", []byte("48"), 0666)
...

根据您的平台和需求,您可能需要考虑一些预先存在的软件包(例如,用于Raspberry Pi的go-rpio或比GPIO更通用、支持更多的periph)。

如果你想要比写sysfs文件更高效/更快的解决方案,你也可以考虑内存映射GPIO访问,基本上是通过内核给它的内存范围直接访问GPIO外围。这需要对目标平台有更深入的了解(了解其GPIO寄存器及其映射)。你可以在这篇博客文章中详细了解这种方法。

编辑:正如@0andrey在他的评论中指出的,gpiosyssfs是不赞成的。这适用于上面的Bash示例和我对如何在Go中做同样事情的回答。取而代之的是,引入了一个新的ABI和libgpiod来与之交互https://github.com/warthog618/gpiod.

最新更新