前回Timerコールバック関数の呼び出し周期の上限目安(被呼び出し関数にもよりますが)を測定しました。今回は端子からの割り込みに対してMicroPythonの関数が反応するまで(割り込み入力をトリガとして出力端子の状態を変更するまでの時間)の目安を測ってみたいと思います。最速どのくらいの処理がデキそうなのか。
※「MicroPython的午睡」投稿順 Indexはこちら
(末尾に実験に用いたMicroPythonコード全文を掲げました)
今回の設定は非常に簡単です。端子の一本、ここではGP3としました、を割り込み入力端子として設定しこの端子のフォーリングエッジで割り込みをかけます。その割り込みをMicroPythonで受けて、出力端子、ここではGP2としました、にロウパルスを1発出力する、と。これだけです。
一応回路図を以下に示しましたが、アイキャッチ画像に示しましたるとおり「その辺にあった」実験治具を接続したので、抵抗値などもバラバラ。
測定結果
測定は例のごとく Digilent Analog Discovery2を利用。オシロモードでGP3(Channel1の黄色)とGP2(Channel2の青色)を観察するだけであります。測定した波形がこちら。
下のキャプチャでは時間が読み取りやすいように、割り込みのフォーリングエッジと出力線のフォーリングエッジに時間カーソルを合わせてみました。
だいたい102μ秒
です。「割り込みが来た!」と押っ取り刀で対応してこの程度の時間。前回のタイマ割り込みでも100μ秒以下になるとボロボロになっていったので、ノーマルのラズパイPico上のMicroPythonで割り込みをトリガに使う場合、100μ秒前後のところに処理の限界があるのかもしれませんで。
以下のソフトウエアシーケンスで発生している「ロウパルス」1発の幅にも時間カーソルを合わせてみました。後ろのソースの以下の部分。
outPin.toggle() outPin.toggle()
大体6.6μ秒であります。toggle()であると、ポートをRead Modify Writeすることになり、単純出力操作よりは若干重いですが、「こんなもん」です。
ラズパイPicoには、MicroPythonからも使えるPIOという必殺の仕組みがあるので、ハードウエアのステートマシンにお願いすればもっと細かい粒度で制御可能と思われます。まあね、MicroPythonのソフトウエア制御でやると「こんなもん」でしょ。
やっぱり、接続するデバイスによっては PIO にお出ましいただくしかありますまい。次回は再びPIO使ってデバイス接続しなければなりますまいて。
MicroPython的午睡(25) ラズパイPico、Timer周波数設定の上限? に戻る
MicroPython的午睡(27) ラズパイPico、DHT11接続、ソフト現物合わせ に進む
割り込み入力の「反応時間」測定用サンプルコード
from machine import Pin import time outPin = Pin(2, Pin.OPEN_DRAIN, Pin.PULL_UP) inPin = Pin(3, Pin.IN, Pin.PULL_UP) outPin.value(1) def togglePin(pin): global outPin outPin.toggle() outPin.toggle() inPin.irq(lambda pin: togglePin(pin), Pin.IRQ_FALLING) while True: print(inPin.value()) time.sleep(1.0)