打印
[ZLG-ARM]

周工,一个ARM指令的疑问

[复制链接]
2010|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
火光|  楼主 | 2007-8-7 22:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
周工:
    如果当前已在中断模式中!
    有这么一段程序:

    BL  THE_TRY
    ...

THE_TRY  STMFD SP!,{R0-R12,LR}
         ...
         LDMFD SP!,{R0-R12,PC}
--------------------------------------------
   已经执行了 BL  THE_TRY 这一句

   正要执行 THE_TRY  STMFD SP!,{R0-R12,LR}
   但还没有执行,这个时候发生了中断

   那怎么办办???
   会不会发生LR莫名其妙丢失的可能?

   因为BL THE_TRY 会把当前的 PC--->LR
   这个时候发生了中断,又发生了PC-->LR, CPSR-->SPSR

   不知道ARM是如何处理的???




  




     

相关帖子

沙发
zlg315| | 2007-8-7 23:12 | 只看该作者

我的大致看法如下

      比方说,使用一个SWI指令调用,SWI指令强迫处理器从用户模式切换到SVC管理模式,并且IRQ自动关闭,所以软件中断方式常被用于系统调用。只有处理器切换到系统模式时,中断才能继续调用。
     可以将上述指令设为临界区,使用关中断与开中断方式管理,也可以设一个中断计数器,象uC/OS-II底层中断就是这样做的。
      今天电脑中毒,写不下去了,

使用特权

评论回复
板凳
chunk| | 2007-8-8 11:25 | 只看该作者

你确定ARM只有一个LR寄存器?

我是说物理上只有一个LR寄存器?

使用特权

评论回复
地板
火光|  楼主 | 2007-8-8 13:02 | 只看该作者

是不是有这样的可能?


  有没有这样的可能?

  当在中断模式下运行的时候,执行 BL THE_TRY这条指令的时候是暂时不采样外部中断的,,,这样就可以有时间执行 THE_TRY  STMFD SP!,{R0-R12,LR}了
下面正常采样外部中断.

  就是说在某种特殊情况下,不理会外部中断!

  如果必须要把中断模式先切换到系统模式的话,感觉太浪费了

使用特权

评论回复
5
火光|  楼主 | 2007-8-8 13:20 | 只看该作者

涉及中断的问题.一定要原子操作.


  其实这个问题到8086上去就不成会问题了,,,因为在8086上 call指令是
  能够一次性的把 CSIP压到堆栈里去的,,,

  而ARM上,因为一般的指令只能在寄存器里面工作,不能直接操作内存,所以弄了一个LR,还有个SPSR,,,,但这样一来,本来一个原子操作断成了二半了.

  对BL 就成为: PC-->LR, STMFD SP!,{LR}

  如果中间来个中断,那就好笑了

  其实还是让BL临时不响应中断,问题解决起来简单...
  只是不知道PHILIPS是如何解决这个疑问的,他们总有个对策吧?

使用特权

评论回复
6
bqt| | 2007-8-8 15:37 | 只看该作者

re

ARM硬件进入中断后默认是关中断的。
要中断嵌套,必须保存部分寄存器(特别是LR和SPSR)。
陷阱指令SWI也有类似的作用。

使用特权

评论回复
7
火光|  楼主 | 2007-8-8 16:35 | 只看该作者

哈哈,我决定采用保守的方法!


还是先切换到系统模式!!!
   
    SUB   LR,LR,#4        ;把LRSPSR保存在中断栈
    STMFD SP!,{LR}
    MRS   LR,SPSR
    STMFD SP!,{LR}

    MRS   LR,CPSR         ;切换进入系统模式
    BIC   LR,LR,#0X1F
    ORR   LR,LR,#0X1F
    MSR   CPSR_cxsf,LR

    STMFD SP!,{R0-R12,LR} ;保护系统模式(用户模式)的寄存器

    MRS   LR,CPSR    ;打开中断
    BIC   LR,LR,#0X80
    MSR   CPSR_c,LR
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ......

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    MRS   LR,CPSR    ;关闭中断
    ORR   LR,LR,#0X80
    MSR   CPSR_c,LR


    LDMFD SP!,{R0-R12,LR} ;恢复系统模式(用户模式)的寄存器

    MRS   LR,CPSR         ;切换回中断模式
    BIC   LR,LR,#0X1F
    ORR   LR,LR,#0X12
    MSR   CPSR_cxsf,LR

    LDMFD SP!,{LR}        ;恢复LRSPSR,实际上是返回中断前模式
    MSR   SPSR_cxsf,LR
    LDMFD SP!,{PC}^

    我想想估计这样比较好,这样可以充分利用用户模式的堆栈空间!
    让系统绝大部分时间都跑在系统模式!这样就可以把用户模式的LR用起来了,估计大大的有好处!

    哈哈,探讨探讨技术很有乐趣啊.

使用特权

评论回复
8
arm爱好者| | 2007-8-8 19:02 | 只看该作者

我觉得

ARM指令,一旦执行需要多个时钟周期,在执行的时候ARM内核会保证该指令执行的原子性,正在执行过程中发生了中断,中断的响应也应该在该指令执行完毕之后。

使用特权

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

本版积分规则

19

主题

75

帖子

0

粉丝