PR

Arduino UNO R4でdigitalRead/Writeの高速化

記事内に広告が含まれています。

 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 R35472μs440μs
UNO R42156μs252μs
Pico801μs89μs
Pico(240MHz)442μs49μs

 Picoは240MHz(デフォルト133MHz)までオーバークロックしたものも計測。どのボードでもかなり速度効果はありますね。

 ただ同時にピン制御するとか、よほど時間にシビアなこととかしない限りはdigitalRead/Write関数の方が無難かと思います。ポートレジスタをよく理解せずに使うと変な2次不具合とかおきそう。

▼参考サイト▼

一風変わったLチカをArduino UNO R4 WiFiで・・・あれ?

コメント

タイトルとURLをコピーしました