Do script Python ao módulo Kernel

Do script Python ao módulo Kernel

Então eu tenho um script python que emula um ESC_KEY no pino 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 uma maneira "fácil" de configurar isso como um módulo do kernel ou alguém tem alguma documentação boa para criar esse módulo do kernel? Preciso reescrevê-lo usando C?

Parece que isso está consumindo muitos recursos ao executar em python, espero que seja menos desgastante para o sistema quando executado como módulo.

Responder1

Existe uma maneira "fácil" de configurar isso como um módulo do kernel

Provavelmente não. Além disso, isso pode contrariar os bons princípios de design, porque o que você tem parece mais um aplicativo de espaço do usuário; de qualquer maneira, há um driver de kernel escondido em segundo plano. 1

Parece que isso está consumindo muitos recursos ao executar em python

Considerando que dorme a maior parte do tempo, isso não é um bom sinal; talvez você devesse ser mais específico. O que fiz com os pinos rpi é todo I2C baseado em C ou C++ usando a interface do kernel, e algo simples como isso não teria mais do que 1 MB de RSS ou usaria qualquer tempo de CPU perceptível.

Preciso reescrevê-lo usando C?

Reescrevendo-o emespaço do usuárioC pode resolver o seu problema, se o problema for de recursos (código WRT do kernelspace, sim, é apenas C e ASM). No entanto, python não deve ser tão ruim assim - obviamente não há problema de desempenho aqui. Novamente, você deve descrever o problema com mais detalhes.

O módulo RPi.GPIO está escrito em C, você pode querer dar uma olhada nisso. Porém, IMO se você ainda não conhece o idioma e não tem interesse nele, caso contrário, não vale a pena aprender só por isso.

Você também pode tentar usar o (independente de idioma)interface de kernel existentediretamente em python, em vez de RPi.GPIO; é simplesmente uma questão de ler e gravar em nós de arquivo no formato /sys/class/gpio. Você encontrará mais coisas sobre isso on-line se pesquisar e notroca de framboesa pi. O hack DMA mencionado na nota de rodapépoderiatenho uma vantagem sobre isso se você estiver tentando fazer coisas com uma frequência muito alta, mas esse não é o caso aqui (e tenho dúvidas sobre o quão útil isso realmente seria nesse sentido, porque ainda é uma entidade pura de userland e sujeito à latência do kernel).


1 Na verdade, isso não é verdade neste caso - RPi.GPIO usa umhack de endereço de memória direto como este; Acho que os módulos Pi de fiação de nível C também funcionam dessa maneira. Isso é coisa queseriafaça um bom módulo de kernel, exceto que o kernel já possui um módulo gpio com uma interface de usuário. Imagino que a justificativa para o hack do DMA seja queparecemais eficiente (e mais interessante de escrever).

informação relacionada