历史上的今天
今天是:2025年03月04日(星期二)
2020年03月04日 | ARM嵌入式系统的中断服务例程跳转
2020-03-04 来源:elecfans
在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程序的启动代码。一段晦涩的汇编代码很不方便,比较容易出错。
上一篇:浅析嵌入式MCU硬件设计方案
史海拾趣
|
我用的是CCS3.3,仿真器是XDS510 USB2.0,目标器件是TMS3205509A 今天把仿真器驱动,器件配置都弄好了,但是进CCS3.3,一直是目标器件没有发现。 不知道针对CCS3.3,仿真器是不是需要单独的驱动(我用的是以前CCS2.2的驱动)?或者需要注意一些特 ...… 查看全部问答> |
|
学了一年多单片机。其实对于硬件电路设计上涉及并不多,烦恼!!现在刚学完模电,想好好学习模拟电子在单片机外围电路中的应用。想让由经验的大侠推荐一本比较好的书,《电子制作》还是看的,但是主要还是讲模拟电机的一些技术把,滤波,整流,运放 ...… 查看全部问答> |
|
环境:WINCE6.0+VS2005+PXA310 问题描述:GPS模块待机唤醒后设备电源状态为D2,AP调用GetDevicePower(L\"GPS1:\", POWER_NAME, &pDeviceState)获取的结果。 而GPS模块实际支持的电源状态只有D0、D3、D4代码: case ...… 查看全部问答> |
|
这是我在网上查到的一种方法: CppSQLite3DB db; db.open(L\"\\\\storge\\\\mySqlite.db\"); CppSQLite3Query q = db.execQuery(L\"select * from Address_List where NUMBER =\'\"+m_ ...… 查看全部问答> |
|
我用vs的c#在windows mobile写应用程序,有菜单的时候 系统默认总是回出来输入法面板,请问有什么方法,我可以控制他么,就是不要他出现,或者当他出现的时候,我能知道,要我的窗体大小改变,以适应他不影响我的窗体显示.… 查看全部问答> |
|
请教一下IO口不够用,大家一般都用什么方法来扩展IO口? [ 本帖最后由 MD2010 于 2010-11-23 11:44 编辑 ]… 查看全部问答> |




