從 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
在 python 中執行時,這似乎佔用了大量資源
考慮到它大部分時間都在睡覺,這不是一個好兆頭。也許你應該更具體。我使用 rpi 引腳所做的一切都是基於 C 或 C++ 使用核心介面的 I2C,像這樣簡單的東西不會超過 1 MB RSS 或使用任何明顯的 CPU 時間。
我需要用C重寫它嗎?
如果問題是資源(WRT 核心空間程式碼,是的,僅是 C 和 asm),在使用者空間C中重寫它可能會解決您的問題。然而,python 不應該那麼糟糕——這裡顯然沒有性能問題。同樣,您應該更詳細地描述問題。
RPi.GPIO 模組是用 C 語言編寫的,您可能想看一下。但是,如果您不了解該語言並且對它不感興趣,IMO 則不值得為此學習。
您也可以嘗試直接在 python 中使用(與語言無關的)現有核心介面,而不是 RPi.GPIO;這只是讀取和寫入文件節點的問題
/sys/class/gpio
。如果您在raspberry pi exchange進行搜尋,您會在網上找到更多相關資訊。如果你試圖以非常高的頻率做事,腳註中提到的 DMA hack可能比這更有優勢,但這裡的情況並非如此(我懷疑它在這個意義上真的有用,因為它仍然是一個純粹的使用者空間實體並且受核心延遲的影響)。1 實際上,在這種情況下並非如此——RPi.GPIO 使用像這樣的直接記憶體地址破解;我認為C級wiringPi模組也可以這樣工作。這些東西可以成為一個好的核心模組,除了核心已經有一個帶有使用者界面介面的 gpio 模組。我想 DMA hack 的理由是它看起來更有效(並且寫起來更有趣)。