먼저 Vintage 컴퓨터 그룹을 위해 프로그램합니다. 내가 쓰는 것은 사람들이 무엇을 실행하고 있는지 알기 때문에 특히 MS-DOS가 아니라 창을위한 것입니다. 현재 프로그램은 나중에 시스템을위한 것이며 8086 라인이 아니기 때문에 IRQ 8을 사용하는 것이 계획되었습니다. 이렇게하면 2/2 초에서 8192/초 (2, 4, 8, 16, etc ...)IRQ 8이 작동하지 않습니다 ... HW 또는 SW?
어떤 이유로 든 더 오래된 시스템 (ok, 이상하게 들릴 수 있음)에서만 작동하지 않는 것 같습니다. 에뮬레이션 및 386 시스템에서 액세스 할 수 있지만 잘 작동하지만 P3 시스템에서 (GA-6BXC MB w/P3 800 CPU) 작동하지 않습니다. 다운
,536,913,632 프로그램을 닫을 때코드
인터럽트
outportb(0x70,0x0c);
inportb(0x71); //Reading the C register resets the interrupt
outportb(0xa0,0x20); //Resets the PIC (turns interrupts back on)
outportb(0x20,0x20); //There are 2 PICs on AT machines and later
끝에 인터럽트
disable();
oldrtc = getvect(0x70); //Reads the vector for IRQ 8
settvect(0x70,countdown); //Sets the vector for
outportb(0x70,0x8a);
y = inportb(0x71) & 0xf0;
outportb(0x70,0x8a);
outportb(0x71,y | _MRATE_); //Adjustable value, set for 64 interrupts per second
outportb(0x70,0x8b);
y = inportb(0x71);
outportb(0x70,0x8b);
outportb(0x71,y | 0x40);
enable();
설정 10
disable(); outportb(0x70,0x8b); y = inportb(0x71); outportb(0x70,0x8b); outportb(0x71,y & 0xbf); setvect(0x70,oldrtc); enable();
문제를 일으킬 수있는 코드가 표시되지 않습니다. 그러나 그것은 단지 이해가되지 않는 것처럼 보입니다. 정보를 전적으로 신뢰하지는 않지만 MSD는 IRQ 8을 RTC 카운터로보고하고 있으며 이것이 현재 잘 작동하고 있다고 말합니다. 나중에 시스템이 벡터를 움직일 수 있습니까? 내가 찾은 모든 것은 IRQ 8이 벡터 0x70이지만 인터럽트는 내 펜티엄 III 시스템에서 결코 발생하지 않는다고 말합니다. 벡터가 변경되었는지 확인하는 방법이 있습니까?
나는 실제로 이미 매우 빠른 (짧은 코드) 기능을 위해 PIT1 & PIT3 사용. 처음 빌드에서는 타이머 기능에도이 코드를 사용했지만 더 많은 코드를 필요로합니다. 따라서 성능이 크게 저하되었습니다. 초당 64 회 실행되는 코드는 코드가 초당 23K 회 발생하는 것보다 적은 영향을줍니다. 그리고 네, 이미 더 빠른 PIT1 인터럽트 루틴을위한 시계를 조정하고 있습니다. 나는 BIOS가 IRQ 8을 완전히 무력하게 할 수 있다는 것을 발견하지 못한다. 나는 이것을 탐지하고 다시 사용할 수있는 방법을 찾을 수없는 것 같다. ( – user3399848
일부 BIOS 유형이 IRQ 8을 감추는 것으로 판명되었다.그래서 줄을 추가했습니다. outportb (0xa1, inportb (0xa1) & 0x7f); outportb (0x21, inportb (0x21) & 0xdf); 초기화에 . 그러나 그것은 그 문제를 해결하지 못했습니다. – user3399848
흠, 나는 시도 할 다른 것을 생각할 수 없다. 이를 통해 오는 또 다른 해결 방법은 짧은 이벤트 처리기에 시세 표시기를 넣고 다른 쪽을 롤오버 할 때만입니다. 그래서 느린 함수 호출을 억제합니다. 23k/sec 함수에서와 마찬가지로,'inc [somebyte]; jz do_more; iret;'- 어떤 바이트가 0으로 롤백되면, 당신은 256 번의 반복을 거쳤고 다시 호출 할 수 있음을 의미합니다. 그건 전화를 걸지 않는 시간에 끔찍하게 느려지지 않고 초당 90 건의 통화를하는 것입니다. –