打印

中断嵌套保存的数据有哪些

[复制链接]
1636|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tang221986|  楼主 | 2013-3-22 18:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.首先请问各位,中断发生时的处理过程的步骤是怎样的,和51有什么区别如,保护现场,跳到新地址
2.中断响应时需要保存的数据有哪些,比如R0-R3, R12, LR 这些寄存器,还需要保存一些特定的数据吗
3.每次中断时像压栈保存的R0-R3, R12, LR这些数据是保存在什么地方,是保存要指定的位置吗,如果是保存到指定的位置,那么中断嵌套后会覆盖前一次中断保存的数据吗,如果保存在不同的地址中断有多次嵌套那么会不会使保存的数据溢出


谢谢大家!

相关帖子

沙发
huangxz| | 2013-3-22 23:11 | 只看该作者
3.在arm7中是要自己处理的,自己分配空间给嵌套堆栈用。

使用特权

评论回复
板凳
lr2131| | 2013-3-23 19:41 | 只看该作者
本帖最后由 lr2131 于 2013-3-24 18:33 编辑

这个,你是要问那个版本的ARM呢?

目前,ARMv4和ARMv5版本的汇编体系结构比较相似,ARMv6和ARMv7版本的汇编体系结构比较相似,但ARMv5和ARMv6差异很大。

一般来说,ARM7是v4版本的,ARM9是v5版本的,ARM11是v6版本的,Corte-M3是ARMv7版本的。

第一个问题。中断的大致流程和51是类似的,其实这个基本上所有的MCU都是类似的:
1.保存现场。2.跳转到isr中。3.处理isr。4.返回。5.恢复现场
但要具体的问和51的差异,还是有不少的。具体版本不同的arm,具体流程也有很多不同。

第二个问题。中断中保存哪些寄存器,你只要记住一个原则就好了。有些寄存器在后边会被使用到,这些寄存器就需要保存了,不然 现场就会被破坏了。一般编译器会识别哪些寄存器会被使用到,它自然就会保存这些寄存器。据说keil和ADS在中断保存现场时,也有一些差异,就是那个R4,一个要保存,一个不保存。另外如果要说得深点的话,要是支持中断嵌套,同样的道理,在开启中断总开关时,也要保存现场的。这个就比较复杂了。

第三个问题。和其他很多mcu一样,arm不使用硬件堆栈,这点和pic单片机不同。大部分的MCU都是保存在RAM中,包括ARM。arm是保存到当前sp堆栈指针指向的ram区域中。中断嵌套时,会不会覆盖,如果是arm7,默认是不开启中断嵌套的,如果需要开启中断嵌套,就看代码写的怎么样了。如果是v7版本的arm,默认是支持中断嵌套的,很多过程都是硬件自动做的,一般中断嵌套的代码好写,不容易出问题。v5和v6版本的arm没有仔细研究过,就不说了,但估计大致相同。

溢出的问题,由于是使用的是ram,就看ram的量是否够大,另外就看初始sp安排的是否合理。
注意,arm的栈默认都是满递减方式的。


使用特权

评论回复
地板
tang221986|  楼主 | 2013-3-25 09:27 | 只看该作者
lr2131 发表于 2013-3-23 19:41
这个,你是要问那个版本的ARM呢?

目前,ARMv4和ARMv5版本的汇编体系结构比较相似,ARMv6和ARMv7版本的汇 ...

很好很强大,谢谢!

使用特权

评论回复
5
jlass| | 2013-3-25 10:41 | 只看该作者
本帖最后由 jlass 于 2013-3-25 11:18 编辑

1、差不多,反正所有的中断都是这么处理的
2、跟具体的芯片相关,因为保存寄存器是需要耗费指令的,保存太多的话太费时,一般就是保存芯片认为最重要的几个,如果你刚好用了没保存的寄存器的话会出现问题的,所以在中断里最好不要做太多的处理。虽然编译器在中断内会只使用保护过的寄存器,但是会降低效率,而且数据进位寄存器也是不保护的。
3、假设堆栈深度是20,那么超过20个嵌套就溢出了。

使用特权

评论回复
6
xinzha| | 2013-3-25 11:38 | 只看该作者
arm由于精确异常的设计问题,中断嵌套的处理要软件做很多工作,尽量不要使用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

122

帖子

0

粉丝