3

ハードウェアにアクセスするためにDOS(はいDOS)で実行されるCで書かれたベンダー提供のドライバーコードをいくつか与えられました。私はこのコードが何をするのかを解明しようとしていますが、これまでのところあまり成功していません。特に、次のコードを理解するのに問題があります

void (interrupt *oldcan)(void);

void  interrupt far  can_isr(void)
{
    /* function body */
}

interrupt最初の行は関数ポインタを定義していると思いますが、ある種のDOSAPI関数であると想定している単語を見たことがありません。私はこれまでDOSを使用したことがなく、上記の関数定義には3つの戻り型があるように見えます- voidinterruptそしてfarこれは明らかに不可能です。関数には実際にはvoidreturn型がありますが、interrupt far??の意味は何ですか?どんな援助もありがたく受けます。

4

3 に答える 3

6

割り込みキーワードは、割り込みハンドラーを作成するために使用されました。つまり、この関数は、割り込みによって呼び出されることを目的としていました。farつまり、戻ったときに、CSとIPの両方がスタック上にあることを期待します(割り込みを介して呼び出されたものすべてに与えられます)。

最も一般的な使用法は、おそらくシリアルポートを使用するコードでした。BIOS/ DOSシリアルポートハンドラーは高速(元々は約300 bps)で文字を失うため、独自のハンドラーをインストールする必要がありました。 。文字がシリアルポートに現れたとき、シリアルポートハードウェアはプロセッサに割り込んだ行をアサートしました。これに基づいて、割り込みハンドラルーチンが呼び出されます。コードは、シリアルポートからメモリにデータを読み込んで(そして割り込みを再度有効にするなどのいくつかのことを実行して)戻ってくる必要がありました。

于 2012-09-10T14:22:28.490 に答える
2

これは、コンパイラ固有の拡張機能である可能性が非常に高く、プラットフォーム固有の方法で割り込みハンドラとして関数を「インストール」するために使用されます。

interrupt標準のC言語にはキーワードはありません。

于 2012-09-10T14:21:25.360 に答える
0

リンクhttp://www.phanderson.com/printer/periodic_interrupt.htmlを確認してください。このリンクでは、コード例で使用されている割り込みについて説明しています。非常に簡単です。

この投稿も見ることができます:遠いポインターと近いポインターの違いは何ですか?farキーワードについての情報。

于 2012-09-10T14:23:49.110 に答える