Я сейчас программирую ядро на с ++. Так как в качестве основной части ядра я реализовал модуль обработки прерываний в моем ядре, и он работает хорошо. Но это не работает для прерывания 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
Так что, пожалуйста, любой может помочь мне решить эту проблему.
Спасибо.