微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM-Linux s3c2440 之中断分析(三)

ARM-Linux s3c2440 之中断分析(三)

时间:11-19 来源:互联网 点击:

val, S3C2410_INTMSK);

实现的功能是,屏蔽相应的中断。

在early_trap_init()中已经进行了中断(异常)向量的初始化,将异常向量表从物理地址0x00000000拷贝到虚拟0xffff0000的虚拟地址处。异常向量在arch/arm/kernel/entry-armv.S中定义:

  1. .globl__vectors_start
  2. rs_start:
  3. swiSYS_ERROR0
  4. bvector_und+stubs_offset
  5. ldrpc,.LCvswi+stubs_offset
  6. bvector_pabt+stubs_offset
  7. bvector_dabt+stubs_offset
  8. bvector_addrexcptn+stubs_offset
  9. bvector_irq+stubs_offset
  10. bvector_fiq+stubs_offset
  11. .globl__vectors_end

那么当有中断产生时:

  1. /*
  2. *Interrupthandling.Preservesr7,r8,r9
  3. */
  4. .macroirq_handler
  5. get_irqnr_preambler5,lr
  6. 1:get_irqnr_and_baser0,r6,r5,lr
  7. movner1,sp
  8. @
  9. @routinecalledwithr0=irqnumber,r1=structpt_regs*
  10. @
  11. adrnelr,1b
  12. bneasm_do_IRQ//跳转到这里中断的总入口函数

这里的asm_do_IRQ对应arch/arm/kernel/irq.c中:

  1. asmlinkagevoid__exceptionasm_do_IRQ(unsignedintirq,structpt_regs*regs)

所以这是Linux中所有中断的总入口函数。asm_doIRQ()调用generic_handle_irq()再后调用

generic_handle_irq_desc(),最后到各个irq_desc的处理。

  1. staticinlinevoidgeneric_handle_irq_desc(unsignedintirq,structirq_desc*desc)
  2. {
  3. #ifdefCONFIG_GENERIC_HARDIRQS_NO__DO_IRQ
  4. desc->handle_irq(irq,desc);
  5. #else
  6. if(likely(desc->handle_irq))
  7. desc->handle_irq(irq,desc);
  8. else
  9. __do_IRQ(irq);
  10. #endif
  11. }

从总入口到用户的中断处理函数的流程:

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top