Python 스크립트에서 커널 모듈로

Python 스크립트에서 커널 모듈로

그래서 핀 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

파이썬에서 실행할 때 리소스를 많이 먹는 것 같습니다.

대부분의 시간 동안 잠을 잔다는 점을 고려하면 이는 좋은 징조가 아닙니다. 좀 더 구체적으로 설명해야 할 수도 있습니다. rpi 핀으로 수행한 작업은 모두 커널 인터페이스를 사용하는 C 또는 C++ 기반의 I2C이며 이와 같은 간단한 작업은 1MB RSS를 넘지 않거나 눈에 띄는 CPU 시간을 사용하지 않습니다.

C를 사용하여 다시 작성해야 합니까?

다시 작성해 보세요.사용자 공간문제가 리소스(WRT 커널 공간 코드, 예, C 및 asm에만 해당)인 경우 C가 문제를 해결할 수 있습니다. 그러나 Python이 그다지 나쁘지는 않습니다. 여기에는 분명히 성능 문제가 없습니다. 다시 한 번 문제를 더 자세히 설명해야 합니다.

RPi.GPIO 모듈은 C로 작성되었습니다. 이를 살펴보는 것이 좋습니다. 그러나 IMO는 해당 언어를 이미 모르고 관심도 없다면 단지 이것 때문에 배울 가치가 없습니다.

(언어에 구애받지 않음)을 사용해 볼 수도 있습니다.기존 커널 인터페이스RPi.GPIO 대신 Python에서 직접; 이는 단순히 .NET의 파일 노드에서 읽고 쓰는 문제입니다 /sys/class/gpio. 검색하면 온라인에서 더 많은 내용을 찾을 수 있습니다.라즈베리 파이 교환. 각주에 언급된 DMA 해킹5월매우 높은 빈도로 작업을 수행하려는 경우 이것에 비해 이점이 있지만 여기서는 그렇지 않습니다. (그리고 이것이 여전히 순수한 사용자 영역 엔터티이기 때문에 이런 의미에서 실제로 얼마나 유용할지 의심스럽습니다. 커널 대기 시간이 적용됨).


1 실제로 이 경우에는 그렇지 않습니다. RPi.GPIO는이와 같은 직접 메모리 주소 해킹; 내 생각엔 C 레벨 WiringPi 모듈도 이런 식으로 작동하는 것 같아요. 그런 것들이야~일 것이다커널에 이미 사용자 인터페이스가 있는 gpio 모듈이 있다는 점을 제외하면 좋은 커널 모듈을 만드십시오. 나는 DMA 해킹의 정당성이 다음과 같다고 생각한다.것 같다더 효율적이고 쓰기에도 더 재미있습니다.

관련 정보