-1

カーネル ISR ルーチンに遅延を導入するために msleep や usleep などの関数を使用できないことは承知しています。
内部に特定の ISR が定義されているカーネル ドライバーがあります。ISR ブロックの 1 つで、ミリ秒単位の特定の遅延を挿入する必要があります。まあ言ってみれば:

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

次のようなものを使用できますか:

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

私のプロセッサが 1Gbps で実行されているとしましょう。上記の for ループは 1000 マイクロ秒、つまり 1 ミリ秒の遅延を与えますか?

4

3 に答える 3

0

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

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

于 2016-04-06T09:24:15.620 に答える
-2

関数 udelay および ndelay はビジー待機遅延を実装しているため、ISR で使用できます。Tsyvarevが示唆したように。

于 2016-04-05T09:52:03.713 に答える