1

asmコードを作成する場合、CPUに次の命令に明示的にジャンプするように指示することにより、コードを1〜2サイクル遅くするトリックがあります。私はC++テンプレートを使用して同様のことをすることを考えていました。これが私のコードです:

template <unsigned int c>
inline void adelay()
{
  goto x;
x:
  adelay<c-1>();
}

template <>
inline void adelay<0>()
{
}

アイデアは正しいように見えますが、オプティマイザーはjmpコードを削除することで邪魔をしているようです。これをどのように実装できるかについてのアイデアはありますか?

バックグラウンド

これを実行する理由は、マイクロコントローラーのコードを遅くして、非常に特定の周波数で光ビームパルスを出力するようにするためです。これは非常に特殊な使用法であり、ドライバーの作成やマイクロコントローラーのプログラミングなどの低レベルのハードウェアアクセスを除いて一般的ではありません。それでも、可能な限りそのようなことは避けようとしています。残念ながら、これは常に回避できるとは限りません。

4

3 に答える 3

2

この属性を追加できます。

template <>
inline void __attribute__((optimize("O0"))) adelay<0>()
{
}

これは最適化を妨げるはずです。他の人が述べたように、おそらくより良い方法がありますが、これが純粋に学習目的である場合は、すべてが良いわけではありません. 私は通常、これを使用して、アセンブラーの出力を非常に迅速に確認したり、コマンドラインを使用していないときに使用します。

于 2013-03-08T19:30:37.587 に答える
2

それがオプティマイザーが行うべきことです-機能しないコードの削除を含めて最適化します。コンパイラ オプションで最適化を完全に無効にするか、他の方法を使用してプログラムを遅くします。定義された時間だけスリープできる API はたくさんあります。

于 2013-03-08T19:29:03.500 に答える
0

助けてくれてありがとう。jmp 命令を使用する代わりに、nop 命令を使用しました。

template <unsigned int c>
inline void adelay() 
{
  asm("nop");
  adelay<c-1>();
}

template <>
inline void adelay<0>()
{
}

ある時点で、少し粗い粒度で機能する volatile 変数の参照を使用しました。

static volatile int _adelay = 0;
template <unsigned int c>
inline void adelay()
{
  _adelay;
  adelay<c-1>();
}

template <>
inline void adelay<0>()
{
}

これは、メモリが不足しているときに役立つ場合があります。

再度、感謝します!:)

エイドリアン

于 2013-03-09T14:32:01.063 に答える