歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux外部中斷架構初始化流程-----Tiny6410

arch/arm/plat-s3c64xx/irq-eint.c文件實現了S3C64XX系列的外部中斷初始化,這是一個內核模塊,入口點是s3c64xx_init_irq_eint,聲明如下:

arch_initcall(s3c64xx_init_irq_eint);

參考源碼可以確定編譯時會將其替換為

<SPAN >static initcall_t __initcall_s3c64xx_init_irq_eint3 __used __attribute__((__section__(".initcall3.init"))) = s3c64xx_init_irq_eint;</SPAN>

類似於驅動的module_init,這個宏定義將函數地址保存在變量__initcall_s3c64xx_init_irq_eint3 中,並強制其存放到段initcall3.init處,函數s3c64xx_init_irq_eint完成外部中斷的架構初始化,調用流程如下:

(1)s3c64xx_init_irq_eint

(2)set_irq_handler

(3)__set_irq_handler//設置跟架構相關的handle_irq,當中斷發生時會調用

(4)handle_level_irq

(5)handle_IRQ_event

(6)set_irq_chained_handler

(7)__set_irq_handler//設置中斷處理程序

當發生中斷時,首先跳轉到異常向量表處,然後調用do_asm_IRQ函數,接著調用generic_handle_irq<=generic_handle_irq_desc(按中斷號來查詢irq_desc型變量)<=desc->handle_irq(與架構相關)

 

內部異常和中斷設置流程如下圖:

 

在Linux中使用函數request_irq來申請中斷號,並注冊用戶中斷處理函數到系統中,request_irq函數在interrupt.h中定義如下:直接調用函數request_threaded_irq,而該函數定義在文件kernel\irq\Manage.c 中,分析源碼可知,它主要做以下事情:

1.動態分配一個irqaction結構體

2.將request_irq函數中傳遞進來的irq,irq_handler_t,flags等值賦給該結構體的對應字段上

3.調用.__setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)將該結構體掛載到對應中斷的irq_desc類型的結構體上

Copyright © Linux教程網 All Rights Reserved