4

C++ コードからプロセッサ割り込みにアクセスできるかどうかを知りたいです (アセンブリ コードを使用する必要があると思います)。

つまりね。私は組み込みシステム (PIC、ARM7、および Atmel プロセッサ) での作業に慣れており、問題なく割り込みをプログラムできます (私は C を使用しています)。すべてのレジスタがマップされており、アプリケーションによっては全体として非常に簡単です。現在、私は x86 および x64 アーキテクチャで作業しており、( WANTを強調して) これらのプロセッサで同じことができるようにしたいと考えています。

例: C++ で、Enter キー (cin、getchar など) を押さずにその時点で押されているキーを常に検証するコードを実行するスレッドを作成したいと考えています。特定の時間にアクションを実行できるように、タイマー割り込みをプログラムしたいと考えています。私がやりたいことの多くはオペレーティング システムを介して実行できることは理解していますが、自分でそれを行う自由が本当に欲しいのです。

現在、私は Linux (Ubuntu) を使用していますが、その質問に答えるために必要な情報であれば、すぐに Windows を使用する予定です。

4

2 に答える 2

5

ユーザーレベルのプロセスでは、割り込みはシグナルに置き換えられます。を呼び出して、プロセスにシグナルを送信するように設定できますsetitimer。しかし、おそらく、あなたがやろうとしていることを実行する最善の方法は、次の 2 つのいずれかです。

  1. イベント ループを使用します。基本的に、何かする必要があるかどうかを定期的にチェックする巨大なループとしてプログラムを作成します。ループでは、時間を確認したり、キー押下を確認したりします。必要なことに少し手を加えて、もう一度ループします。

  2. スレッドを使用します。時間を監視し、タイマー ジョブをトリガーするだけのスレッドを作成できます。readデータが到着したときに割り込みのように動作するようにブロックするスレッドを持つことができます。

おそらく、割り込みハンドラー自体で最小限の作業を行い、通常は通常のコンテキストで実行される他のコードに情報を渡すだけであることが頭に浮かびました。まあ、OSはすでにその部分を行っています。割り込みハンドラー (または必要なもの) がイベントを検出して処理を開始するのを待つコードを作成するだけです。

Enterキー(cin、getcharなど)を押さずに、その時点で押されているキーを常に検証するコードを実行するc ++のスレッドが必要です。

そうしてください。これにはスレッドが必要であり、端末の入力モードをエンターキーを必要としないモードに変更する必要があります。それは割り込みとは何の関係もありません。

于 2012-08-29T22:24:27.070 に答える
0

Windows の場合:

Windows は、低レベルのハードウェア アクセス (CPU 割り込みへのアクセスなど) を隠すのに非常にうまく機能します。その理由は、win カーネルがプロセスやその他の内部のものを切り替えるためにそれらを使用しているためです。そのため、ハードウェアに直接アクセスしたり、実行リング < 3 (ユーザー モード) でコードを実行したりするには、ドライバーを作成する必要があります。

ただし、教育目的では、DOS または Windows DOS ウィンドウを使用することもできます。割り込みもエミュレートされます。もちろん、Borland C++ 3.x (dos 16bit) などのコンパイラを使用することになります。setvect と getvect は、割り込みフックに使用できます。

于 2012-08-29T22:29:09.600 に答える