2440之中断管理

中断处理:

       中断是嵌入式里最重要的一个概念。一般一个系统对于一个设备要么采用中断方式,要么采用轮询方式 。中断方式可以有效地减少处理器负荷 ,但是如果大量采用中断则有可能降低处理速度 ,因为中断处理破坏了处理器的流水机制。复习下微机原理中中断处理过程和中断机制。   

       2440中支持FIQ(快速中断)和IRQ(普通中断)2种中断方式,一般只采用IRQ中断。2440有60个中断源,不支持中断嵌套。具体的参考用户手册第14章。下图是2440中断产生过程。

具体的讲解一下,关于寄存器请查阅用户手册。

    中断源分为2种,子中断中断源和中断源,当一个子中断产生一个中断信号,子中断源挂起寄存器(SUBRCPND)相应位自动置1,察看子中断屏蔽寄存器 (SUBMASK)该子中断是否被屏蔽(人工设置),如果没屏蔽,则中断源寄存器(SRCPND)置1,察看该中断源是否被屏蔽和采用那种模式,如果没被 屏蔽,采用IRQ模式,进行优先级判断后,高优先级的执行,中断挂起寄存器置1,产生IRQ信号。同时CPSR寄存器的I位置1,表明当前有一个IRQ中 断产生。记得以前让大家注意该寄存器中的I和Q位了吧,他的作用就在这 。

中断处理过程:

    CPU每执行一条指令都会检查CPSR寄存器,当发现I和F位被置1时,就进行中断处理。第一步跳入异常向量表:

    b       ResetHandler

       b     HandlerUndef  ;handler for Undefined mode

       b     HandlerSWI    ;handler for SWI interrupt

       b     HandlerPabort ;handler for PAbort

       b     HandlerDabort ;handler for DAbort

       b     .             ;reserved

       b     HandlerIRQ    ;handler for IRQ interrupt

       b     HandlerFIQ     ;handler for FIQ interrupt

 

HandlerFIQ      HANDLER HandleFIQ

HandlerIRQ      HANDLER HandleIRQ

HandlerUndef    HANDLER HandleUndef

HandlerSWI      HANDLER HandleSWI

HandlerDabort   HANDLER HandleDabort

HandlerPabort   HANDLER HandlePabort

 

       ^   _ISR_STARTADDRESS        ; _ISR_STARTADDRESS=0x33FF_FF00

HandleReset   #   4

HandleUndef #   4

HandleSWI            #   4

HandlePabort    #   4

HandleDabort    #   4

HandleReserved  #   4

HandleIRQ             #   4

HandleFIQ             #   4

如果是IRQ 则跳到HandlerIRQ,此过程由硬件来完成。接下来

    ldr r0,=HandleIRQ       ;This routine is needed

    ldr r1,=IsrIRQ    ;if there is not 'subs pc,lr,#4' at 0x18, 0x1c

    str r1,[r0]

进行第2次跳转,跳转到2级中断向量表

IsrIRQ

    sub sp,sp,#4       ;reserved for PC

    stmfd   sp!,{r8-r9}

    ldr r9,=INTOFFSET

    ldr r9,[r9]

    ldr r8,=HandleEINT0

    add r8,r8,r9,lsl #2

    ldr r8,[r8]

    str r8,[sp,#8]

    ldmfd   sp!,{r8-r9,pc}

 

HandleEINT0     #   4

HandleEINT1     #   4

HandleEINT2     #   4

HandleEINT3     #   4

次代码完成了建立2级中断向量表,在我们中断程序中我们先对中断进行注册

例 EINT0 = ISR_FUNC();这样就完成了中断向量和中断服务程序的关联。跳到2级中断向量表后就进入了中断处理程序。中断处理完成了CPU返回继续执行中断处理前的下一条程序,关于处理现场的保护部分参考微原部分。

下边是一个关于中断处理函数的测试题:明白中断处理函数的使用

中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字

__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。

__interrupt double compute_area (double radius)

{

 double area = PI * radius * radius;

 printf("\nArea = %f", area);

 return area;

}

 

上边就是2440的中断产生及处理过程,这些是最基本的知识要牢牢掌握。对于ARM这些都是一样的,只不过是寄存器有可能不一样,但处理过程是一样的,有些处理器支持中断可重入,如710处理器。阅读下用户手册14章中关于优先级部分,注意下有些寄存器的清0方法。

posted @ 2011-07-01 14:03  hnrainll  阅读(1305)  评论(0编辑  收藏  举报