我目前无法让中断处理程序在C中工作。我的代码的想法是将一个向量设置为IRQ 0,即PIT,并且在设置之后我可以找到中断8(0x08) PIT在大约40hz运行(我可以通过设置值29829或0x7485来实现。
该程序的最终预期结果是计数到秒,将某些内容打印到屏幕上,然后重复20次,此时它会自行卸载。
该程序是使用Borland的Turbo C在Am486-DX4-100上以120mhz运行的,使用IBM的PC-DOS 2000编译。该板是DataExpert的Socket 3 EXP-4045,但我在DOSBox上有相同的结果。 / p>
以下是代码:
#include <dos.h>
#include <stdio.h>
int a = 0;
int b = 0;
void interrupt clocktick(){
if(a == 40){
if(b == 20){
setvect(8, NULL);
}else b++;
}else a++;
}
int main(void){
/* set PIT mode*/
outp(0x34, 0x43);
outp(0x85,0x40); /* send low byte*/
outp(0x74,0x40); /* send high byte*/
setvect(0x08, clocktick);
while(1==1){
printf("a%i, b%i", a, b);
}
getchar();
return 0;
}
代码编译很好,并且在运行时,while外观确实显示A已经增加一次,但不会再次触发。显然有些东西正在产生一个中断,它甚至可能是PIT,但它并没有多次这样做。
我试图按照1987年的Turbo C用户手册,试图描述安装中断向量的方法,但我显然做错了。
我还要说我很抱歉不知道这些东西。我并不是要浪费人们的时间,但我真的需要帮助。我的例子是vauge,经过一些评论后,我确实看到了我可以做的事情,试图弄清楚发生了什么。
答案 0 :(得分:3)
您需要告诉PIC您已经完成处理中断,否则它将不再发出信号。通常,这是通过向PIC基本端口(0x20)发送EOI(0x20)来完成的,因此它基本上类似于outportb(0x20, 0x20);
,最好接近处理程序的末尾。
有关PIC的一些信息,例如: https://wiki.osdev.org/8259_PIC