在這裡也介紹一下實作的部份給大家!
在linux下,系統初始的時候,會呼叫init_IRQ()將IDT設置完畢,即把中斷向量做好配置,然而裡面對應的中斷服務仍然是空的,直到硬體呼叫request_irq(), 才正式向系統登記中斷處理程式。
這次實驗目的是要觀察中斷初始的動作,以及觀察向系統登記的中斷處理程式,並練習修改中斷處理程式的內容。
系統的初始: 在Target的原始碼的init/main.c 的start_kernel函式中加入一個printk指令。(Linux Host的/usr/src/creator/pxa270/linux/init/main.c)
printk(“Initialize IRQ”);
/*Modify*/
init_IRQ();
也在將要觀察的驅動程式的request_irq之前,加入一個printk,這裡觀察的是位在creator-pxa270-lcd.c的函式_7segment_timer_operation中。(Linux Host的/usr/src/creator/pxa270/linux/drivers/char/creator-pxa270-lcd.c)
/*Modify*/
printk(“request IRQ: %d\n”, INT_NO);
/*Modify*/
result = request_irq(INT_NO, _7segment_timer_irq, SA_INTERRUPT, g_7_segment_timer_id, NULL);
加入驅動程式,編譯核心後可以看到結果如下:
中斷事件處理函式: 由request_irq的呼叫,可以看到登記的handler是_7segment_timer_irq,當登記的IRQ被觸發的時候,系統會找到這個handler做對應的動作。這個handler也是寫在driver裡面,
,對照版子提供的資訊,發現IRG0是對應七段顯示器顯示的暫存器,再看細部handler的內容,應該是在每次事件觸發的時候,來顯示不同的七段顯示器,讓它從肉眼看起來像同時顯示。
中斷處理所登記的IRQ和硬體有關,所以要新增一個中斷必須要有硬體和軟體的支援。現在利用剛才註冊的中斷,抽換掉處理的函式,藉此觀察中斷處理函式該如何寫。
新增一個中斷處理函式,如下
static irqreturn_t
timer_led_irq ( int iqr, void *dev_id, struct pt_regs *regs)
{
scan_led++;
IO_REG2 = scan_led | 0xfe;
return (IRQ_HANDLED);
}
並修改剛才看到的request_irq,如下
result = request_irq(INT_NO, timer_led_irq, SA_INTERRUPT, g_7_segment_timer_id, NULL);
重新編譯核心,然後將kernel下載到板子上,可以看到改為由LED跳動,而不是七段顯示器。
這學期正好修了嵌入式,感覺映證了滿多OS上課內容。或許以後上課可以朝這方向來實施。
參考文獻:
Creator PreSOCes Development Kit
Interrupt and Exception slice by NTHU EOS lab
Linux for creator-XSacle-PXA270 User Guide
RT-952-033-14_Creator_LCD_Device_Driver.pdf
Linux Interrupt






