背景
ESP32だけでクロック信号を読み取ろうとしたら、外部割り込みで全然間に合わないことが発覚。
色々調べているうちにESP32なら外部割り込みを使わない方が速いと分かった。
参考記事
普通は外部割り込みの方が都合が良いんですが...
信号のHigh,Lowを検出してその瞬間から処理をさせようとした場合、外部割り込みを使うのが普通です。
ざっくりですが、信号の変化を検出する方式の特性はこんな感じです。
-
外部割り込み
マイコンが信号の変化を見張ってくれる方式。変化があったときにお知らせしてくれる。
プログラムで信号を見張る必要が無いので、その間は「別の処理をすることができる。 -
ポーリング
プログラムで信号の変化(H→L or L→H)を見張る方式。それ以外のことが何もできない。
もしくは「別な処理」と「信号の変化を見る」を交互に行うこともできるが「別な処理」をする分、信号の検出が遅れる
でも、これは「CPUが1個」の場合です。
ESP32はDual CPUなので、そうはならない!
ESP32はDual CPUなので、前述の内容を覆すことができます。
ESP32のDual CPUでのポーリング
以下のような構成にすると、割り込み処理より高速に信号の変化を検出できます。
・Dual CPUをフル活用するために、FreeRTOSでマルチタスクを使う
・CPU0(WiFi用処理など重要な処理を実行するCPU)で、「別な処理」を行う。
・CPU1(Arduinoなどのプログラムを実行するアプリ用CPU)は、「信号の変化を見る」専用処理とする。
最初に書いた参考URLの記事では、信号の変化発生から検出までの時間はそれぞれ以下となっています。
・外部割り込みの場合:8.94us=8940ns
・DualCPUでのポーリングの場合:176ns
単純計算ですが、8940/176 ≒ 50.79、つまり検出速度は50倍以上ポーリングの方が速いことになります。
まとめ
実際には3.6MHzぐらいの信号を漏れなく検出できるようになるとのことですから、かなり速くなりますよ。
なお、この記事は、【札幌現地+オンライン開催】力強くブログを108記事アウトプットする日の 20241229のブログの一つとして書きました。
参加した皆さん、お疲れ様です!