今年の6月末ごろにArduino Unoの新型となるR4 Minima/WiFiがリリースされ、先日Minimaを大阪日本橋のシリコンハウスで入手しました(3200円ぐらい)。従来ではATMega328Pを搭載してましたが、今回はルネサスのRA4M1というマイコンに変更され大幅に機能が強化されました。HIDサポートやメモリ増加、DAC搭載などいろいろありますが今回は動作クロックが16MHzから48MHzへとなり、動作が3倍に高速化されました。そこでこの記事ではdigitalWrite
、digitalRead
、analogRead
の速度を検証します。
R3での検証
garretlabさんのR3の検証記事を参照ください。そちらではdigitalReadが3.52~4.97us、digitalWriteが3.14~4.59us、analogReadが112usとのことでした。
R4での検証
検証方法
R3と比較するため上記内に記載されている検証コードを基本改変せずに使用。RESETボタンでの再起動で2回検証。開発環境はArduinoIDE 2.1.1です。
const int repeat = 10000;
void measure(int pin) {
long begin, end;
volatile int val;
Serial.print("Pin No.: ");
Serial.println(pin);
// digitalRead()
pinMode(pin, INPUT);
delay(3000);//0ピンの結果を表示するため待機時間を変更
begin = micros();
for(int i = 0; i < repeat; i++) {
val = digitalRead(pin);
}
end = micros();
Serial.print(" digitalRead: ");
Serial.println((end - begin) / (float)repeat);
// digitalWrite()
pinMode(pin, OUTPUT);
delay(1000);
begin = micros();
for(int i = 0; i < repeat; i++) {
digitalWrite(pin, HIGH);
}
end = micros();
Serial.print(" digitalWrite: ");
Serial.println((end - begin) / (float)repeat);
// analogRead()
if ((pin >= A0) && (pin <= A5)) {
val = analogRead(pin);
begin = micros();
for(int i = 0; i < repeat; i++) {
val = analogRead(pin);
}
end = micros();
Serial.print(" analogRead: ");
Serial.println((end - begin) / (float)repeat);
}
Serial.println();
}
void setup () {
int pin;
Serial.begin(9600);
for(pin = 0; pin < 20; pin++) {
measure(pin);
}
}
void loop () {
}
検証結果
私の持っているR4Minima(純正)ではdigitalRead
が1.13us、digitalWrite
が0.75us、analogRead
が26.01usとなりました。
digitalReadでは約3.1~4.4倍、digitalWriteでは約4.2~6.6倍、analogReadでは約3.5~5.2倍で動作するようになりました。
しかし、A0からA5まで処理時間が増加しているのが気になります。そこでA5からA0への逆向きで再び2回測定。
結果は2回とも共通でした。
25us前後という結果となりました。(digitalRead/Writeは変わらず)
まとめ
R4 MinimaではIO周りでは速度が3~6倍になりました。またデジタルピンはR3で見られたピンごとの速度のばらつきがなくなり、全ピンで速度はほとんど一定となりました。(どこかの記事で見た全ピンがPWM対応になったのが影響?)またanalogReadは実行方法で変動があるようです。
また結果の項で書きませんでしたが、setup内のSerial.beginの後に2msのdelayを入れたところdigitalReadが1.17us、digitalWriteが0.84usへとやや遅くなりました。analogReadは変わりませんでした。
追加検証したいこと
ピンの順番をランダムにするなどしてanalogReadの処理時間がどう変化するか、前後の処理で各処理時間がどう変動するか。またIDEの更新に伴う影響があったか。
みなさんの追走や疑問などのコメントお待ちしております。