以下の内容はhttps://lipoyang.hatenablog.com/entry/2023/11/01/205519より取得しました。


SPRESENSEの digitalWrite は遅い

SPRESENSEのArduino環境のdigitalWrite関数は異様に遅い。例えば下記のようなスケッチを実行して、メインボードの27番ピンと28番ピンの波形をオシロで測定するとなんと6.4usecも時間差がある。つまりdigitalWrite関数の実行に6.4usecもかかっていることになる。

static int x = 1;

void setup() {
  pinMode(27, OUTPUT);
  pinMode(28, OUTPUT);
  digitalWrite(27, x);
  digitalWrite(28, x);
}

void loop() {
  digitalWrite(27, x);
  digitalWrite(28, x);
  x = 1 - x;
  delay(100);
}

下記のようにSDKのboard_gpio_write関数を使うと、時間差は0.56usecに縮まった。ただし、Arduinoのピン番号ではなく、SDKのピン名で指定することに注意。

#include <arch/board/board.h>

static int x = 1;

void setup() {
  pinMode(27, OUTPUT);
  pinMode(28, OUTPUT);
  digitalWrite(27, x);
  digitalWrite(28, x);
}

void loop() {
  board_gpio_write(PIN_UART2_CTS, x); // 27
  board_gpio_write(PIN_UART2_RTS, x); // 28
  x = 1 - x;
  delay(100);
}

どうも、digitalWrite関数ではArduinoのピン番号からSDKのピン名への変換にforループとif文を使っているようだ。なぜこんなことをするのか理解に苦しむ。配列を使って、SDKのピン名 = 変換テーブル[Arduinoピン番号]; のようにすればループなんて不要なのに。




以上の内容はhttps://lipoyang.hatenablog.com/entry/2023/11/01/205519より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14