【发布时间】:2011-11-05 22:54:35
【问题描述】:
我目前正在用 C++ 编写内核。因此,作为内核的基本部分,我在内核中实现了一个中断处理模块,它运行良好。但它不适用于 RTC IRQ8 中断。
这是我启用 irq 的代码:
void IDT::enable_irq(unsigned short x, void (*handler)(), unsigned char control){
current_mask &= ~(1<<x) ; //Zero off the IRQ mask to enable
if (x>=8)
{
current_mask &= ~(1<<2);
set_int((x + SLAVE_VEC - 7),(unsigned long) handler, control);
}
else //Sets the appropriate interrupt at the same time
{
set_int((x + MASTER_VEC),(unsigned long) handler, control);
}
outb(PICMI, current_mask & 0xff);
outb(PICSI, (current_mask >> 8) & 0xff);
}
set_int是在IDT中添加中断入口的函数。
如果我称它为:它对键盘中断非常有用:
enable_irq(1,kbInt,INT_GATE|BITS_32|PRESENT|RING_2);
但如果我为 irq8 (即 RTC)调用它,那么它就不起作用了。
enable_irq(8,rtcInt,INT_GATE|BITS_32|PRESENT|RING_2);
它给了我这样的错误:An unhandled interrupt has occurred...
然后我按照本教程中的说明进行操作: http://wiki.osdev.org/RTC
但我想做的是,我想生成周期性的 RTC 中断并在每次中断时在屏幕上显示时间。或者我想在每个 rtc 中断上调用一个特定的函数
所以请谁能帮我解决这个问题。
谢谢。
【问题讨论】:
-
基本上我想做的是,在每个 RTC 中断的屏幕上显示一个时间。
-
如何在 C++ 中启用 IRQ8 并在每个中断上调用特定函数
-
您可以编辑自己的问题以进行更新。
-
如果这是你自己的操作系统内核,那么你应该知道如何安装一些中断处理程序。或者您的问题是如何为您的硬件做到这一点?那么至少知道这是什么硬件是有用的。
-
0x70 是 IRQ8 的默认中断,除非您已通过对 PIC 进行编程更改它(请参阅here)。
SLAVE_VEC的定义是什么?你是如何初始化 PIC 的?
标签: c++ operating-system kernel