Итак, у меня есть скрипт на Python, который эмулирует ESC_KEY на контакте 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)
Есть ли "легкий" способ настроить это как модуль ядра, или у кого-нибудь есть хорошая документация по созданию этого модуля ядра? Мне нужно переписать его на C?
Похоже, что при запуске в Python это потребляет много ресурсов, но я надеюсь, что при запуске в качестве модуля это будет менее нагружать систему.
решение1
Есть ли «простой» способ настроить это как модуль ядра?
Вероятно, нет. Кроме того, это может противоречить принципам хорошего дизайна, потому что то, что у вас есть, больше похоже на приложение пользовательского пространства; в любом случае, в фоновом режиме скрывается драйвер ядра. 1
Похоже, что это потребляет много ресурсов при запуске в Python.
Учитывая, что большую часть времени он спит, это нехороший знак; может быть, вам следует быть более конкретным. Все, что я делал с выводами rpi, основано на I2C на C или C++ с использованием интерфейса ядра, и что-то простое, вроде этого, не будет превышать 1 МБ RSS или использовать сколько-нибудь заметное время ЦП.
Нужно ли мне переписывать его на языке C?
Переписываю его впользовательское пространствоC может решить вашу проблему, если проблема в ресурсах (код WRT kernelspace, да, это только C и asm). Однако python не должен быть таким уж плохим — здесь явно нет проблем с производительностью. Опять же, вам следует описать проблему более подробно.
Модуль RPi.GPIO написан на языке C, возможно, вам стоит взглянуть на него. Однако, по моему скромному мнению, если вы еще не знаете этот язык и не проявляете к нему интереса, то не стоит изучать его только ради этого.
Вы также можете попробовать использовать (независимо от языка)существующий интерфейс ядрав python напрямую, вместо RPi.GPIO; это просто вопрос чтения и записи в файловые узлы в /sys/class/gpio
. Вы найдете больше информации об этом в сети, если поищете и наобмен raspberry pi. Взлом DMA, упомянутый в сноскеможетимеют преимущество перед этим, если вы пытаетесь делать что-то с очень высокой частотой, но в данном случае это не так (и я сомневаюсь, насколько это действительно полезно в этом смысле, поскольку это по-прежнему чисто пользовательская сущность, подверженная задержкам ядра).
1 На самом деле это не так в данном случае — RPi.GPIO используетхак прямого адреса памяти, как этот; Я думаю, что модули wiringPi уровня C также работают таким образом. Это то, чтобысделать хороший модуль ядра, за исключением того, что ядро уже имеет модуль gpio с пользовательским интерфейсом. Я полагаю, что оправдание хака DMA заключается в том, что онкажетсяэффективнее (и интереснее писать).