导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[flycat2008]ARM嵌入式系统中断向量表的动态配置



No.48576
作者:flycat2008
邮件:yuanxuan2006@126.com
ID:114221
登陆:1次
文章数:40篇
最后登陆IP:
最后登陆:2008/7/14 12:15:37
注册:2008/7/14 12:15:37
财富:100
发帖时间:2008/7/18 11:25:33
发贴者IP:222.131.59.250
标题:flycat2008:ARM嵌入式系统中断向量表的动态配置
摘要:No.48576ARM嵌入式系统中断向量表的动态配置 
摘要:通常32位ARM嵌入式系统的中断向量表是在程序编译前设置好的,每次编写中断程序都要改C程序 
的汇编启动代码,相当繁琐。本文给出一种配置 ARM中断向量表新方法。该方法比通常方法仅增加一条 
指令执行时间,简便高效,功能完备,向量表在运行时动态生成,C程序可以使用固定向量表的启动代码 
,并可隐藏起来。
    关键词:动态配置 嵌入式系统 ARM 中断向量表

一般32位ARM嵌入式系统的中断向量表是程序编译前设置好的。在编写32位ARM嵌入式系统的中断服务程
序、设置和修改ARM体系结构的中断向量表时,常感到相当麻烦,不得不修改汇编代码,对不喜欢使用汇 
编代码编程的程序员尤其如此。当需要在程序运行过程中动态修改中断向量的程序时会感到更为不便, 
不得不增加很多分支处理指令才能实现。为此本文提出一种简便高效的配置方法,实现了ROM固化程序在 
运行时动态配置ARM嵌入式系统中断向量表的功能。

1 ARM中断向量两种设置方法

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

IRQEntry B HandleIRQ ;跳转范围较小

B HandleFIQ

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

LDR PC,=HandleFIQ

LDR伪指令等效生成1条存储读取指令和1条32位常数定义指令。32位常数存储在LDR指令附近的存储单元 
中,相对偏移小于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 HandleTRQ

DCD HandleFIQ

……

HandleIRQ

……

HandleFIQ

一般ARM嵌入式系统的程序都是固化在从00000000H开始的低端ROM空间中,中断向量表VectorTable也是 
固化在ROM中,所以上述两种方法都无法在程序运行时动态随机修改中断向量表。不论对于初学ARM处理 
器的程序员还是有经验的程序员,设置中断向量都相当繁琐,必须修改ARM的 C程序的启动代码。一段晦 
涩的汇编代码很不方便,比较容易出错。

2 X86与ARM处理器中断向量表比较

实模式X86程序员都熟悉,在X86体系结构的PC系统中,不论是用汇编还是用C语言,都可以动态随机地设 
置、修改中断向量表—只需要简单地把中断程序例程的入口地址写入到中断向量表数据区,即可完成向 
量表的设置。

X86向量表设置方便的原因有两个。其一是中断向量表与程序代码完全分离,中断向量表设置在RAM数据 
空间,向量表存放的数据是纯粹地址数据;而在 ARM向量表中存放的是与中断服务例程入口有关的一条 
分支指令。另一个原因是,除BIOS外,大多数PC程序都是在运行时加载到RAM中的,程序数据是不加区别 
的,所以可以很容易在程序运行的过程中从数据生成程序,并可以很容易把CPU控制权转到新生成的程序 
中。表面上看,在ARM第二种中断向量设置方法的向量表VectorTable中也是纯地址数据,不含指令代码,似 
乎可以把VectorTable设置在RAM数据段中。然而一般ARM体系的ROM代码段和RAM数据段间的偏移远大于2  
12,故超出了LDR使用PC为基址的相对寻址范围。

代码中的VectorTable是一个与当前PC间的一个偏移,LDR指令的相对地址是在编译时计算的,要求 
VectorTable  <2 12,所以VectorTable不能随意安排在RAM空间中。VectorTable一般只能安排在中断跳转 
指令附近的代码区内中。

3 ARM结构中中断向量表的动态配置方法

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

;******向量表******

ENTRY

B ResetHandle ;原向量偏移 ,中断号 ......

>>返回讨论的主题



  发表回复
用户名   *您没有注册?
密码   *
验证码   * .
标题   *
心情
随便说说    我回答你    最新发现    得意的笑   
气死我了    真是没劲    坚决同意    表示反对   
大家过来    好奇怪哟    懒得理它    大家小心   
文件上传
内容


字体:      字体大小:    颜色:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字 查看更多的心情图标 背景音乐
点击加入表情
                         
选项
有回复时用短消息通知您?

   




老古网执行:16毫秒 最大:54049毫秒 查询6次