サイクルタイムを測定しよう (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サイクルで実行する事が出来ます。 しかし、実行順序に影響を与える場合には、そうはいきません。
コメント 0