периодическое прерывание RTC в ядре My OS - PullRequest
1 голос
/ 29 августа 2011

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

Так что, пожалуйста, любой может помочь мне решить эту проблему.

Спасибо.

1 Ответ

1 голос
/ 06 октября 2011

Ваша математика в вашем коде неверна.

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

установит обработчик в позицию 0x41 в IDT, если SLAVE_VEC равен 0x40 (как подразумевают ваши комментарии), когда вы, конечно, хотите установить его в позицию 0x40, поскольку 0x40 - это прерывание, которое запускается PICдля IRQ8 (опять же, при условии, что PIC настроен на базу 0x40).

Ваш код должен читать: -

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

, что правильно настроит запись 0x40-й IDT для IRQ8.

...