0

これについて助けが必要です。

Windows DLL によってエクスポートされた関数が Windows exe から呼び出されると、待ち時間またはコンテキスト シフト時間が発生します。

これをどのように結論付けたかは、ほとんどの場合、DLL エクスポート関数が 1 ミリ秒未満で完了することが見られるということです。しかし、DLL 関数が呼び出されてから戻るまでのタイムスタンプが 600 ミリ秒である場合もあります。これにより、バッファ オーバーフローが発生し、スレーブ側でデータが失われます。実際に私が使っているのは USB から SPI へのコンバーターです。DLL は USB フィードを取り込み、相手側で SPI データを送信します。したがって、この関数が戻るのに最大 600 ミリ秒かかる場合、SPI スレーブのデータが失われます。

DLL の関数のプロファイリングでは、15 ミリ秒以上かかることはありません (ただし、この大きさの SPI 読み取りと書き込みは、15 MHz の SPI 速度を考慮するとかなり大きく、4 バイトを読み取ります)。

SOコンテキストシフトタイムですか?DLL のコードを exe 自体に組み込むことは役に立ちますか? 私が見た唯一の遅延は、この DLL の関数呼び出しの間だけです。アプリケーションが Win 7 のマッチングでより多くの CPU 時間を取得できるように、プリエンプションを行わないようにする方法はありますか。私はビジュアルスタジオを使用しています。

提案してください。これについてあなたの助けに感謝します。

ありがとう、サクル

4

2 に答える 2

0

私も「SetThreadPriority と SetPriorityClass を呼び出して、それが役立つかどうかを確認しましたか? REALTIME_PRIORITY_CLASS を確認することもできます」というメッセージに出くわしました。私はまだ REALTIME_PRIORITY_CLASS を使用していますが、それが役立つと信じすぎています。(現在、問題のスレッドの優先順位として -1 が表示されることもわかります。

i8_priority = GetThreadPriority(
    pDpc->threadHandle );
 
                printf("\n 0 (threadHandle:0x%08X) i8_priority = %d \n ",  pDpc->threadHandle, i8_priority);
                
                SetThreadPriority(
    pDpc->threadHandle,
    2 );
)

オリジナルと SetThreadPriority を実行した後の両方で、-1 のみが返されます。

なぜかわからない?エラーコードが返された場合は、エラーコードを確認する必要があります。

USB トレースを見て、遅延の理由の 1 つは、デバイスがハードウェアからの応答を確認できない場合があり、600 ミリ秒、さらには最大 4 秒かかっていることです。したがって、これはFPGAの若者によって調査されています..これは、DLLによって行われたIO処理のポイントと同じです..?

スレッドとクラスの優先事項を試して、それらがどれだけ役立つかを確認したいと思います。

于 2013-02-07T14:22:31.963 に答える
0

DLL への呼び出しの結果として 600ms が発生することは疑わしい。DLL 関数のコードを見せてください。それが役立つかもしれません。この遅延の可能性が高い理由は、これらの 1 つです。

  1. あなたの DLL 関数は実際には、時折それほど時間がかかることを行っています。I/O 操作、ログ記録、カーネル オブジェクトの待機など... コードを示していないため、これは推測にすぎませんが、可能性は非常に高くなります。

  2. コンピューター上で実行されているのは、プログラムだけではありません。アプリが CPU コア全体 (またはプロセッサ全体) を占有している場合、もちろん、システム上の他のスレッドを実行できるように中断されます。SetThreadPrioritySetPriorityClassを呼び出して、それが役立つかどうかを確認しましたか? REALTIME_PRIORITY_CLASSも確認できます。

  3. メモリ不足とコードがページインおよびページアウトされています。

プロファイリング ツールを使用して DLL をプロファイリングし、時間がかかる理由を調べましたか?

于 2013-01-09T09:37:30.000 に答える