首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM remap与重定位摘抄 (3)

ARM remap与重定位摘抄 (3)

表1
异常类型 工作模式 正常地址 复位 管理 0x00000000 未定义指令 未定义 0x00000004 软件中断(SWI) 管理 0x00000008 预取中止 中止 0x0000000 数据中止 中止 0x00000010 预留 - 0x00000014 IRQ(中断) IRQ 0x00000018 FIQ(快速中断) FIQ 0x0000001 地址重新映射之后,入口地址被映射到RAM中,中断处理代码也被搬移到RAM地址空是。此时,中断响应和中断处理的速度都将大大加快,这将有利于提高整个系统的实时性。异常中断向量表的设计结构如图3所示。
下面是各部分的源代码(以IRQ异常中断为例)。
异常向量表的定义:(系统初始化时,将异常处理代码入口地址写入异常中的向量表)
_RAM_END_ADDREQU0x01000000;重映射后RAM的终止地址
MAP(_RAM_END_ADDR-0x100)
SYS_RST_VECTOR#4
UDF_INS_VECTOR#4
SWI_SVC_VECTOR#4
INS_ABT_VECTOR#4
DAT_ABT_VECTOR#4
RESERVED_VECTOR#4
IRQ_SVC_VECTOR#4
FIQ_SVC_VECTOR#4
异常初始化代码:

bIRQ_SVC_HANDLER;0x18

IRQ_SVC_HANDLER
SUBsp,sp,#4;满递减堆栈
STMFDsp!,{r0}
LDRr0,=IRQ_SVC_VECTOR;读取中断向量,
;IRQ_SVC_VECTOR=SystemrqHandle
LDRr0,[r0]
STRr0,[sp,#4]
LDMFDsp!,{r0,pc};跳转到异常中断处理代码入口
异常处理入口代码:

SystemIrqHandler
IMPORTISR_IrqHandler
STMFDsp!,{r0-r12,lr}
BLISR_IrqHandler;跳转到C代码中异常中断处理程序ISR_IrqHandler
LDMFDsp!,{r0-r12,lr}
SUBSpc,lr,#4

在如上的结构中,不管系统是否进行了地址的重映射,异常中断向量都可以在运行时动态改变,大大提高了中断处理中的灵活性。中断向量可以在运行时指向不同的异常处理代码入口。
继承事业,薪火相传
返回列表