1

我正在为 golang 中的 raspberryPi 编写一个类似 Arduino 的库。与 GPIO linux 内核 ABI 接口有两种主要方法,一种使用/sys/class/gpio/*(不推荐)或/dev/gpiochip[0-9]*. 我想使用后者,因为前者已被弃用。

我查看了一个名为 libgpiod 的库。代码很容易理解,但它的使用ioctl使得移植到 Golang 变得困难(尤其是因为我是初学者)。

我希望能够移植这条线:

rv = ioctl(fd, GPIO_GET_CHIPINFO_IOCTL, &info); //from libgpio lib/core.c ln:273.
4

1 回答 1

0

我想你会写:

rv, _, err := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd),
                              uintptr(GPIO_GET_CHIPINFO_IOCTL), 
                              uintptr(unsafe.Pointer(&syscallinfo)))

一个微妙的地方是将指针 (&syscallinfo) 转换为 uintptr 以在 syscall/ioctl 中使用;当像这样作为 1-liner 完成时,它将最终分配在正确的位置以在系统调用中使用。uintptr 是一个足够大的整数,对于指针值但实际上不是指针,通常不会被垃圾收集器视为对分配对象的引用,但在这种特殊情况下,它是。

(我改编自https://github.com/stapelberg/hmgo/blob/master/internal/gpio/reset.go并仔细阅读 Go 源代码库的相关位以查找正在使用的返回值的示例,以及我的工作让我对垃圾收集器(错误)的行为方式有所了解。)

于 2021-07-26T16:47:29.450 回答