zoukankan      html  css  js  c++  java
  • 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方法。

  • 相关阅读:
    使用批处理文件(.bat)启动Java程序
    VARCHAR2(%n)和VARCHAR2(%n char)区别
    Truncate Table
    Ext4之杂七杂八
    Oracle导表
    关于hibernate的session.createSQLQuery(sql)直接调用底层SQL后,返回结果集的问题
    Ext4真是难(展开表格行,显示图表)
    Hadoop学习笔记【入门】
    魅蓝note 做Android真机调试
    11-java学习笔记-反射
  • 原文地址:https://www.cnblogs.com/hnrainll/p/2095464.html
Copyright © 2011-2022 走看看