動作速度を調べる
動かしたいコード内ではなぜかwhile(1){ ... }ループを1周するのに424kHzx2で828kHz、1.2us程度かかっている。 60MHzのMCUてそういうもの? ということで、シンプルなところから。(ていうかデバッガは)
DigitalOut out21(p21); int main() { while(1) { out21 = !out21; } }
上記のコードでは3.38-3.44MHzでout21が(2回)反転している模様。
1周するのに145ns程度か。オシロスコープで見ると結構なだらかなカーブを描いている。
1.2usの方は4回、条件をチェックしている。何もなければ4回だけYES/NOのテストをしているwhile(1)ループ。 ということで、テスト用コードにも条件文を書いてみる。
まったく意味不明な条件文
#include "mbed.h" DigitalOut out21(p21); int main() { int i,j; i = 1; j = 2; while(1) { if(i == j){ j = 1; } out21 = !out21; } }
3MHzになった。 1周するのに160ns程度。 同じ条件文を2つにした場合、187nsに。 4つにしたら250ns。
ベースを145nsとして、差を出すと、 1=>15ns 2=>42ns 4=>105ns
単純に足し算という分けではなさそう。
プログラムの中にwhileループを作るただし、2段階のカウンタを付けた。
while(counter1 < 10000){ counter2++; if(counter2 > 10000){ counter2 = 0; counter1++; } DIO = !DIO; }
560ns/1.78MHz(の半分の280nsでループ1周)
シリアルポートに受信があるか調べる
while(counter1 < 10000){ counter2++; if(counter2 > 10000){ counter2 = 0; counter1++; } if(Serial.readable()){ //do nothing } DIO = !DIO; }
285ns
シリアルポートに受信があるか調べて受信用の関数を呼ぶ
while(counter1 < 10000){ counter2++; if(counter2 > 10000){ counter2 = 0; counter1++; } if(Serial.readable()){ rx_data(); } DIO = !DIO; }
880ns
平方根の計算
#include "mbed.h" DigitalOut clk(p20); int main() { int i; double dmy; for(i = 0; i < 10; i++){ clk = !clk; } long double t1 = sqrt(2.0*1.0/1000.0) * 1000.0; clk = !clk; i = 1; while(1){ clk = !clk; dmy = sqrt((long double)i); dmy *= t1; i++; if(i > 1000) i = 1; } }
起動直後のあたり
試しにwhile(1)の中を変更
#include "mbed.h" DigitalOut clk(p20); int main() { int i; double dmy; for(i = 0; i < 10; i++){ clk = !clk; } long double t1 = sqrt(2.0*1.0/1000.0) * 1000.0; clk = !clk; i = 1; while(1){ clk = !clk; //dmy = sqrt((long double)i); dmy = sqrt((long double)1000); dmy *= t1; i++; if(i > 1000) i = 1; } }
Please log in to post comments.