The PCを自作する。その4: STM格付けチェック
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(レジスタ直)
つづく
この記事へのご意見、ご感想、コメントは、
twitter
か下のフォーム(実験的)へどうぞ。