The PCを自作するシリーズ。

前回はSTM32マイコンにプログラムを書き込む所まで何とかやった

今回は性能を見てみる。

とりあえず、GPIO操作の性能をはかってみたい。 GPIOをHIGHにしてLOWに戻す操作をして、 それにどれぐらいの時間がかかるかを計測した。

Arduinoの場合

まず、下調べとして、Arduinoの速度を調べた。

次のようなコードをArduino Leonardoで動かした。

void setup() {
  pinMode(13, OUTPUT);
}
void loop() {
  while(1) {
    digitalWrite(13, HIGH);
    digitalWrite(13, LOW);
    digitalWrite(13, HIGH);
    digitalWrite(13, LOW);
  }
}

このコードは5usぐらいの山を出力した。

Arduinoでレジスタを弄る場合

上のコードを手で少し最適化した。

void setup() {
  pinMode(13, OUTPUT);
}
void loop() {
  while(1) {
    PORTC |= B10000000;
    PORTC &= B01111111;
    PORTC |= B10000000;
    PORTC &= B01111111;
  }
}

このコードは125ns幅のHIGHを出力した。 Leonardoは16Mhzで動いていて、SBIとCBI命令は2クロック命令なので、 これは理想的な速度だと思う。

STM32の場合

おまちかね、メインのSTM32の場合だ。 次のコードをBluePillで実行した。

void setup() {
  pinMode(PB8, OUTPUT);
}
void loop() {
  while(1) {
    digitalWrite(PB8,HIGH);
    digitalWrite(PB8,LOW);
    digitalWrite(PB8,HIGH);
    digitalWrite(PB8,LOW);
  }
}

このコードは約900nsの幅の山になった。

LTOを試したい

STM32もArduinoでやったように、手でメモリマップドIOをいじれば早くなると思われるが、 ARMだと抽象化レイヤが多いので多少面倒だ、 そういう時のために、LTO(リンク時最適化)のオプションがある!と思ったが、 前回書いた通り動かない。

この点が解決したら再評価したい。

まとめ

Arduino(C++) << STM32(C++) << Arduino(レジスタ直)

つづく

次回はいよいよ、BluePillと8088をつないでいきたい