関数の実行中に割り込みを生成し、CPUに特定のISRを実行させたいのですが、ISRが終了すると、関数は実行を再開します。WindowsXPとMinGWコンパイラを使用しています。
3 に答える
実際にはハードウェアはありません。最初に何らかの方法で割り込みを生成し、後でそれを処理したいのですが、実際のハードウェアで実行します。
実際のハードウェア割り込みは、CPUピンの1つを切り替えて、ISRにディスパッチします。それをエミュレートするための本当に透明な方法は考えられません。
現在実行中の関数を一時停止する1つの方法は、SuspendThread関数を使用してから、別のスレッドを使用してISRを実行することです。
調査する別の可能性は、ファイバーを使用することかもしれません。
編集
cxxlの回答が示唆しているように、別の可能性は、リアルタイムの優先スレッドを使用することです。
- 2つのスレッドがあります。1つは関数を実行するためのもので、もう1つはエミュレートされたISRを実行するためのものです。
- 両方のスレッドで「CPUアフィニティ」機能を使用して、両方が同じCPUで実行されるようにします
- ISRスレッドの優先度を「リアルタイム」に設定します
次に、ISRエミュレートスレッドの実行を許可すると、他のスレッドがプリエンプトされます。
ここからWindowsDriverKitを入手します:http://msdn.microsoft.com/en-us/library/windows/hardware/gg487428.aspx。デバイスドライバーを作成するためのヘッダーとライブラリが含まれています。また、割り込みを処理する場合は、デバイスドライバーを作成する必要があります。
デバイスドライバを記述してDPCを使用できます。これは、ISRの一種のワーカー機能です。これらのDPCはソフトウェアで呼び出すことができ、どのユーザーモードコードよりも高い優先度で実行されます。ISR自体は通常非常に短く、割り込みを処理し、データを保存して制御をDPCに渡します。
MinGWでそれができるとは思えませんが、MS Visual Cが必要だと思いますが、無料のExpressEditionがあります。ここを参照してください:http://www.microsoft.com/visualstudio/eng/products/visual-studio-express-products
割り込みが必要だと確信していますか?管理者権限とリアルタイムの優先順位を使用して、ユーザーモードで多くのことを実行できます...
他の人が言ったように、かなり漠然とした質問です。
一部のCPUには、ソフトウェアを介して割り込みを強制/偽造する方法があります。それを調査できます。(私はx86について知りません、私は組み込み開発者です)
OS内では、あるプロセス/スレッドを別のプロセス/スレッドに割り込むことができる場合があります。繰り返しになりますが、私はWinプログラマーではないので、実際には言えません。
それ以外の場合は、詳細に応じて、サブルーチンが呼び出されるメインループを実行し、ラウンドするたびに「割り込み条件」(それが何であれ)をチェックし、分岐するか、何かが発生したことを示すフラグを設定します。 /発生する必要があります。