0

下手な英語でごめんなさい。

遅延を使用するタイム クリティカルなコード (ビットバンによるソフトウェア プロトコル実装の厳密な部分) を作成する必要があります。コンパイル時の C プリプロセッサは、遅延のクロック サイクル数を (マクロを使用して) 計算できるため、不明なサイクル数のF_CPUアセンブラ遅延コードを実装する必要があります。

しかし、GCCは定義された周波数の正確なクロック サイクルを__builtin_avr_delay_cycles(unsigned long cycles)遅延させる非常に便利な機能を提供します。 cyclesF_CPU

質問。インライン アセンブラ コード__builtin_avr_delay_cycles 内で使用する方法はありますか?

. 迂回路はこんな感じ。

__asm__ (...);
__builtin_avr_delay_cycles(...);
__asm__ (...);

しかし、コンパイラは__asm__断片の周りにいくつかのコードを作成できます。私にとっては悪いことです。各クロックサイクルを制御する必要があります。

4

2 に答える 2

2
__asm__ (...);
__builtin_avr_delay_cycles(...);
__asm__ (...);

このようにコードをコンパイルし、コンパイラがビルトインに対して出力したものを確認します。

次のようなシーケンスになります。

   ldi R2,lo8(N)
   ldi R3,hi8(N)
   ldi R4,hlo8(N)
1: subi R2,1
   sbci R3,0
   sbci R4,0
   brne 1b"

そのようなシーケンスが 2 ~ 3 ある場合があり、nopvinsn で終わる場合もあれば、1 つまたは 2 つまたは 3つと insn がある場合もldiありsbci、パターンが得られます (サイクル数によって異なります)。

これらの insn をインライン アセンブリに変換します。Nこれはサイクル カウントでRnあり、レジスタです。

欠点は、生成されたコードがサイクル カウントに依存することであり、サイクル カウントが変更された場合は、プロセスを繰り返す必要があります。ただし、変更が [83886082, 0xFFFFFFFF]、[262145, 83886081]、[768, 262144]、[6, 767] のいずれかの範囲内であれば安全です。

于 2012-11-22T15:44:30.130 に答える
0

いいえ、コンパイラの組み込み関数は実際の関数ではなく、アセンブラから呼び出すことも、コンパイラがアセンブラ内でそれらを認識することもできません。

于 2012-11-22T15:22:04.273 に答える