0

lpc1788 ボードの mips を計算したことがありますか? 最近、ROMで実行されている次のコードを介して結果を計算しました:

volatile uint32_t tick;

void SysTick_Handler()
{
    tick++;
}

unsigned long loops_per_ms;

extern void __delay(int n);

int calculate_mips()
{
    int prec = 8;
    unsigned long ji;
    unsigned long loop;

    loops_per_ms = 1 << 12;

    while (loops_per_ms) {
        ji = tick;

        while (ji == tick) ;
        ji = tick;
        __delay(loops_per_ms);

        if (ji != tick)
            break;

        loops_per_ms <<= 1;
    }

    loops_per_ms >>= 1;
    loop = loops_per_ms >> 1;

    while (prec--) {
        loops_per_ms |= loop;

        ji = tick;

        while (ji == tick) ;
        ji = tick;
        __delay(loops_per_ms);

        if (ji != tick)
            loops_per_ms &= ~loop;

        loop >>= 1;
    }

    return loops_per_ms / 500;
}

遅延:

  PUBLIC __delay
  SECTION .text:CODE:REORDER(2)
  THUMB
__delay
        subs r0, r0, #1
        bhi __delay
        mov pc, lr
  END

IAR IDE では、loops_per_ms が 39936 で mips が 79M になりましたが、Keil では loops_per_ms が 29952 で、これは mips が 59M であることを意味します。

MCU の速度は 120MHz に設定されています。データシートによると、MIPS は 1.25x120=150M である必要があります。ROM で実行されているコードが mips を遅くしていると思います。

体にコメントやその他の結果がありますか?

4

1 に答える 1

0

その方法で MIPS を測定することはできません。特定の高レベル コード ソースを実装するためにコンパイラが使用する命令の数を制御することはできず、最適化レベルによって異なります。

コアは MHz あたり 1.25 MIPS を達成しますが、多くの要因によっては減少する可能性があります。たとえば、Cortex-M では、オンチップ フラッシュとオンチップ RAM が別々のバスを使用するため、データが RAM にあり、コードがフラッシュにあるときに最適なパフォーマンスが得られます。フラッシュ内の命令がフラッシュからデータをフェッチする必要がある場合、命令フェッチとデータ フェッチはシーケンシャルである必要があるため、スループットが低下しますが、RAM からのデータ フェッチは並行して発生する可能性があります。コードを RAM から実行すると、すべてのデータと命令のフェッチがシーケンシャルになるため、実際に速度が低下することに気付くでしょう。ほとんどの Cortex-M パーツはフラッシュ アクセラレータを採用していますほとんどの場合、ゼロウェイト コード実行を達成するために遅いフラッシュ メモリを補うための何らかの種類のものですが、そのような利点を無効にするためにコードを逆に書くことは可能です。MIPS が減少するその他の原因は、DMA 操作とペリフェラルの待機状態によって引き起こされるバス レイテンシです。

特定のアプリケーションの MIPS を測定する最も簡単で正確な方法 (上記の理由により最適とは異なる場合があります) は、一定期間実行されたすべての命令をキャプチャするトレース対応デバッガーを使用することです。

于 2013-08-31T07:50:57.813 に答える