C PIT不向IRQ0发送中断
这可能是个不切实际的问题, 但我一直遵循编写小型操作系统的教程。 到目前为止,我已经设置了中断描述符表,这是一种 注册处理程序,默认处理程序(将整数打印到屏幕) 并将PIC重新映射到中断0x20及以上 我只是将可编程间隔计时器设置为50赫兹,但它确实如此 不生成任何IRQ0。我已在中的中断32处设置了计时器处理程序 描述符表,但如果我使用以下命令手动生成中断: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
\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示例: