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 ベースであり、このような単純なものであれば、RSS は 1 MB を超えず、CPU 時間もほとんど使用しません。

C を使って書き直す必要がありますか?

書き直すとユーザースペース問題がリソースである場合、C で問題を解決できる可能性があります (WRT カーネル空間コード、はい、これは C と asm のみです)。ただし、Python はそれほど悪くないはずです。明らかに、パフォーマンスの問題はありません。もう一度、問題をより詳細に説明する必要があります。

RPi.GPIO モジュールは C で書かれているので、調べてみるといいでしょう。ただし、この言語をまだ知らず、興味もない場合は、このためだけに学習する価値はないと思います。

(言語に依存しない)既存のカーネルインターフェースRPi.GPIOの代わりにPythonで直接実行します。これは単に、のファイルノードから読み書きするだけです/sys/class/gpio。これについては、オンラインで検索して、ラズベリーパイ交換脚注で言及されているDMAハック5月非常に高い頻度で処理しようとしている場合は、これよりも有利ですが、ここではそうではありません (また、これは依然として純粋なユーザーランド エンティティであり、カーネル レイテンシの影響を受けるため、この意味で実際にどれほど役立つかは疑問です)。


1 実際には、この場合はそうではありません。RPi.GPIOはこのような直接メモリアドレスハック; Cレベルの配線Piモジュールも同じように動作すると思います。だろうカーネルモジュールは良いものになるが、カーネルには既にユーザーランドインターフェースを備えたgpioモジュールがある。DMAハックの正当性は、思われるより効率的(そして書くのがより面白くなります)。

関連情報