Do script Python para o módulo Kernel [closed]

1

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 configurá-lo como um módulo do kernel, ou alguém tem alguma boa documentação para criar este módulo do kernel? Preciso reescrevê-lo usando C?

Parece que isso está consumindo muitos recursos quando executado em python, e espero que seja menos uma pressão no sistema quando executado como módulo.

    
por Stapper 24.06.2014 / 10:56

1 resposta

1

Is there an "easy" way to set this up as a kernel module

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

It seems as this is eating alot of resources when running in python

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

Do I need to rewrite it using C?

Reescrevê-lo no userspace C pode resolver o seu problema, se o problema for recursos (código kernelspace do WRT, sim, C e asm apenas). No entanto, python não deve ser tão ruim assim - obviamente não há problema de desempenho aqui. Mais uma vez, você deve descrever o problema com mais detalhes.

O módulo RPi.GPIO está escrito em C, você pode querer dar uma olhada nisso. No entanto, se você não conhece a língua e não se interessa por ela, não vale a pena aprender apenas para isso.

Você também pode tentar usar a interface de kernel existente diretamente no (independente do idioma) em python em vez de RPi.GPIO; é simplesmente uma questão de ler e escrever nos nós de arquivos em /sys/class/gpio . Você encontrará mais informações sobre isso on-line se pesquisar e na troca pi de framboesas . O hack DMA mencionado na nota de rodapé pode ter uma vantagem sobre isso se você estiver tentando fazer as coisas com uma frequência muito alta, mas esse não é o caso aqui (e estou em dúvida quanto à utilidade dele realmente seria nesse sentido, porque ainda é uma entidade de usuário simples e sujeita à latência do kernel).

1 Na verdade, isso não é verdade neste caso - RPi.GPIO usa um endereço direto de memória hack como este um>; Eu acho que os módulos de fiação de nível C também funcionam dessa maneira. Isso é coisa que faria fazer um bom módulo do kernel, exceto que o kernel já tem um módulo gpio com uma interface userland. Eu imagino que a justificativa para o hack DMA é que ele parece mais eficiente (e mais interessante para escrever).

    
por 24.06.2014 / 13:05