從Python腳本到核心模組

從Python腳本到核心模組

所以我有一個 python 腳本來模擬引腳 17(Raspberry Pi)上的 ESC_KEY。

#!/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,像這樣的簡單事情不會超過 1 MB RSS 或使用任何明顯的 CPU 時間。

我需要用C重寫它嗎?

將其重寫為使用者空間如果問題是資源(WRT 核心空間程式碼,是的,僅是 C 和 asm),C 可能會解決您的問題。然而,Python 不應該那麼糟糕——這裡顯然不存在效能問題。同樣,您應該更詳細地描述問題。

RPi.GPIO 模組是用 C 寫的,您可能會想看一下。然而,在我看來,如果你還不了解該語言並且對它不感興趣,那麼僅僅為了這個就不值得學習。

您也可以嘗試使用(與語言無關)現有的核心介面直接在 python 中,而不是 RPi.GPIO;這只是讀取和寫入 中的檔案節點的問題/sys/class/gpio。如果您進行搜索,您會在網上找到更多相關內容樹莓派交換。註腳中提到的 DMA hack可能如果您嘗試以非常高的頻率做事,則比這有優勢,但這裡的情況並非如此(而且我懷疑它在這個意義上到底有多大用處,因為它仍然是一個純粹的用戶態實體並受內核延遲的影響)。


1 實際上,在本例中並非如此 -- RPi.GPIO 使用像這樣的直接記憶體位址破解;我認為 C 級 WiringPi 模組也是這樣運作的。那是東西製作一個好的核心模組,但核心已經有一個帶有用戶層介面的 gpio 模組。我想 DMA 黑客攻擊的理由是似乎更有效率(而且寫起來更有趣)。

相關內容