So-net無料ブログ作成
検索選択

サイクルタイムを測定しよう (4) [PSoC]このエントリーを含むはてなブックマーク#

実験回路

今回は、個別のインストラクションについて、実行サイクルを測定します。

NOP の実行サイクル

最初は、何もしない命令 "NOP" を入れてみます。 測定関数 measure() は、以下のようになりました。

uint32 measure(reg32 *reg) __attribute__((aligned(256)));
uint32 measure(reg32 *reg) {
    uint32  s;
    uint32  e;
    
    s = *reg;
    asm(
        "nop\n"
    );
    e = *reg;
    
    return e - s;
}

"asm()" を使って、インストラクションを直接入れます。 この実験では、関数の最初の部分に別の NOP 列を入れることにより配置箇所を変化させましたが、いずれの場合も5サイクルになりました。 NOP 命令が無い場合は4サイクルでしたから、 NOP 命令の実行は1サイクルであったことがわかります。

イミディエイト MOV 命令

次は、イミディエイト・アドレッシングモードの MOV 命令を入れてみます。 Cortex-M0 では、8ビットで表現できる値をレジスタに入れるイミディエイト・アドレッシングモードの MOV 命令があります。

    s = *reg;
    asm(
        "mov r3,#170\n"
    );
    e = *reg;

この命令で CPU の r3 レジスタに170という値を入れます。 値に意味はありません。 また、使用したレジスタも他の部分に影響のないものという事で r3 を選んでいます。 実験の結果、 NOP の場合と同様にすべて5サイクルとなりました。 この命令も1サイクルで実行されます。

かけ算命令 MUL の場合

三つ目は、かけ算命令 MUL を実行してみます。

    s = *reg;
    asm(
        "mul r3,r0\n"
    );
    e = *reg;

ここで実行しているかけ算の内容にも意味はありません。 実験の結果は、これも5サイクルになりました。 かけ算も1サイクルで実行してしまいます。

メモリアクセスさえ無ければ

以上のように、メモリアクセスの無い命令であれば、ほとんど1サイクルで実行する事が出来ます。 しかし、実行順序に影響を与える場合には、そうはいきません。


nice!(0)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。