보호 모드에서 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
으로 바꿉니다). 라인이 누락 되었습니까?
'카운터'는 '휘발성'으로 표시해야합니다. –
또한'_go32_dpmi_lock_code'와'... data' 호출에서 불필요한 캐스트를 제거하십시오. 그들은'void * '(어떤 타입의 포인터도 받아 들일 것임)와'size_t' (이것은'sizeof'의 결과입니다)를 취합니다. –
또한,'handler '의 크기를 계산하기위한'endHandler'의 사용은 의심 스럽습니다. 'endHandler'가 당신이 예상하는 것처럼'handler' 바로 다음에 오는 것을 보장하는 것은 아무것도 없습니다. GCC에서 더 나은 해결책은 커스텀 섹션에'handler'를 넣고 링커 스크립트 변수를 사용하여 크기를 얻는 것입니다. DJGPP에 대해서는 잘 모르겠습니다. –