動作速度を調べる
動かしたいコード内ではなぜか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.




