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

上传人:dja****22 文档编号:243019402 上传时间:2024-09-13 格式:PPTX 页数:15 大小:160.99KB
返回 下载 相关 举报
ARM嵌入式系统中断向量表的动态配置_第1页
第1页 / 共15页
ARM嵌入式系统中断向量表的动态配置_第2页
第2页 / 共15页
ARM嵌入式系统中断向量表的动态配置_第3页
第3页 / 共15页
点击查看更多>>
资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2011-2-17,#,单击此处编辑母版标题样式,ARM,嵌入式系统中断向量表的动态配置,摘 要,1 arm,中断向量两种设置方法,2 X86,与,arm,处理器中断向量表比较,3 arm,结构中中断向量表的动态配置方法,4,结论,1,摘 要,通常,32,位,arm,嵌入式系统的中断向量表是在程序编译前设置好的,每次编写中断程序都要改,C,程序的汇编启动代码,相当繁琐。本文给出一种配置,arm,中断向量表新方法。该方法比通常方法仅增加一条指令执行时间,简便高效,功能完备,向量表在运行时动态生成,,C,程序可以使用固定向量表的启动代码,并可隐藏起来。,关键词:,动态配置 嵌入式系统,arm,中断向量表,一般,32,位,ARM,嵌入式系统的中断向量表是程序编译前设置好的。在编写,32,位,ARM,嵌入式系统的中断服务程序、设置和修改,ARM,体系结构的中断向量表时,常感到相当麻烦,不得不修改汇编代码,对不喜欢使用汇编代码编程的程序员尤其如此。当需要在程序运行过程中动态修改中断向量的程序时会感到更为不便,不得不增加很多分支处理指令才能实现。为此本文提出一种简便高效的配置方法,实现了,ROM,固化程序在运行时动态配置,arm,嵌入式系统中断向量表的功能。,2,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,位数据就是要跳转到的中断服务程序入口地址。,3,之所以使用,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,4,一般,ARM,嵌入式系统的程序都是固化在从,00000000H,开始的低端,ROM,空间中,中断向量表,VectorTable,也是固化在,ROM,中,所以上述两种方法都无法在程序运行时动态随机修改中断向量表。不论对于初学,ARM,处理器的程序员还是有经验的程序员,设置中断向量都相当繁琐,必须修改,arm,的,C,程序的启动代码。一段晦涩的汇编代码很不方便,比较容易出错。,5,2 X86,与,arm,处理器中断向量表比较,实模式,X86,程序员都熟悉,在,X86,体系结构的,PC,系统中,不论是用汇编还是用,C,语言,都可以动态随机地设置、修改中断向量表,只需要简单地把中断程序例程的入口地址写入到中断向量表数据区,即可完成向量表的设置。,X86,向量表设置方便的原因有两个。其一是中断向量表与程序代码完全分离,中断向量表设置在,RAM,数据空间,向量表存放的数据是纯粹地址数据;而在,arm,向量表中存放的是与中断服务例程入口有关的一条分支指令。另一个原因是,除,BIOS,外,大多数,PC,程序都是在运行时加载到,RAM,中的,程序数据是不加区别的,所以可以很容易在程序运行的过程中从数据生成程序,并可以很容易把,CPU,控制权转到新生成的程序中。,6,表面上看,在,ARM,第二种中断向量设置方法的向量表,VectorTable,中也是纯地址数据,不含指令代码,似乎可以把,VectorTable,设置在,RAM,数据段中。然而一般,arm,体系的,ROM,代码段和,RAM,数据段间的偏移远大于,2 12,,故超出了,LDR,使用,PC,为基址的相对寻址范围。,代码中的,VectorTable,是一个与当前,PC,间的一个偏移,,LDR,指令的相对地址是在编译时计算的,要求,VectorTable2 12,所以,VectorTable,不能随意安排在,RAM,空间中。,VectorTable,一般只能安排在中断跳转指令附近的代码区内。,7,3 arm,结构中中断向量表的动态配置方法,要在,arm,结构中实现与,X86,中一样方便的在中断向量的随机存取功能,,向量表的地址数据必须可以安排在任意,32,位地址的,RAM,空间中。为此,中断处理必须增加一条指令,先跳转到向量表,然后执行向量表中动态生成的跳转指令,跳转到中断服务程序,参见下列初始化代码:,8,;,*,向量表,*,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,9,;,*,代码段,*,ResetHandle,;,*,数据段,为,NewVectorTable,分配数据空间,*,NewVectorTable # 128;,大小根据需要定义,每向量,2,个字(,8,字节);,程序运行时,中断服务的初始化 程序必须设置好新的中断向量表,即在,NewVectorTable,表中动态生成下列指令:,10,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,11,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,寄存器的指令码,12,/,设置向量,C,函数,,ISR_Handle,中断服务程序地址,void SetVector(unsigned char 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);/,返回中断处理程序入口地址,13,使用上述初始化代码和向量设置函数,除复位向量外,,其它所有中断向量都可以指向了在,RAM,数据区中的新向量表,并给定一个统一的中断编号。中断服务程序可以放在任何模块文件中编译连接,不需要修改原向量表代码,但在打开中断使用中断服务例程前必须使用,C,函数,SetVector(),设置中断向量,14,本文提出的中断向量表配置策略和实现方法,简便高效,仅比标准处理方法增加一条指令的执行时间。当把,arm,的,C,初始化汇编代码中所有中断源(包括扩展的内外部中断源)的向量都指向了新向量表,并统一编号,此后编写任何中断服务程序几乎不需要修改汇编代码,,C,初始化代码完全可以对,C,程序员隐藏起来,并可以像在,X86,体系下一样动态地设置和修改中断向量。,来源:中国,IT,实验室 责编:,coco,15,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!