2016-04-05 10 views
0

カーネルISRルーチンで遅延を導入するために、msleepやusleepなどの関数を使用することはできません。
私は内部に定義された特定のISRを持つカーネルドライバを持っています。 ISRブロックの1つでは、ミリ秒オーダーの特定の遅延を挿入する必要があります。言うことができます:forループ上記は私の1000年USECS、すなわち1ミリ秒の遅延を与える、カーネルドライバで遅延を使用する方法

{ 
//A 
for(i=0;i<1000;i++); 
//B 
} 

は私のプロセッサが1Gbpsので実行されているとしましょう:

{ 
//A 
//here I need sleep 
//B 
} 

が、私はのようなものを使用することができますか?

+1

関数 'udelay'と' ndelay'は* busy-waiting * delayを実装していますので、ISRで使用することができます。最初の機能の待機時間は、マイクロ秒(1/1,000,000)、その他の1ナノ秒(1/1 000 000 000)で測定されます。 – Tsyvarev

+0

ええ、私はそれを後で実現しました。それはうまくいった。ありがとう。 – mdsingh

答えて

-2

機能udelayおよびndelayはビジー待機遅延を実装しているため、ISRで使用できます。 Tsyvarevによって提案されているように。

+0

この回答を下さった人は私ではありません。そして、私はそのダウンワードの理由についても興味があります。 – Tsyvarev

0

割り込みハンドラ内でスリープしてはいけません。

さらに、割り込みハンドラ内で長時間待つ必要があります。これは、同じCPU上のすべてのプロセスおよび他のすべての割り込みをブロックします。

ドライバが異なるタイミングで2つのことを行う必要がある場合は、2番目の割り込みやタイマーを使用して2番目のことを行う必要があります。

0

ISRで意図的な遅延が発生した理由について聞いてみたいと思います。一般的に言えば、それはノー・ノーです。必要と思われる場合は、おそらくコード設計を再考する必要があることを意味します。

微視的な遅延の導入に関しては、私が使ったことの1つはcpu_relax()です。この関数は、カーネルで、一部のCPUアーキテクチャで上記のudelay()ndelay()を実装するためにも使用されます。 Linuxカーネルでこの関数がどこでどのように使われているかを見てみることをお勧めします。それはあなたの特定の状況のた​​めのいくつかのアイデアを与えるかもしれません。

関連する問題