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