无法让中断处理程序在 C 中工作
Unable to get interrupt handlers to work in 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 上的结果相同。
代码如下:
#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 用户手册,其中试图描述安装中断向量的方法,但我显然做错了什么。
我还要说对不起,我不知道这些东西。我不是要浪费别人的时间,但我真的需要帮助。我的例子很空泛,经过一些评论后,我确实看到了我本可以做的事情来弄清楚发生了什么。
你需要告诉PIC你已经完成了中断处理,否则它不会再发出信号。通常这是通过将 EOI (0x20) 发送到 PIC 基本端口 (0x20) 来完成的,因此它基本上类似于 outportb(0x20, 0x20);
,最好在处理程序的末尾附近。
有一些关于 PIC 的信息,例如https://wiki.osdev.org/8259_PIC
我目前在让中断处理程序在 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 上的结果相同。
代码如下:
#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 用户手册,其中试图描述安装中断向量的方法,但我显然做错了什么。
我还要说对不起,我不知道这些东西。我不是要浪费别人的时间,但我真的需要帮助。我的例子很空泛,经过一些评论后,我确实看到了我本可以做的事情来弄清楚发生了什么。
你需要告诉PIC你已经完成了中断处理,否则它不会再发出信号。通常这是通过将 EOI (0x20) 发送到 PIC 基本端口 (0x20) 来完成的,因此它基本上类似于 outportb(0x20, 0x20);
,最好在处理程序的末尾附近。
有一些关于 PIC 的信息,例如https://wiki.osdev.org/8259_PIC