【问题标题】:periodic RTC interrupt in My own OS kernel我自己的操作系统内核中的周期性 RTC 中断
【发布时间】: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


【解决方案1】:

您的代码中的数学是错误的。

if (x>=8) 
{ 
    current_mask &= ~(1<<2); 
    set_int((x + SLAVE_VEC - 7),(unsigned long) handler, control); 
} 

如果 SLAVE_VEC 为 0x40(正如您的 cmets 所暗示的),则将在 IDT 中的位置 0x41 安装一个处理程序,而您肯定想将其安装在位置 0x40,因为 0x40 是由 PIC 为 IRQ8 触发的中断(再次,假设PIC 配置为具有 0x40 的基数)。

您的代码应为:-

if (x>=8) 
{ 
    current_mask &= ~(1<<2); 
    set_int((x + SLAVE_VEC - 8),(unsigned long) handler, control); 
} 

这将为 IRQ8 正确配置第 0x40 个 IDT 条目。

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2014-05-27
    • 2016-04-25
    • 2016-10-21
    • 1970-01-01
    相关资源
    最近更新 更多