您现在的位置:智能制造网>技术中心>ARM嵌入式系统中断向量表的动态配置

直播推荐

更多>

企业动态

更多>

推荐展会

更多>

ARM嵌入式系统中断向量表的动态配置

2010年09月19日 09:11:34人气:662来源:

前言:一般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 ;原向量偏移 ,中断号
  B ReseHandle ;0x00 ,00
  LDR PC,=NewVectorTable+0x08 ;0x04,未定义 ,01
  LDR PC,=NeWVector Table+0x10 ;0x08,SWI,02
  LDR PC,=NewVectorTable+0x18 ;0x0c,未定义 ,03
  LDR PC,=NewVectorTable+0x20 ;0x10,未定义 ,04
  LDR PC,=NewVectorTable+0x28;0x14,未定义 0,05
  LDR PC,=NewVectorTable+0x30 ;0x18,IRQ ;06
  LDR PC,=NewVectorTable+0x38 ;0x1c,FIQ ,07
  ……
  ;******代码段******
  ResetHandle
  ……
  ;***数据段,为NewVectorTable分配数据空间***
  NewVectorTable # 128;大小根据需要定义,每向量2个字(8字节);

  程序运行时,中断服务的初始化 程序必须设置好新的中断向量表,即在NewVectorTable表中动态生成下列指令:

  NewVectorTable;表安排在RAM顶端0x0c1fff00处(由硬件设定)
  LDR PC,[PC,#4];指令代码为0xe51ff004,功能为PC〈-[PC+4]
  nVt00 DCD ISR_RESET_HANDLE
  LDR PC,[PC,#4];与LDR PC,nVt01指令等效
  nVt01 DCD ISR_UNDEF_HANDLE
  LDR PC,[PC,#4]
  nVt02 DCD ISR_SWI_HANDLE
  LDR pC,[PC,#4]
  nVt03 DCD ISR_UNDEF_HANDLE
  LDR PC,[PC,#4]
  nVt04 DCD ISR_UNDEF_HANDLE
  LDR PC,[PC,#4]
  nVt05 DCD ISR_UNDEF_HANDLE
  LDR PC,[PC,#4]
  NVt06 DCD ISR_IRQ_HANDLE
  LDR PC,[PC,#4]
  nVt07 DCD ISR_FIQ_HANDLE
  ……
  可用C函数在NweVectorTable中生成含上述指令的向量表,具体实现如下:
  #define VECTOR_TABLE 0x0c1fff00
  //向量表首地址,根据实际硬件来配置
  #define INSTRUCTION_LDR_PC 0xe51ff004
  //加载PC寄存器的指令码
  //设置向量C函数,ISR_Handle中断服务程序地址
  void SetVector(unsigned char no,unsigned long int ISR_Handle){
  unsigned long int * pVectorTable;
  //定义32位无符号数指令,指向向量表
  pVectorTable=((unsigned long int *)(VECTOR_TABLE+(no<<3)));
  *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+(no<<3)));
  return *(++pVectorTable);//返回中断处理程序入口地址
  }

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

  4 结论

  本文提出的中断向量表配置策略和实现方法,简便,仅比标准处理方法增加一条指令的执行时间。当把ARM的C初始化汇编代码中所有中断源(包括扩展的内外部中断源)的向量都指向了新向量表,并统一编号,此后编写任何中断服务程序几乎不需要修改汇编代码,C初始化代码*可以对C程序员隐藏起来,并可以像在X86体系下一样动态地设置和修改中断向量。

全年征稿/资讯合作 联系邮箱:1271141964@qq.com

免责声明

  • 凡本网注明"来源:智能制造网"的所有作品,版权均属于智能制造网,转载请必须注明智能制造网,https://www.gkzhan.com。违反者本网将追究相关法律责任。
  • 企业发布的公司新闻、技术文章、资料下载等内容,如涉及侵权、违规遭投诉的,一律由发布企业自行承担责任,本网有权删除内容并追溯责任。
  • 本网转载并注明自其它来源的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品来源,并自负版权等法律责任。
  • 如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

<
更多 >

工控网机器人仪器仪表物联网3D打印工业软件金属加工机械包装机械印刷机械农业机械食品加工设备制药设备仓储物流环保设备造纸机械工程机械纺织机械化工设备电子加工设备水泥设备海洋水利装备矿冶设备新能源设备服装机械印染机械制鞋机械玻璃机械陶瓷设备橡塑设备船舶设备电子元器件电气设备


我要投稿
  • 投稿请发送邮件至:(邮件标题请备注“投稿”)1271141964.qq.com
  • 联系电话0571-89719789
工业4.0时代智能制造领域“互联网+”服务平台
智能制造网APP

功能丰富 实时交流

智能制造网小程序

订阅获取更多服务

微信公众号

关注我们

抖音

智能制造网

抖音号:gkzhan

打开抖音 搜索页扫一扫

视频号

智能制造网

公众号:智能制造网

打开微信扫码关注视频号

快手

智能制造网

快手ID:gkzhan2006

打开快手 扫一扫关注
意见反馈
关闭
企业未开通此功能
详询客服 : 0571-87858618