Vom Python-Skript zum Kernelmodul

Vom Python-Skript zum Kernelmodul

Ich habe also ein Python-Skript, das einen ESC_KEY auf Pin 17 (Raspberry Pi) emuliert.

#!/usr/bin/env python
#Imports for Pins,input
import RPi.GPIO as GPIO
import uinput
from time import sleep

#Setup
key_events=( uinput.KEY_ESC, )
device=uinput.Device(key_events)
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)

#MAIN
while True:
   GPIO.wait_for_edge(17,GPIO.FALLING)
   device.emit(uinput.KEY_ESC,1)
   sleep(2)
   device.emit(uinput.KEY_ESC,0)

Gibt es eine „einfache“ Möglichkeit, dies als Kernelmodul einzurichten, oder hat jemand eine gute Dokumentation zum Erstellen dieses Kernelmoduls? Muss ich es in C neu schreiben?

Es scheint, als würde dies eine Menge Ressourcen verbrauchen, wenn es in Python ausgeführt wird. Ich hoffe, dass es das System weniger belastet, wenn es als Modul ausgeführt wird.

Antwort1

Gibt es eine „einfache“ Möglichkeit, dies als Kernelmodul einzurichten

Wahrscheinlich nicht. Außerdem könnte das gegen gute Designprinzipien verstoßen, denn was Sie haben, sieht eher wie eine Userspace-Anwendung aus; im Hintergrund lauert sowieso ein Kerneltreiber. 1

Es scheint, als würde dies eine Menge Ressourcen verbrauchen, wenn es in Python ausgeführt wird

Wenn man bedenkt, dass es die meiste Zeit schläft, ist das kein gutes Zeichen. Vielleicht sollten Sie genauer sein. Das, was ich mit den RPI-Pins gemacht habe, ist alles I2C-basiert in C oder C++ unter Verwendung der Kernelschnittstelle, und so etwas Einfaches wie das hier würde nicht mehr als 1 MB RSS umfassen oder nennenswerte CPU-Zeit verbrauchen.

Muss ich es in C neu schreiben?

Umschreiben inBenutzerbereichC könnte Ihr Problem lösen, wenn das Problem Ressourcen sind (in Bezug auf Kernelspace-Code: ja, das ist nur C und ASM). Python sollte jedoch nicht so schlecht sein – hier gibt es offensichtlich kein Leistungsproblem. Auch hier sollten Sie das Problem genauer beschreiben.

Das RPi.GPIO-Modul ist in C geschrieben, vielleicht möchten Sie sich das mal ansehen. Wenn Sie die Sprache jedoch nicht bereits beherrschen und auch sonst kein Interesse daran haben, lohnt es sich meiner Meinung nach nicht, sie nur aus diesem Grund zu lernen.

Sie können auch versuchen, die (sprachenunabhängige)Vorhandene Kernelschnittstellein Python direkt, statt in RPi.GPIO; es geht einfach darum, aus Dateiknoten in zu lesen und in /sys/class/gpiodiese zu schreiben. Sie finden mehr dazu online, wenn Sie suchen und unterRaspberry Pi AustauschDer in der Fußnote erwähnte DMA-HackMaihätte einen Vorteil, wenn Sie versuchen, Dinge mit sehr hoher Frequenz zu tun, aber das ist hier nicht der Fall (und ich bin skeptisch, wie nützlich es in diesem Sinne wirklich wäre, weil es immer noch eine reine Userland-Entität ist und der Kernel-Latenz unterliegt).


1 Das ist in diesem Fall nicht der Fall - RPi.GPIO verwendet einendirekter Speicheradressen-Hack wie dieser; Ich denke, die C-Level-WiringPi-Module funktionieren auch so. Das ist Zeug, daswürdeein gutes Kernelmodul erstellen, außer dass der Kernel bereits ein GPIO-Modul mit einer Userland-Schnittstelle hat. Ich stelle mir vor, die Rechtfertigung für den DMA-Hack ist, dass esscheinteffizienter (und interessanter zu schreiben).

verwandte Informationen