![ARM嵌入式系统中断向量表的动态配置_第1页](http://file2.renrendoc.com/fileroot_temp3/2021-6/7/353f1fb5-f7d5-4392-84ac-76fcd49e780f/353f1fb5-f7d5-4392-84ac-76fcd49e780f1.gif)
![ARM嵌入式系统中断向量表的动态配置_第2页](http://file2.renrendoc.com/fileroot_temp3/2021-6/7/353f1fb5-f7d5-4392-84ac-76fcd49e780f/353f1fb5-f7d5-4392-84ac-76fcd49e780f2.gif)
![ARM嵌入式系统中断向量表的动态配置_第3页](http://file2.renrendoc.com/fileroot_temp3/2021-6/7/353f1fb5-f7d5-4392-84ac-76fcd49e780f/353f1fb5-f7d5-4392-84ac-76fcd49e780f3.gif)
![ARM嵌入式系统中断向量表的动态配置_第4页](http://file2.renrendoc.com/fileroot_temp3/2021-6/7/353f1fb5-f7d5-4392-84ac-76fcd49e780f/353f1fb5-f7d5-4392-84ac-76fcd49e780f4.gif)
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ARM嵌入式系统中断向量表的动态配置摘要:通常 32 位 ARM嵌入式系统的中断向量表是在程序编译前设置好的,每次 编写中断程序都要改 C 程序的汇编启动代码,相当繁琐。本文给出一种配置 ARM中断向量表新方法。该方法比通常方法仅增加一条指令执行时间,简便高 效,功能完备,向量表在运行时动态生成, C程序可以使用固定向量表的启动 代码,并可隐藏起来。关键词:动态配置嵌入式系统 ARM中断向量表一般 32 位 ARM嵌入式系统的中断向量表是程序编译前设置好的。在编写32 位 ARM嵌入式摘要:通常 32位 ARM嵌入式系统的中断向量表是在程序编译前设置好 的,每次编写中断程序都要改 C 程序的汇
2、编启动代码,相当繁琐。本文给出一 种配置 ARM中断向量表新方法。该方法比通常方法仅增加一条指令执行时间, 简便高效,功能完备,向量表在运行时动态生成, C程序可以使用固定向量表 的启动代码,并可隐藏起来。关键词:动态配置 嵌入式系统 ARM 中断向量表一般 32位 ARM嵌入式系统的中断向量表是程序编译前设置好的。在编写 32位 ARM嵌入式系统的中断服务程序、设置和修改 ARM体系结构的中断向量表时, 常感到相当麻烦,不得不修改汇编代码,对不喜欢使用汇编代码编程的程序员 尤其如此。当需要在程序运行过程中动态修改中断向量的程序时会感到更为不 便,不得不增加很多分支处理指令才能实现。为此本文提
3、出一种简便高效的配 置方法,实现了 ROM固化程序在运行时动态配置 ARM嵌入式系统中断向量表的 功能。1 ARM中断向量两种设置方法在 32 位 ARM系统中,一般都是在中断向量表中放置一条分支指令或PC 寄存器加载指令,实现程序跳转到中断服务例程的功能。例如:IRQEntry B HandleIRQ ; 跳转范围较小B HandleFIQ或 IRQEntry LDR PC,=HandleIRQ ; 跳转的范围是任意 32 位地址空间LDR PC, =HandleFIQLDR伪指令等效生成 1条存储读取指令和 1条 32位常数定义指令。 32位常数存 储在 LDR指令附近的存储单元中,相对偏
4、移小于 4KB。该 32 位数据就是要跳转 到的中断服务程序入口地址。之所以使用 LDR伪指令,是因为 ARM的 RISC指令为单字指令,不能装载 32 位 的立即数(常数),无法直接把一个 32 位常数数据或地址数据装载到寄存器中。下面一般程序与上述伪指令功能等效,但中断向量表描述得更为清晰。其 中 VectorTable 为相对 LDR指令的偏移量:IRQEntry LDR PC,VectorTable+0;与 LDR PC,=HandleIRQ等效LDR PC, VectorTable+4;与 LDR PC,=HandleFIQ等效VectorTable DCD HandleTRQDCD
5、 HandleFIQHandleIRQHandleFIQ一般 ARM嵌入式系统的程序都是固化在从 00000000H开始的低端 ROM空间中, 中断向量表 VectorTable 也是固化在 ROM中,所以上述两种方法都无法在程序 运行时动态随机修改中断向量表。不论对于初学 ARM处理器的程序员还是有经 验的程序员,设置中断向量都相当繁琐,必须修改 ARM的 C 程序的启动代码。 一段晦涩的汇编代码很不方便,比较容易出错。2 X86 与 ARM处理器中断向量表比较实模式 X86 程序员都熟悉,在 X86 体系结构的 PC系统中,不论是用汇编还是用 C语言,都可以动态随机地设置、修改中断向量表只
6、需要简单地把中断程序 例程的入口地址写入到中断向量表数据区,即可完成向量表的设置。X86向量表设置方便的原因有两个。其一是中断向量表与程序代码完全分离, 中断向量表设置在 RAM数据空间,向量表存放的数据是纯粹地址数据;而在 ARM向量表中存放的是与中断服务例程入口有关的一条分支指令。另一个原因 是,除 BIOS外,大多数 PC程序都是在运行时加载到 RAM中的,程序数据是不 加区别的,所以可以很容易在程序运行的过程中从数据生成程序,并可以很容 易把 CPU控制权转到新生成的程序中。表面上看,在 ARM第二种中断向量设置方法的向量表 VectorTable 中也是纯地 址数据,不含指令代码,似
7、乎可以把 VectorTable 设置在 RAM数据段中。然而 一般 ARM体系的 ROM代码段和 RAM数据段间的偏移远大于 2 12 ,故超出了 LDR 使用 PC为基址的相对寻址范围。代码中的 VectorTable 是一个与当前 PC间的一个偏移, LDR指令的相对地址是 在编译时计算的,要求 VectorTable& lt ;2 12, 所以 VectorTable 不能随意安排 在 RAM空间中。 VectorTable 一般只能安排在中断跳转指令附近的代码区内 中。3 ARM结构中中断向量表的动态配置方法要在 ARM结构中实现与 X86 中一样方便的在中断向量的随机存取功能,向量
8、表 的地址数据必须可以安排在任意 32 位地址的 RAM空间中。为此,中断处理必须 增加一条指令,先跳转到向量表,然后执行向量表中动态生成的跳转指令,跳 转到中断服务程序,参见下列初始化代码:向量表 *ENTRYB ResetHandle ; 原向量偏移 ,中断号B ReseHandle ;0 x00,00LDR PC,=NewVectorTable+0x08 ;0x 04, 未定义 , 01LDR PC, =NeWVector Table+0x10 ;0x08, SW,I02LDR PC,=NewVectorTable+0x18;0x0c, 未定义 ,03LDR PC, =NewVector
9、Table+0x20;0x10, 未定义 , 04LDR PC,=NewVectorTable+0x28;0 x14, 未定义 0,05LDR PC,=NewVectorTable+0x30 ;0x18,IRQ ; 06LDR PC,=NewVectorTable+0x38;0x1c,FIQ , 07代码段ResetHandle* 数据段,为 NewVectorTable 分配数据空间 *NewVectorTable # 128; 大小根据需要定义,每向量 2 个字(8 字节); 程序运行时,中断服务的初始化 程序必须设置好新的中断向量表,即在NewVectorTable 表中动态生成下列指令
10、:NewVectorTable; 表安排在 RAM顶端 0x0c1fff00 处(由硬件设定)LDR PC,PC,#4 ;指令代码为 0xe51ff004, 功能为 PC-PC+4nVt00 DCD ISR_RESET_HANDLELDR PC,PC,#4; 与 LDR PC,nVt01 指令等效nVt01 DCD ISR_UNDEF_HANDLELDR PC,PC,#4nVt02 DCD ISR_SWI_HANDLELDR pC,PC,#4nVt03 DCD ISR_UNDEF_HANDLELDR PC,PC,#4nVt04 DCD ISR_UNDEF_HANDLELDR PC,PC,#4n
11、Vt05 DCD ISR_UNDEF_HANDLELDR PC,PC,#4NVt06 DCD ISR_IRQ_HANDLELDR PC,PC,#4nVt07 DCD ISR_FIQ_HANDLE可用 C 函数在 NweVectorTable 中生成含上述指令的向量表,具体实现如下:#define VECTOR_TABLE 0x0c1fff00 / 向量表首地址,根据实际硬件来配置#define INSTRUCTION_LDR_PC 0xe51ff004/ 加载 PC寄存器的指令码/ 设置向量 C函数, ISR_Handle 中断服务程序地址void SetVector(unsigned cha
12、r no,unsigned long int ISR_Handle)unsigned long int * pVectorTable;/ 定义 32 位无符号数指令,指向向量表pVectorTable=(unsigned long int *)(VECTOR_TABLE+(no3);*pVectorTable+=INSTRUCTION_LDR_PC;/ 在向量表中放置 LDR PC,PC, #4指令*pVectorTable=ISR_Handle;/ 设置中断服务例程入口地址/ 读取向量 C函数, no 代表中断号unsigned long int GetVector(unsigned char no)unsigned long int *pVectorTable;pVectorTable=(unsigned long int *)(VECTOR_TABLE+(no3);return *(+pVectorTable);/ 返回中断处理程序入口地址使用上述初始化代码和向量设置函数,除复位向量外, 其它 所有中断向量都可 以指向了在 RAM数据区中的新向量表,并给定一个统一的中断编号。中断服务 程序可以放在任何 模块文件中编译连接,不需要修改原向量表代码,但在打开 中断使用中断服务例程前必须使用 C
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园中秋节教案模板5篇
- 《一般现在进行时》(教学设计)-2023-2024学年译林版(三起)英语六年级下册
- 2024-2025学年黑龙江省哈尔滨市名校初三下学期周末练习3英语试题含答案
- 日式茶壶市场需求与消费特点分析
- 2 走月亮 (教学设计)2024-2025学年小学语文四年级上册统编版
- 自行车减震器产品原材料供应与需求分析
- 蓄电瓶产品原材料供应与需求分析
- 防水纸产品原材料供应与需求分析
- 室内用空气芳香剂商业机会挖掘与战略布局策略研究报告
- 探索直角与其他角度的关系
- 项目管理人员岗位职责
- 从句what和how的用法与区别(共2页)
- (完整版)项目公司施工单位考察方案
- 工程索赔费用报告书
- 培训课程开发与设计课程大纲
- 螺纹基本尺寸对照表精编版
- 110kV SF6 封闭式组合电器(GIS)检修规程
- 会议议程安排表
- 瞳孔观察PPT[简版专享]
- 2022年小学三年级数学下册暑假每日一练全50套
- 中国石化法律综合管理系统_管理员及关键用户培训
评论
0/150
提交评论