UNO R4でピンの入出力(digitalRead/Write)を直接レジスタのビット操作をすることで高速化してみました。またその速度比較も行ってます。R3でも直接レジスタ制御して高速化するというのがありましたがそれと同様の内容です。ついでにRaspberry Pi Picoも一緒に速度比較してます。(Picoはearlephilhower版のボードを使用)
まずは従来のUNO R3のスケッチから
for (uint16_t i = 0; i < 1000; i++) { digitalWrite(13, !digitalRead(13)); //delay(200); } for (uint16_t i = 0; i < 1000; i++) { PORTB = PORTB ^ B00100000; //UNO R3 //delay(500); }
オンボードLED(13ピン)を超高速に1000回 Lチカさせてます。ピンの状態を読み取って反転出力させてます。degitalRead/Write関数とレジスタのビット操作の2パターンのソース。1000回分のピン入出力処理時間を測定。delayのコメントアウトを外すと普通に目に見えるLチカになります。
▽UNO R3 測定結果▽
micros()で挟んでるだけなので計測はざっくりです。周知の通りかなり早くなります。
次にUNO R4のスケッチ
for (uint16_t i = 0; i < 1000; i++) { digitalWrite(13, !digitalRead(13)); //delay(200); } for (uint16_t i = 0; i < 1000; i++) { R_PORT1->PODR = R_PORT1->PODR ^ 0x800; //UNO R4 //delay(500); }
digital関数はR3と同様。UNO R4(RA4M1)のレジスタ制御では、オンボードLEDがP111番ピンに割り当てられているので、PORT1レジスタの11ビットを操作してます。
UNO R4 測定結果
UNO R4でもレジスタ制御はかなり早くなります。R3と比べても当然早くはなってますがこれくらいなんですね。
最後にRaspberry Pi Pico
for (uint16_t i = 0; i < 1000; i++) { digitalWrite(25, !digitalRead(25)); //delay(200); } for (uint16_t i = 0; i < 1000; i++) { gpio_put(25, !gpio_get(25)); //Raspberry Pi Pico //delay(500); }
earlephilhower版のボードを使用。PicoオンボードLEDは25番です。レジスタ制御はよくわからなかったのでC言語よりの記述にしてます。
Pico 測定結果
Picoでもかなり高速になります。
測定結果まとめ
ボード | digitalRead/Write | レジスタ制御 |
---|---|---|
UNO R3 | 5472μs | 440μs |
UNO R4 | 2156μs | 252μs |
Pico | 801μs | 89μs |
Pico(240MHz) | 442μs | 49μs |
Picoは240MHz(デフォルト133MHz)までオーバークロックしたものも計測。どのボードでもかなり速度効果はありますね。
ただ同時にピン制御するとか、よほど時間にシビアなこととかしない限りはdigitalRead/Write関数の方が無難かと思います。ポートレジスタをよく理解せずに使うと変な2次不具合とかおきそう。
▼参考サイト▼
コメント