私は、Visual Studio 2010とMingW(2つの独立したビルド環境として)を使用してWin32環境でリアルタイムプリエンプティブスケジューラをシミュレートしようとしている組み込みプログラマです。私はWin32スケジューリング環境で非常に緑色で、私がしようとしているものでレンガの壁に当たっています。リアルタイムの動作を達成しようとはしていません。実際のターゲットハードウェアと同じ順序と順序でシミュレートされたタスクを実行するだけです。優先順位に基づいて定義されたシーケンスにWin32スレッドスケジューリングを強制する
シミュレートされるリアルタイムスケジューラは、実行可能な最も優先度の高いタスク(スレッド)を常に実行するという簡単な目的を持っています。タスクがすぐに実行できるようになると、現在実行中のタスクの優先度が現在実行中のタスクよりも高い場合、そのタスクをプリエンプトする必要があります。タスクは、待機していた外部イベント、タイムアウト/ブロック時間/スリープ時間の期限が切れたために実行することができます。ティック割り込みによってタイムベースが生成されます。
このようなプリエンプティブな動作に加えて、タスクは、スリープまたは待機タイプの機能を実行しているため、タイムスライスを放棄するか、またはボランティアできます。
シミュレーションするリアルタイムスケジューラによって作成されたタスクごとに優先度の低いWin32スレッドを作成することでシミュレーションしています(スケジューラが実際の埋め込み対象で行うコンテキスト切り替えがスレッドによって効果的に行われます)疑似割り込みハンドラ(Win32イベントオブジェクトを使用してシミュレーションされたティック割り込みとそれに信号を送信する要求を処理する)としてのWin32スレッド、およびティック割り込みを生成する周辺装置をシミュレートするための優先度の高いWin32スレッド。
タスクスイッチが発生する必要があることを擬似割り込みハンドラが設定すると、SuspendThread()を使用して現在実行中のスレッドを一時停止し、ResumeThread()を使用して新しく選択したタスクを実行するスレッドを再開します。作成される可能性のある多くのタスクおよび関連するWin32スレッドのうち、そのタスクを管理するスレッドは、一度に中断状態になることはありません。
SuspendThread()が呼び出された直後に中断されたスレッドが中断し、割り込みが保留中であることを通知するイベントが通知されるとすぐに疑似割り込み処理スレッドが実行されることが重要ですが、これは動作I見ている。
私が既に回避している問題の例:タスク/スレッドがyieldイベントを生成すると、変数にラッチされ、割り込み処理スレッドが通知されます。擬似割り込み(yield)が必要です処理。今私がプログラミングに慣れているリアルタイムシステムでは、割込み処理スレッドは、スレッドに信号を送るスレッドよりも高い優先度を持つため、シグナルが送られることをすぐに実行することが期待されます。私がWin32環境で見ているのは、優先度の高いスレッドを通知するスレッドが、中断される前にしばらくの間継続しているということです - シグナルが送られた優先度の高いスレッドが実行を開始する前に、タスクは実際に実行を停止する - 私はどちらがわからない。いずれにしても、これは、Win32割り込みハンドリングスレッドにシグナルを通知した後、シグナルハンドラWin32スレッドブロックをセマフォ上に作成することで簡単に正しいことがあります。また、Win32スレッドハンドラの処理(ハンドシェイク)終了時にスレッドのブロックを解除します。スレッド同期を効果的に使用して、スケジューリングパターンを必要なものに強制します。私はこの目的のためにSignalObjectAndWait()を使用しています。
このテクニックを使用すると、シミュレートされているリアルタイムスケジューラが協調モードで機能しているが、プリエンプティブモードでは(必要に応じて)機能していない場合でも、
プリエンプティブなタスク切り替えの問題は、同じことを推測します。タスクが実際に実行を停止する前に中断するように指示された後、しばらくの間実行され続けるので、システムは一貫性のある状態タスクを実行するスレッドは中断します。しかし、プリエンプティブなケースでは、タスクがいつ起こるのか分からないため、セマフォを使用してWin32 theadが次回に再開されるまで継続するのを防ぐ同じテクニックは使用できません。
誰もがこの投稿を遠くに作りましたか?その長さで申し訳ありません!
私の質問は、以下のとおりです。
私が起動し、サスペンドとレジュームスレッド関数が呼び出されていることをすぐにタスクを停止するためにWin32の(XP)のスケジュールを強制するにはどうすればよい - または - 私は高い優先度を強制する方法Win32スレッドは即座に実行を開始できます(ブロックされているオブジェクトが通知されます)。効果的に実行中のプロセスの再スケジュールをWin32に強制します。
タスク/スレッドの逐次実行パスにないイベントを待機するようにタスクを非同期に停止する方法はありますか。
シミュレータは、POSIX信号を使ってスレッドを効果的に中断させるLinux環境でうまく動作します.Win32には同等の機能がありますか?この長い記事を読むのに時間をとっている誰でも、このWin32の迷路を通して私のリアルタイムのエンジニアの手を保持することができます誰にも事前に特に感謝の
感謝。
しかし、ファイバは複数のコアで同時に動作しません。 –
チップをありがとう。私は明日ファイバーに関する参考資料を探します。 – Richard
@ Zan:複数のファイバを1つのスレッドで実行することができ、複数のスレッドをコアごとに1つずつ実行できます。 –