2011-08-29 39 views
1

我目前正在用C++編程一個內核。所以,作爲內核的基本部分,我在內核中實現了一箇中斷處理模塊,它運行良好。但它不適用於RTC IRQ8中斷。我自己的操作系統內核中的週期性RTC中斷

這是我的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...

然後我followd從本教程說明: http://wiki.osdev.org/RTC

但我想做的事情,我想產生週期性的RTC中斷是什麼,顯示時間在每個中斷屏幕上。或者我想調用每個rtc中斷的特定函數

所以請任何人都可以幫助我解決這個問題。

謝謝。

+0

基本上我想要做的是在每個RTC中斷屏幕上顯示一個時間。 –

+0

如何啓用IRQ8並在C++中調用每個中斷的特定功能 –

+0

您可以編輯自己的問題以獲取更新。 –

回答

1

您的代碼中的數學錯誤。

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); 
} 

將正確配置IRQ8的0x40th IDT入口。