zoukankan      html  css  js  c++  java
  • ecos中断机制分析(1)

    不同的微处理器提供的中断处理机制不相同,ecos对各种处理机制作了一定的抽象,提供了一种通用的中断处理机制。下面以m68k的mcf52xx系列处理器为例分析。当中断产生时,ecos的一段跳转程序使处理器跳转到相应的VSR,对mcf52xx处理器来说这段跳转程序就是中断向量表,当然不同处理器的跳转程序有不同的实现方式。VSR作了一些简单处理后,会调用中断服务程序(ISR)作进一步处理,对ISR的调用采用寻找中断服务程序向量表的方式。有些中断在ISR结束后还会调用延迟服务程序(DSR)作进一步处理。以下是构成mcf52xx的中断向量表的汇编代码:

    /***********************************************************************/
    /*      ROM vector table   */

            .macro  hw_vsr name
            .long   hw_vsr_\name
            .endm

            .section ".romvec","ax"

            .globl  rom_vsr_table
    rom_vsr_table:

            /*   0 - Initial SSP                            */
            hw_vsr  stack             

            /*   1 - Initial PC                             */
            hw_vsr  reset

            /*   2-24 - Default exception handlers          */
            .rept   24-2+1
            hw_vsr  default
            .endr

            /*   25-31 - Autovector interrupts 1-7          */
            .rept   31-25+1
            hw_vsr  autovec
            .endr

            /*   32-63 - Default exception handlers         */
            .rept   63-32+1
            hw_vsr  default
            .endr

            /*   64-255 - User interrupt vectors            */
            .rept   255-64+1
            hw_vsr  interrupt
            .endr

            .equ    rom_vsr_table_size, . - rom_vsr_table

      这段代码构成了中断向量表,假设处理器按rom方式启动,通过链接脚本.ld文件将该中断向量表的起始位置放在复位后PC入口位置(假设为0xFFE00000),该向量表在rom中的存储示意图如下图:

                                    ecos中断机制分析(1)

          当复位中断产生时,处理器首先从0xFFE00000取出一个长字来初始化堆栈寄存器SP,然后取出紧跟着的一个长字来初始化PC,此时PC值为hw_vsr_reset,也即一段向量服务程序(VSR)的入口地址。

    同样,当其他中断(或例外)产生时,mcf52xx处理器自动将一个32位状态字和PC压栈,如下图所示:

    ecos中断机制分析(1)

    其中VECTOR[7:0]为当前中断的中断向量号,SR(STATUSREGISTER) [10:8]三位为当前中断级别,用于屏蔽低于或等于当前级别的中断,之后处理器会根据中断号从中断向量表中获得相应向量服务程序(VSR)的入口地址。这里重点分析64到255号中断的向量服务程序。

            .equ      int_pres_regs_sz,((2+3)*4)
            .macro    int_pres_regs
            lea.l     -int_pres_regs_sz(%sp),%sp
            movem.l   %d0-%d2/%a0-%a1,(%sp)
            .endm
            .macro    int_rest_regs
            movem.l   (%sp),%d0-%d2/%a0-%a1
            lea.l     int_pres_regs_sz(%sp),%sp
            .endm

      首先定义了两个宏int_pres_regs和int_rest_regs分别用于压栈和恢复d0,d1,d2,a0,a1五个寄存器,即对CPU状态进行一定程度的保存。

            .text
            .balign 4
    hw_vsr_interrupt:

            int_pres_regs        

            move.l #(-64+7)*4,%d0  

    hw_vsr_int_common:                                 

            move.w  int_pres_regs_sz(%sp),%d1   

            and.l   #0x000003fc,%d1                           

            add.l   %d1,%d0    

            asr.l   #2,%d1      

       这里获取65-255号中断ISR入口地址在中断服务程序(ISR)向量表存放的位置。前面提到VSR作了一些简单处理后,会调用中断服务程序(ISR)作进一步处理,对ISR的调用采用从中断服务程序向量表获取ISR入口地址的方式。

    http://blog.sina.com.cn/s/blog_48803ff301000ai3.html

  • 相关阅读:
    HTML_表单
    HTML_列表、表格与媒体元素
    HTML_HTML5基础
    使用java理解程序逻辑 试题分析
    字符串
    带参数的方法
    人机猜拳
    类的无参方法
    类和对象
    vue cli+axios踩坑记录+拦截器使用,代理跨域proxy(更新)
  • 原文地址:https://www.cnblogs.com/kuainiao/p/2883326.html
Copyright © 2011-2022 走看看