Entonces tengo un script en Python que emula ESC_KEY en el pin 17 (Raspberry Pi).
#!/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)
¿Existe una manera "fácil" de configurar esto como un módulo del kernel, o alguien tiene buena documentación para crear este módulo del kernel? ¿Necesito reescribirlo usando C?
Parece que esto consume muchos recursos cuando se ejecuta en Python, espero que suponga una menor carga para el sistema cuando se ejecuta como módulo.
Respuesta1
¿Existe una manera "fácil" de configurar esto como un módulo del kernel?
Probablemente no. Además, eso podría ir en contra de los buenos principios de diseño, porque lo que tienes parece más una aplicación de espacio de usuario; De todos modos, hay un controlador de kernel al acecho en segundo plano. 1
Parece que esto está consumiendo muchos recursos cuando se ejecuta en Python.
Teniendo en cuenta que duerme la mayor parte del tiempo, no es una buena señal; tal vez deberías ser más específico. Lo que he hecho con los pines rpi es todo I2C basado en C o C++ usando la interfaz del kernel, y algo simple como esto no ocuparía más de 1 MB RSS ni consumiría ningún tiempo de CPU notable.
¿Necesito reescribirlo usando C?
Reescribiéndolo enespacio de usuarioC podría resolver su problema, si el problema son los recursos (código de espacio del kernel WRT, sí, eso es solo C y asm). Sin embargo, Python no debería ser tan malo: obviamente no hay ningún problema de rendimiento aquí. Nuevamente, deberías describir el problema con más detalle.
El módulo RPi.GPIO está escrito en C, quizás quieras echarle un vistazo. Sin embargo, en mi opinión, si aún no conoces el idioma y no tienes interés en él, no vale la pena aprenderlo solo por esto.
También puedes intentar usar el (agnóstico del idioma)interfaz del kernel existenteen Python directamente, en lugar de RPi.GPIO; es simplemente una cuestión de leer y escribir en nodos de archivos en /sys/class/gpio
. Encontrarás más cosas sobre eso en línea si buscas y en elintercambio de frambuesa pi. El hack de DMA mencionado en la nota al piepuedeTienes una ventaja sobre esto si intentas hacer cosas a una frecuencia muy alta, pero ese no es el caso aquí (y tengo dudas sobre qué tan útil sería realmente en este sentido, porque sigue siendo una entidad pura de usuario). y sujeto a la latencia del kernel).
1 En realidad, eso no es cierto en este caso: RPi.GPIO usa unHack de dirección de memoria directa como este; Creo que los módulos de cableado Pi de nivel C también funcionan de esta manera. Eso es algo queharíaHaga un buen módulo del kernel, excepto que el kernel ya tiene un módulo gpio con una interfaz de usuario. Me imagino que la justificación para el hackeo de DMA es queparecemás eficiente (y más interesante de escribir).