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ピン番号]; のようにすればループなんて不要なのに。