그래서 핀 17(Raspberry Pi)에서 ESC_KEY를 시뮬레이션하는 Python 스크립트가 있습니다.
#!/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 핀으로 수행하는 모든 작업은 모두 커널 인터페이스를 사용하는 C 또는 C++ 기반의 I2C입니다. 이렇게 간단한 작업은 1MB RSS 이상을 사용하지 않거나 눈에 띄는 CPU 시간을 사용하지 않습니다.
C로 다시 작성해야 하나요?
다음과 같이 다시 작성사용자 공간문제가 리소스(WRT 커널 공간 코드, 예, C와 asm만 해당)인 경우 C가 문제를 해결할 것입니다. 그러나 Python이 그렇게 나쁘지는 않습니다. 여기에는 분명히 성능 문제가 없습니다. 다시 한 번 문제를 더 자세히 설명해야 합니다.
RPi.GPIO 모듈은 C로 작성되었으며 살펴보고 싶을 수도 있습니다. 하지만 제 생각에는 그 언어를 아직 모르거나 관심이 없다면 단지 언어를 위해서 배울 가치는 없습니다.
시도해 볼 수도 있습니다(언어 독립적).기존 커널 인터페이스RPi.GPIO가 아닌 Python에서 직접 파일 노드에서 읽고 쓰는 문제입니다 /sys/class/gpio
. 검색하면 온라인에서 더 관련성 높은 콘텐츠를 찾을 수 있습니다.라즈베리 파이 스왑. 각주에 언급된 DMA 해킹가능한매우 높은 빈도로 작업을 수행하려는 경우 이점이 있지만 여기서는 그렇지 않습니다. (여전히 순전히 사용자 영역 엔터티이고 커널 지연 영향을 받기 때문에 그런 의미에서 실제로 매우 유용한지는 의심됩니다.)
1 실제로 이 경우는 그렇지 않습니다. RPi.GPIO는이런 직접 메모리 주소 해킹;C레벨 WiringPi 모듈도 이런 방식으로 작동하는 것 같아요. 그게 뭔가요회의좋은 커널 모듈을 만드세요. 하지만 커널에는 이미 사용자 수준 인터페이스를 갖춘 gpio 모듈이 있습니다. DMA 해킹의 이유는 다음과 같습니다.~인 것 같다더 효율적이고 쓰기가 더 재미있습니다.