-2

私は単純な遅延機能を作りました:

void Delay(__IO uint32_t nCount)
{
  while(nCount--) {}
}

そして、ある値で単一実行の時間を予測したいと思います。悪い考えだとはわかっていますが、正確な時間は必要ありませんし、中断されることもありません。

STM32F405 @ 168 MHz と 8 MHz の外部水晶振動子を使用しています。

これまでのところ、0x80 0000 で呼び出すと約 0.5 秒の遅延が発生することに気付きました。

4

2 に答える 2

4

そのため、空のwhile ループを使用する代わりに、そこに入れる必要があります__no_operation();(1 つではなく 2 つのアンダースコア)。これは、私のボードでは 168MHz で命令サイクルごとに ~29ns かかり、組み込みアセンブリNOP をコード ストリームに直接挿入するため、あらゆる最適化に耐えられます。

最後の注意: あなたの loop-counter は です。これは__IO揮発性であることを意味します。これは、ループカウンターがCPU レジスターに入れられないことを意味します。__no_operation();コンパイラによって削除されるのを防ぐため、ループに行を入れたら変更できます。

通常タイマーを使用する必要がありますが、ハックアップが必要な場合もあります:)

-ジェシー

于 2013-09-12T11:40:44.460 に答える
2

その関数の実行にかかる時間は、コンパイラと設定によって大きく異なります。あなたの関数は何もしないので、オプティマイザはこの関数を単純な bx lr に変換します。これにはほとんど時間がかかりません。時間を測定できる場合は、最適化していません (コードのこの部分と他の部分の全体的な実行はさらに異なります)。

その問題を決定論的かつ再現可能な方法で解決すると仮定すると、それを実行し、基準クロックを使用してタイミングを計ることで、実行にかかる時間の大まかなアイデアを得ることができます。cortex-m4 のタイマーは優れた選択肢です。

このコードの使用方法を変更したり、キャッシュをオンにしたり、プロセッサ クロックを変更したり、フラッシュのタイミング設定を変更したりするたびに、遅延機能を再調整する必要があります。

タイマーの 1 つを直接使用して遅延を実行する方がはるかに簡単で、精度が大幅に向上します。カウンタ ループ コードやその呼び出しを維持し続ける必要がなくなります。

于 2013-08-19T05:44:11.570 に答える