无法让中断处理程序在C

时间:2018-01-28 20:20:29

标签: c vector dos interrupt turbo-c

我目前无法让中断处理程序在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,经过一些评论后,我确实看到了我可以做的事情,试图弄清楚发生了什么。

1 个答案:

答案 0 :(得分:3)

您需要告诉PIC您已经完成处理中断,否则它将不再发出信号。通常,这是通过向PIC基本端口(0x20)发送EOI(0x20)来完成的,因此它基本上类似于outportb(0x20, 0x20);,最好接近处理程序的末尾。

有关PIC的一些信息,例如: https://wiki.osdev.org/8259_PIC