Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C PIT不向IRQ0发送中断_C_Timer_Interrupt_Irq - Fatal编程技术网

C PIT不向IRQ0发送中断

C PIT不向IRQ0发送中断,c,timer,interrupt,irq,C,Timer,Interrupt,Irq,这可能是个不切实际的问题, 但我一直遵循编写小型操作系统的教程。 到目前为止,我已经设置了中断描述符表,这是一种 注册处理程序,默认处理程序(将整数打印到屏幕) 并将PIC重新映射到中断0x20及以上 我只是将可编程间隔计时器设置为50赫兹,但它确实如此 不生成任何IRQ0。我已在中的中断32处设置了计时器处理程序 描述符表,但如果我使用以下命令手动生成中断:\uu asm\uuuu volatile(“int$0x20”);我会在屏幕上打印“Tick:0x00000001” 这是我的timer

这可能是个不切实际的问题, 但我一直遵循编写小型操作系统的教程。 到目前为止,我已经设置了中断描述符表,这是一种 注册处理程序,默认处理程序(将整数打印到屏幕) 并将PIC重新映射到中断0x20及以上

我只是将可编程间隔计时器设置为50赫兹,但它确实如此 不生成任何IRQ0。我已在中的中断32处设置了计时器处理程序 描述符表,但如果我使用以下命令手动生成中断:
\uu asm\uuuu volatile(“int$0x20”);
我会在屏幕上打印“Tick:0x00000001”

这是我的timer.c文件:

#include <common.h>
#include <drivers/timer.h>
#include <drivers/isr.h>
#include <drivers/display.h>
#include <drivers/io.h>

u32int tick = 0;

static void timer_callback(registers_t regs) {
  tick++;
  print("Tick: ");
  print_hex_dword(tick);
  print("\n");
}

void init_timer(u32int frequency) {
  register_interrupt_handler(IRQ0, &timer_callback);

  u32int divisor = 1193180 / frequency;

  outb(0x43, 0x36);

  u8int l = (u8int) (divisor & 0xFF);
  u8int h = (u8int) ((divisor >> 8) & 0xFF);

  outb(0x40, l);
  outb(0x40, h);
}
#包括
#包括
#包括
#包括
#包括
u32int tick=0;
静态无效计时器回调(寄存器){
tick++;
打印(勾选:);
打印十六进制双字(勾号);
打印(“\n”);
}
无效初始计时器(u32int频率){
寄存器中断处理程序(IRQ0和定时器回调);
u32int除数=1193180/频率;
outb(0x43,0x36);
u8int l=(u8int)(除数和0xFF);
u8int h=(u8int)((除数>>8)和0xFF);
outb(0x40,l);
outb(0x40,h);
}

感谢所有回复者。 你的回答很有帮助,但问题是 设置IDT并重新映射PIC后,我 忘了把大会再次列入议程 启用中断

附言: 是的,在重新映射图片后,我用0x0屏蔽了它们 这将启用所有中断。 -谢谢迈克尔·佩奇

另外,我正在Oracle VirtualBox上运行内核 Ubuntu 12.10,偶尔在真实硬件上进行测试。 它也不起作用,所以我认为计时器不起作用 以任何方式残疾。
-感谢Martin James

您是否可能没有使用启用PIT中断的掩码对PIC进行编程?通常这是通过读取端口0x21(主PIC数据端口)完成的然后通过将新掩码写入0x21来启用IRQ。将掩码中的一位设置为0将启用中断。因此,您必须使用0xFE(1111111 0)启用当前位掩码以启用IRQ0处的PIT…或者可能必须在某些电源管理寄存器中打开计时器硬件?最小工作PIT示例: