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

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ハッキングの理由は次のとおりです。〜らしいより効率的で書き込みがより面白いです。

おすすめ記事