Linux: Timing-Problem beim gpio-Export

Erstellt am 27. März 2014  ·  9Kommentare  ·  Quelle: raspberrypi/linux

Wenn die folgenden drei Befehle einzeln von der Kommandozeile auf dem Raspberry Pi mit Raspbian (2014-01-07-wheezy-raspbian.zip) ausgeführt werden, dann werden sie erfolgreich ausgeführt:

pi<strong i="6">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/unexport
pi<strong i="7">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/export
pi<strong i="8">@raspberrypi</strong> ~ $ echo out > /sys/class/gpio/gpio23/direction 
pi<strong i="9">@raspberrypi</strong> ~ $ 

Wenn sie jedoch zusammen in derselben Zeile ausgeführt werden, gibt es einen Berechtigungsverweigerungsfehler:

pi<strong i="13">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/unexport; echo 23 > /sys/class/gpio/export; echo out > /sys/class/gpio/gpio23/direction
-bash: /sys/class/gpio/gpio23/direction: Permission denied
pi<strong i="14">@raspberrypi</strong> ~ $ 

Der Fehler "Berechtigung verweigert" tritt auf, weil "echo out > /sys/class/gpio/gpio23/direction" ausgeführt wird, bevor die Gruppe und die Berechtigungsbits für "/sys/class/gpio/gpio23/direction" auf die entsprechenden Werte gesetzt wurden . Die Gruppen- und Berechtigungsbits sind "root" und "-rw-r--r--", aber sie sollten "gpio" und "-rwxrwx---" sein.

Dieses Timing-Problem kann in der folgenden Befehlssequenz gesehen werden, die gpio 23 exportiert und den Inhalt von "/sys/class/gpio/gpio23/" zweimal auflistet. Die Ausgabe des ersten ls-Befehls unterscheidet sich stark von der Ausgabe des zweiten ls-Befehls. Sowohl die Gruppe als auch die Berechtigungen für alle Dateien haben sich geändert.

pi<strong i="19">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/unexport; echo 23 > /sys/class/gpio/export; ls -l /sys/class/gpio/gpio23/; ls -l /sys/class/gpio/gpio23/
total 0
-rw-r--r-- 1 root root 4096 Mar 27 21:51 active_low
-rw-r--r-- 1 root root 4096 Mar 27 21:51 direction
-rw-r--r-- 1 root root 4096 Mar 27 21:51 edge
drwxr-xr-x 2 root root    0 Mar 27 21:51 power
lrwxrwxrwx 1 root root    0 Mar 27 21:51 subsystem -> ../../../../class/gpio
-rw-r--r-- 1 root root 4096 Mar 27 21:51 uevent
-rw-r--r-- 1 root root 4096 Mar 27 21:51 value
total 0
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 active_low
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 direction
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 edge
drwxrwx--- 2 root gpio    0 Mar 27 21:51 power
lrwxrwxrwx 1 root gpio    0 Mar 27 21:51 subsystem -> ../../../../class/gpio
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 uevent
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 value

Ist dies ein Problem, das angegangen werden muss?

Hilfreichster Kommentar

Dies ist ein sehr ärgerliches Problem, das hässliche Problemumgehungen erfordert. Es hätte nicht geschlossen werden dürfen.

Alle 9 Kommentare

Ich habe gerade den obigen Beitrag editiert. Anfangs war keines der Vorkommen von "echo 23 > /sys/class/gpio/unexport" vorhanden. Der Unexport ist nur notwendig, um das gpio wieder in seinen ursprünglichen nicht exportierten Zustand zu versetzen.

Ich bekomme:

pi<strong i="6">@raspberrypi</strong>:~ $ ls -l /sys/class/gpio/
total 0
--w------- 1 root root 4096 Mar 27 17:41 export
lrwxrwxrwx 1 root root    0 Mar 27 17:41 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
--w------- 1 root root 4096 Mar 27 17:41 unexport
pi<strong i="7">@raspberrypi</strong>:~ $ echo 23 > /sys/class/gpio/unexport
-bash: /sys/class/gpio/unexport: Permission denied

was ich erwarten würde. Nur root hat die Berechtigung zum Zugriff auf /sys/class/gpio/unexport. Wenn pi dies versucht, wird ihm die Berechtigung verweigert.

Wenn ich zuerst "sudo su" ausführe, funktioniert der Befehl wie erwartet.

Das habe ich früher bei älteren Versionen oder Raspbian bekommen, aber am 2014-01-07-wheezy-raspbian bekomme ich:

pi<strong i="7">@raspberrypi</strong> ~ $ ls -l /sys/class/gpio/
total 0
-rwxrwx--- 1 root gpio 4096 Mar 28 16:58 export
lrwxrwxrwx 1 root gpio    0 Jan  1  1970 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
-rwxrwx--- 1 root gpio 4096 Mar 28 17:01 unexport
pi<strong i="8">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/export 
pi<strong i="9">@raspberrypi</strong> ~ $ 

Alles funktioniert einwandfrei und es gibt keine Fehler. Jeder in der Gruppe gpio hat die Berechtigung zum Zugriff auf /sys/class/gpio/export und pi ist ein Mitglied der Gruppe gpio.

pi<strong i="13">@raspberrypi</strong> ~ $ groups pi
pi : pi adm dialout cdrom sudo audio video plugdev games users netdev input spi gpio

uname gibt Folgendes aus:

pi<strong i="17">@raspberrypi</strong> ~ $ uname -a
Linux raspberrypi 3.10.34+ #661 PREEMPT Thu Mar 27 00:36:02 GMT 2014 armv6l GNU/Linux

Das Verhalten hat sich geändert, da wir einige Udev-Sachen von den Piface-Leuten verwenden. Sie haben Recht, Sie müssen warten, bis udev die Berechtigungen auf dem erstellten Gerät ändert. Dies ist eine Userspace-Sache, also nicht wirklich für dieses Repo, aber ich bin mir nicht sicher, ob es eine Möglichkeit gibt, es zu verbessern.

Funktioniert das?

echo 23 > /sys/class/gpio/unexport; echo 23 > /sys/class/gpio/export; sleep 1; echo out > /sys/class/gpio/gpio23/direction

@asb Ok, danke für die Info. Ich denke, ich werde den Code in onoff ändern, damit er auf die Änderung der Berechtigungen wartet. Der Vorteil besteht darin, dass Anwendungen, die onoff verwenden, Superuser-Probleme vermeiden können.

@popcornmix ja, das funktioniert, danke.

Ich kann einen Wert in der Erweiterung des GPIO-Berechtigungsprozesses in den Benutzerbereich sehen, aber diese Implementierung
hat die Semantik des Kernel-GPIO-Exportvorgangs beschädigt. Das Schreiben nach /sys/class/gpio/export
sollte warten, bis der User-Space-Prozess meldet, dass er seine Arbeit abgeschlossen hat, bevor der Schreibvorgang zurückkehrt.

Umgehungslösungen, die besagen, dass Benutzer einige Zeit warten müssen, bis sich die sysfs-Metadaten nach einem
Exportvorgänge sind sehr hässlich, da es keine richtige Wartezeit gibt. Umgehungsstrategie, die
sucht nach Änderungen in Metadaten (z. B. Gruppe auf gpio gesetzt) ​​sind unzureichend, da der Zweck der
Der Berechtigungsprozess für den Benutzerbereich ist flexibel - es könnte entscheiden, dass root die richtige Gruppe ist und keine Änderung
tritt ein.

Die semantische Änderung der Kernel-GPIO-Exportoperation ist ein Hindernis für portablen Code, nicht nur
zwischen Raspberry Pi und anderen Hardwareplattformen, aber auch zwischen verschiedenen Linux
Distributionen auf Raspberry Pi.

Einverstanden. Es liegt in der Verantwortung des Kernels, eine funktionierende sysfs-Implementierung bereitzustellen, und die Implementierung von Raspbian ist eindeutig auf hässliche Weise kaputt. Ich sehe nicht, wie dieses Problem als geschlossen markiert worden sein kann.

Dies ist ein sehr ärgerliches Problem, das hässliche Problemumgehungen erfordert. Es hätte nicht geschlossen werden dürfen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen