灵活处理32位ARM嵌入式系统异常中断程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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页)