ARM-Linux s3c2440 之中断分析(三)
时间:11-19
来源:互联网
点击:
val, S3C2410_INTMSK);
实现的功能是,屏蔽相应的中断。
在early_trap_init()中已经进行了中断(异常)向量的初始化,将异常向量表从物理地址0x00000000拷贝到虚拟0xffff0000的虚拟地址处。异常向量在arch/arm/kernel/entry-armv.S中定义:
- .globl__vectors_start
- rs_start:
- swiSYS_ERROR0
- bvector_und+stubs_offset
- ldrpc,.LCvswi+stubs_offset
- bvector_pabt+stubs_offset
- bvector_dabt+stubs_offset
- bvector_addrexcptn+stubs_offset
- bvector_irq+stubs_offset
- bvector_fiq+stubs_offset
- .globl__vectors_end
那么当有中断产生时:
- /*
- *Interrupthandling.Preservesr7,r8,r9
- */
- .macroirq_handler
- get_irqnr_preambler5,lr
- 1:get_irqnr_and_baser0,r6,r5,lr
- movner1,sp
- @
- @routinecalledwithr0=irqnumber,r1=structpt_regs*
- @
- adrnelr,1b
- bneasm_do_IRQ//跳转到这里中断的总入口函数
这里的asm_do_IRQ对应arch/arm/kernel/irq.c中:
- asmlinkagevoid__exceptionasm_do_IRQ(unsignedintirq,structpt_regs*regs)
所以这是Linux中所有中断的总入口函数。asm_doIRQ()调用generic_handle_irq()再后调用
generic_handle_irq_desc(),最后到各个irq_desc的处理。
- staticinlinevoidgeneric_handle_irq_desc(unsignedintirq,structirq_desc*desc)
- {
- #ifdefCONFIG_GENERIC_HARDIRQS_NO__DO_IRQ
- desc->handle_irq(irq,desc);
- #else
- if(likely(desc->handle_irq))
- desc->handle_irq(irq,desc);
- else
- __do_IRQ(irq);
- #endif
- }
从总入口到用户的中断处理函数的流程:
asm_do_IRQ() –-> generic_handle_irq() –->irq_dsc->handle() à handle_IRQ_event() à irq_des->action()
最后对中断处理流程进行简单总结:
(1)总入口函数asm_do_IRQ,获取中断号irq
(2)asm_do_IRQ根据中断号调用各中断号所注册的中断入口函数irq_desc[irq]->handle_irq
(3)最后在中断入口函数中调用handle_IRQ_event()依次执行用户的中断处理函数action
ARMLinuxs3c2440中 相关文章:
- ARM-Linux s3c2440 之中断分析(一)(11-19)
- ARM-Linux s3c2440 之中断分析(二)(11-19)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)