微控制器下的中斷處理:
1.分辨是哪個中斷
2.呼叫處理函式
3.清中斷
在linux中,上面的這些操作基本上都是在asm_do_irq中進行操作的,下面進行分析:
asmlinkage void __exception asm_do_irq(unsigned int irq, struct pt_regs *regs)
else
。。。}
static inline void generic_handle_irq_desc(unsigned int irq, struct irq_desc *desc)
查詢**發現handle_irq在下面**中被呼叫:
路徑:chip.c (kernel\irq)
void
__set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
const char *name)
raw_spin_unlock_irqrestore(&desc->lock, flags);
chip_bus_sync_unlock(irq, desc);
}繼續搜說:
路徑:irq.h (include\linux)
static inline void
set_irq_handler(unsigned int irq, irq_flow_handler_t handle)
最後發現該函式在irq-eint.c (arch\arm\mach-s3c64xx) 中被呼叫,**如下:
static int __init s3c64xx_init_irq_eint(void)
set_irq_chained_handler(irq_eint0_3, s3c_irq_demux_eint0_3);
set_irq_chained_handler(irq_eint4_11, s3c_irq_demux_eint4_11);
set_irq_chained_handler(irq_eint12_19, s3c_irq_demux_eint12_19);
set_irq_chained_handler(irq_eint20_27, s3c_irq_demux_eint20_27);
return 0;
}然後:arch_initcall(s3c64xx_init_irq_eint); //這個arch_initcall的意義可以參考:
意思就是在系統初始化的時候會自動呼叫s3c64xx_init_irq_eint這個函式。
分析到這裡看下handle_level_irq:
void
handle_level_irq(unsigned int irq, struct irq_desc *desc)
下面看下mask_ack_irq和handle_irq_event
mask_ack_irq
static inline void mask_ack_irq(struct irq_desc *desc, int irq)
desc->status |= irq_masked;
}mask_ack的實現如下:
static void s3c_irq_eint_maskack(unsigned int irq)
handle_irq_event
irqreturn_t handle_irq_event(unsigned int irq, struct irqaction *action)
while (action);
...return retval;
到這裡先總結一下:
按下按鍵:
1.進入異常模式:比如 b vector_irq + 偏移
2.進入__irq_usr
3.b asm_do_irq
4.irq_desc[irq] -> handle_irq,即handle_level_irq
handle_level_irq的工作:
1.mask_ack_irq
2.handle_irq_event ,最終呼叫action->handler
下面為圖示:
以上都是linux系統幫我們做好的,那麼我們如何告訴核心我們的處理函式?
使用request_irq函式來註冊
request_irq的工作:
1.分配irqaction結構
2.setuo_irq(irq,action)
a.在irq_desc[irq]-> action鍊錶中假如action
b.desc->chip->settype()
c.desc -> chip -> startup/enable
6410之中斷處理
中斷 在6410 arm體系中,有很多模組可以產生中斷,比如gpio,uart,ts等都可以產生。在這些模組和cpu之間還有乙個中斷控制器。這個中斷控制器就是用於協調這些模組和cpu之間的互動的。比如 gpio和uart同時發出中斷請求,那麼cpu來處理那個中斷呢?這就需要用到中斷控制器了。如下圖所...
6410之中斷處理
中斷 在6410 arm體系中,有很多模組可以產生中斷,比如gpio,uart,ts等都可以產生。在這些模組和cpu之間還有乙個中斷控制器。這個中斷控制器就是用於協調這些模組和cpu之間的互動的。比如 gpio和uart同時發出中斷請求,那麼cpu來處理那個中斷呢?這就需要用到中斷控制器了。如下圖所...
Linux中斷處理之共享中斷處理初探
在看lkd 第二版 第六章 中斷和中斷處理程式 的時候,剛開始接觸到中斷線號和共享中斷線的時候半天愣是沒有想明白,原來理解的中斷和中斷和中斷處理程式就是通過中斷線號來進行關聯,硬體發生中斷,然後通過中斷線號查詢對應的中斷處理程式,最後中斷處理程式返回,此次中斷則處理完畢,沒想到冒出來個共享中斷線,呵...