djgpp-2を使用してdosbox-0.74でコンパイルするために、保護モードでハードウェア割り込みハンドラを設定しようとしています。可能な限り小さなコードがあります(タイマー割り込み)。保護されたハードウェア割り込みハンドラーがスタックしていますか? (DJGPP)
#include <dpmi.h>
#include <go32.h>
#include <stdio.h>
unsigned int counter = 0;
void handler(void) {
++counter;
}
void endHandler(void) {}
int main(void) {
_go32_dpmi_seginfo oldInfo, newInfo;
_go32_dpmi_lock_data(&counter, sizeof(counter));
_go32_dpmi_lock_code(handler, endHandler - handler);
_go32_dpmi_get_protected_mode_interrupt_vector(8, &oldInfo);
newInfo.pm_offset = (int) handler;
newInfo.pm_selector = _go32_my_cs();
_go32_dpmi_allocate_iret_wrapper(&newInfo);
_go32_dpmi_set_protected_mode_interrupt_vector(8, &newInfo);
while (counter < 3) {
printf("%u\n", counter);
}
_go32_dpmi_set_protected_mode_interrupt_vector(8, &oldInfo);
_go32_dpmi_free_iret_wrapper(&newInfo);
return 0;
}
私はハンドラをチェーンしているわけではなく、それを置き換えることに注意してください。カウンターは1
を超えて増加しないので(メインループを止めることはない)、ハンドラーが正しく戻らないか、一度だけ呼び出されると推測されます。もう一方のチェーンはうまくいきます(ラッパーラインを外し、set_protected_mode
をchain_protected_mode
に置き換えてください)。 行がありませんか?
'counter'は' volatile'とマークする必要があります。 –
また、 '_go32_dpmi_lock_code'と' ... data'の呼び出しで不要なキャストを取り除きます。 'void *'(任意の型のポインタを受け付ける)と 'size_t'(これは' sizeof'の結果です)をとります。 –
また、 'handler'のサイズを試して計算するために' endHandler'を使用することは疑わしいです。あなたが期待しているように 'endHandler'が' handler'の直後に来ることは何も保証していません。 GCCでは、より良い解決策は 'handler'をカスタムセクションに置き、リンカスクリプト変数を使ってそのサイズを取得することです。しかし私はDJGPPについてはわかりません。 –