博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ecos中断机制分析(1)
阅读量:4465 次
发布时间:2019-06-08

本文共 1924 字,大约阅读时间需要 6 分钟。

不同的微处理器提供的中断处理机制不相同,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中的存储示意图如下图:

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

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

其中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入口地址的方式。

转载于:https://www.cnblogs.com/kuainiao/archive/2013/01/30/2883317.html

你可能感兴趣的文章
c3po数据库连接池中取出连接
查看>>
bootstrap-table 分页
查看>>
使用本机IP调试web项目
查看>>
【Java面试题】58 char型变量中能不能存贮一个中文汉字?为什么?
查看>>
C++ Primer 第六章 函数
查看>>
交互设计算法基础(3) - Quick Sort
查看>>
Ubuntu各种软件的安装
查看>>
Android电源管理
查看>>
C#_基础_方法以及方法重载(十)
查看>>
新起点新希望
查看>>
LINQ系列:LINQ to DataSet的DataTable操作
查看>>
ASP。net 测验
查看>>
java开发环境搭建-慕课网
查看>>
NOIP2015-D2T3运输计划
查看>>
Z :彻底了解指针数组,数组指针以及函数指针 [复
查看>>
2013年终总结
查看>>
Start to study Introduction to Algorithms
查看>>
AE常见接口之间的关系(较笼统)+arcgis常见概念
查看>>
正则表达式
查看>>
三元操作设计不同类型的时候,最终结果的问题
查看>>