動作速度を調べる

動かしたいコード内ではなぜかwhile(1){ ... }ループを1周するのに424kHzx2で828kHz、1.2us程度かかっている。 60MHzのMCUてそういうもの? ということで、シンプルなところから。(ていうかデバッガは)

DigitalOut out21(p21);

int main() {
    while(1) {
        out21 = !out21;
    }
}

/media/uploads/takeshikodaira/_scaled_2011-55-24_165522.png

上記のコードでは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;
    }
}

起動直後のあたり

/media/uploads/takeshikodaira/_scaled_2011-05-21_105755.png

/media/uploads/takeshikodaira/_scaled_2011-05-21_111743_comm.png

試しに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;
    }
}

/media/uploads/takeshikodaira/_scaled_2011-46-21_224659_comm.png


Please log in to post comments.