差別系統中斷函數和使用者中斷函數
和前面一篇文章差別開來,之是以要差別系統中斷函數和使用者中斷函數,這是我自己的了解。
來看一個結構體:
struct irq_desc {
unsigned int irq;
struct irq_chip *chip;
irq_flow_handler_t handle_irq;
struct irqaction *action;/* IRQ action list */
...
} ____cacheline_internodealigned_in_smp;
前面通過set_irq_chip和set_irq_handler是設定了struct irq_desc結構體中的chip和handler_irq,中斷産生後,handler_irq對應的系統中斷處理函數會首先被調用,這個系統中斷處理函數又會去調用irq_desc->action即使用者中斷處理函數,并且會周遊irq_desc下所有的action,是以要把系統中斷處理函數handler_irq與使用者中斷處理函數action差別開來。以handler_irq為handle_level_irq的例子,如下:
void handle_level_irq(unsigned int irq, struct irq_desc *desc)
{
...
action = desc->action;
action_ret = handle_IRQ_event(irq, action);
...
}
irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action)
{
...
do {
ret = action->handler(irq, action->dev_id);
switch (ret) {
case IRQ_WAKE_THREAD:
...
case IRQ_HANDLED:
...
default:
break;
}
retval |= ret;
action = action->next;
} while (action);
return retval;
}