0

すべて LOW の GPIO ポートがいくつかあり、それぞれが HIGH に変わるまでの時間を測定したいと考えています。私は信頼性の高い読み取り値を提供する作業コードを持っていますが、それを見るだけで「もっと効率的な方法があるに違いない」と思います。

クリアされたポートの量がオーバーヘッド時間に影響しないように、コードはプロセス全体で同じままにする必要があります。(できるだけ一定にする必要があります。)

この種のルールは、私が試した次の方法を使用することを除外します。

GPIO.RISING イベントを使用します。ポート変更の処理にスレッドを使用します。状態の変化時間を処理するためにより多くのコードと変数が必要になり、イベント ハンドラー/スレッドからメイン コードに結果を渡すため、どちらも結果が悪くなります。

これだけでは、絶対的に正確な測定値を得るにはあまり良い方法ではないことはわかっていますが、結果はそのままで十分です。(例を挙げると、実行中のバックグラウンド プロセスなどは Python のパフォーマンスに影響を与えます。)もちろん、より正確な解決策を受け入れることはできますが、Python コードを最適化することは素晴らしい出発点です。

whileCount=0 # createvariables
highCounter=0
portsCleared=[]
results=[]
portStates=[]

for port in portList: #set GPIO ports to IN mode
    GPIO.setup(port, GPIO.IN)

while (highCounter<portCount and whileCount < 1000): # loop until all ports are HIGH
    whileCount += 1
    portStates=[] # list in which the port states are stored
    for port in portList: #get all port states
        portStates.append(GPIO.input(port))

    portCounter=0   
    for port in portList: #process all port states
        portBoolean=portStates[portCounter]==GPIO.HIGH
        if portBoolean and not port in portsCleared: #this specific port has gone to HIGH so its time is stored and it is added to the cleared list
            portsCleared.append(port)
            results[portCounter]=whileCount
            highCounter+=1 #keep track of the amount of ports cleared, so the while loop can end once all ports are cleared
            #print [portCounter,highCounter,portsCleared]
        portCounter+=1
    time.sleep(.001)    

if whileCount==1000:#reached cap, set non cleared ports to cap
    portCounter=0   
    for port in portList:
        if not port in portsCleared:
            results[portCounter]=1000
    portCounter+=1

結果がもう少し正確になるように、オーバーヘッドに費やす時間を減らしたいと思っています。

4

0 に答える 0