灵活处理32位ARM嵌入式系统异常中断程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

 收稿日期:2005-06-06 作者简介:桑兰(1969-),女,九江职业技术学院讲师。

灵活处理32位AR M 嵌入式系统异常中断程序

桑兰 应兰英

(九江职业技术学院,江西九江 332007)

摘 要:改写中断程序需要修改C 程序的汇编启动代码,这项工作比较繁琐。本文针对这方面的技术

和方法做出总结,以方便读者简便高效地实现动态的加载和改写异常中断程序。

关键词:动态配置;嵌入式系统;ARM ;中断向量表

中图分类号:TP314 文献标识码:B 文章编号:1009-9522(2005)04-0021-03

H ow to H andle U nusu al Interrupt Program of 32-digit ARM Embedded System

SAN G Lan Y ing Lanying

(Jiujiang Vocational &Technical College ,Jiujiang City ,Jiangxi Province ,332007)

Abstract :It ’s tedious to rewrite the interru pt program by modifing the assembly program initiative code of the C program.The paper sums up the ways with regard to the program ,so as to load and rewrite the unusual interru pt program dynamically with higher efficiency and convenience.

K ey w ords :Dynamic assembly ,Embedded System ,ARM ,Vector Table

引言

一般来说32位ARM 嵌入式系统的中断向量表是程序编译前设置好的。在编写32位ARM 嵌入式系统的中断服务程序、设置和修改ARM 体系结构的中断向量表时,常常要修改汇编代码,这是相当困难的。如果需要在程序运行过程中动态修改中断向量的程序,则要增加很多分支处理指令才能实现,令人感到更为不便。为此,本文提出几种简便高效的配置方法,在系统启动以后可以实现安装中断向量表的功能。

11ARM 中断向量设置方法简述

在32位ARM 系统中,一般是在中断向量表中放置一条分支指令或PC 寄存器加载指令,实现程序跳转到中断服务例程的功能。例如:

IRQ Entry B HandleIRQ ;跳转范围较小B HandleFIQ ;或

IRQ Entry LDR PC ,=HandleIRQ ;跳转的范围是任意32位地址空间

LDR PC ,=HandleFIQ

LDR 伪指令等效生成1条存储读取指令和1条32位常

数定义指令。32位常数存储在LDR 指令附近的存储单元中,相对偏移小于4K B 。该32位数据就是要跳转到的中断服务程序入口地址。

使用LDR 伪指令,是因为ARM 的RISC 指令为单字指令,不能装载32位的立即数(常数),无法直接把一个32位常数数据或地址数据装载到寄存器中。

下面一段程序与上述伪指令功能等效,但中断向量表描述得更为清晰。其中Vector Table 为相对LDR 指令的偏移量:

IRQ Entry LDR PC ,Vector Table +0;与LDR PC ,=Han 2dleIRQ 等效

LDR PC ,Vector Table +4;与LDR PC ,=HandleFIQ 等效……

Vector Table DCD HandleIRQ DCD HandleFIQ ……

HandleIRQ ……

HandleFIQ

ARId 嵌入式系统的程序一般固化在从00000000H 开始

1

2200514

九江职业技术学院学报

(桑兰:灵活处理32位ARM 嵌入式系统异常中断程序)

的低端ROM空间中,中断向量表Vector Table也固化在ROM中。这样上述两种方法都无法在程序运行时动态随机修改中断向量表。设置中断向量必须修改ARM的C程序的启动代码,这是相当繁琐的,而且晦涩的汇编代码使用起来很不方便,比较容易出错。

表面上看,在ARM第二种中断向量设置方法的向量表Vector Table中也是纯地址数据,不含指令代码,似乎可以把Vector Table设置在RAM数据段中。但是,代码中的Vector Table是一个与当前PC间的一个偏移,LDR指令的相对地址是在编译时计算的,要求Vector Table<212,然而一般ARM体系的ROM代码段和RAM数据段间的偏移远大于212,超出了LDR使用PC为基址的相对寻址范围,因此vector处,应添上合适的跳转指令LDR pc,[pc,#offset]

21运用动态配置中断向量表法在C程序中安装中断处理程序

要在ARM结构中实现中断向量的随机存取功能,向量表的地址数据必须安排在任意32位地址的RAM空间中。为此,中断处理程序中必须增加一条指令,先跳转到向量表,然后执行向量表中动态生成的跳转指令,跳转到中断服务程序,参见下列初始化代码:

;333333向量表333333

EN TR Y;原向量偏移,中断号

B Reset Handle;Ox00,00

LDR PC,=NewVector Table+0x08;0x04,未定义,01

LDR PC,=NewVector Table+0x10;0x08,SWI,02

LDR PC,=NewVector Table+0x18;0x0c,未定义,03

LDR PC,=NewVector Table+0x20;0x10,未定义,04 LDR PC,=NewVector Table+0x28;0x14,未定义,05

LDR PC,=NewVector Table+0x30;0x18,IRQ,06

LDR PC,=NewVector Table+0x38;0x1c,FIQ,07

……

;333333代码段333333

Reset Handle

;333数据段,为NewVector Table分配数据空间333 NewVector Table#128;大小根据需要定义,每向量2个字;

程序运行时,中断服务的初始化程序必须设置好新的中断向量表,即在NewVector Table表中动态生成下列指令: NewVector Table;表安排在RAM顶端0x0c1fff00处(由硬件设定)

LDR PC,[PC,#4];指令代码为Oxe51ff004,功能为PC ;<-[PC+4]

nVt00DCD ISR-RESET-HANDL E

LDR PC,[PC,#4];与LDR PC,nVt01指令等效

nVt01DCD ISR-UNDEF-HANDL E

LDR PC,[PC,#4]

nVt02DCD ISR-SWI-HANDL E

LDR PC,[PC,#4]

nVt03DCD ISR-UNDEF-HANDL E LDR PC,[PC,#4]

nVt04DCD ISR-UNDEF-HANDL E

LDR PC,[PC,#4]

nVt05DCD ISR-UNDEF-HANDL E

LDR PC,[PC,#4]

nVt06DCD ISR-IRQ-HANDL E

LDR PC,[PC,#4]

nVt07DCD ISR-FIQ-HANDL E

……

可用C函数在NewVector Table中生成含上述指令的向量表,具体实现如下:

#define V ECTOR-TABL E0x0c1fff00

//向量表首地址,根据实际硬件来配置

#define INSTRUCTION-LDR-PC Oxe51ff004

//加载PC寄存器的指令码

//设置向量C函数,ISR-Handle中断服务程序地址

void SetVector(unsigned char no,unsigned long int ISR-Han2 dle){

unsigned long int3pVector Table;

//定义32位无符号数指针,指向向量表

pVector Table=((unsigned long int3)(V ECTOR-TABL E+ (no<<3)));

3pVector Table++=INSTRUCTION-LDR-PC;

//在向量表中放置LDR PC,[PC,#4]指令

3pVector Table=ISR-Handle;//设置中断服务例程入口地址

}

//读取向量C函数,no代表中断号

unsigned long iht G etVector(unsigned char nO){

unsigned long int3pVector Table;

pVector Table=((unsigned long int3)(V ECTOR-TABL E+ (no<<3)));

return3(++pVector Table);//返回中断处理程序入口地址

}

使用上述初始化代码和向量设置函数,除复位向量外,其它所有中断向量都可以指向在RAM数据区中的新向量表,并给定一个统一的中断编号。中断服务程序可以放在任何模块文件中编译连接,不需要修改原向量表代码,但在打开中断使用中断服务例程前必须使用C函数SetVector()设置中断向量。

31建立二级异常中断矢量表法,在C程序中安装中断处理程序

如果ARM系统程序在运行过程中出现异常中断,处理器会自动跳转到从0x0地址开始的异常中断矢量表中的某个表项(依据于中断类型)处读取指令并运行。如果在地址0x0处的一级异常中断矢量表中,实现简单地向二级异常中断矢量表的跳转;则很容易实现中断处理程序的安装和改写。(下转第18页)

相关文档
最新文档