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

How to manage I/Os with Golang on linux embedded system?

我有一个 linux 嵌入式系统。我可以使用 shell 命令来管理 I/Os。此命令更改 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/Os?是否可以在不通过 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)
...

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

如果您想要比编写 sysfs 文件更多的 efficient/faster 解决方案,您还可以考虑内存映射 GPIO 访问,您基本上可以通过内核提供给它的内存范围直接访问 GPIO 外围设备。这需要对目标平台有更深入的了解(了解其 GPIO 寄存器及其映射)。您可以在 this blogpost.

中详细了解该方法

编辑:正如@0andriy 在他的评论中指出的 gpio syssfsdeprecated. That applies for both your Bash example above and my answer how to do same thing in Go. Instead a new ABI was introduced and libgpiod to interact with it. Go port is available here https://github.com/warthog618/gpiod.