打印
[ZLG-ARM]

有个关于IRQ.s的问题一直没搞明白

[复制链接]
1910|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaowenbiao|  楼主 | 2007-4-28 10:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TI, IO, DSP, ps, RS
IRQ.s程序如下:
   
 MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function

        EXPORT  $IRQ_Label                      
        IMPORT  $IRQ_Exception_Function       
$IRQ_Label
        SUB     LR, LR, #4                     
        STMFD   SP!, {R0-R3, R12, LR}         (1)
        MRS     R3, SPSR                   
       STMFD   SP, {R3,LR}^                   (2)
        NOP
        SUB     SP, SP, #4*2
        MSR     CPSR_c, #(NoInt | SYS32Mode)   
        BL      $IRQ_Exception_Function         
       MSR     CPSR_c, #(NoInt | IRQ32Mode)   
        LDMFD   SP, {R3,LR}^       
        MSR     SPSR_cxsf, R3
        ADD     SP, SP, #4*2                 

        LDMFD   SP!, {R0-R3, R12, PC}^         
    MEND

程序中,在(1)处已经将LR保存到了堆栈中,为什么在(2)处还要保存一遍??在(1)和(2)之间没有进行状态切换,也没有调用函数,那么两次保存的LR的值不是一样的么?为什么要保存两次?还有(2)处后面加上“^”不知道具体有什么意义??且此处这样写是不是更好?STMFD SP!,{R3,LR}^ 希望高手们能予以解答,谢谢!!

相关帖子

沙发
Ice_River| | 2007-4-28 11:24 | 只看该作者

我也一直存在疑惑!

这个文件和 其它ADS中文件的关系是什么?这种宏如何调用?
后来我把它去掉了

使用特权

评论回复
板凳
gaowenbiao|  楼主 | 2007-4-28 12:20 | 只看该作者

大家都进来讨论讨论啊!!

这个问题我相信很多人都碰到过,怎么就没有深入理解的高手进来说说呢!
斑竹呢??发表发表意见呀!!

使用特权

评论回复
地板
bqt| | 2007-4-28 15:31 | 只看该作者

re:

1.  加上“^”且寄存器列表不包含PC时表示保存的是用户模式的寄存器,而不是当前模式的寄存器,两次保存的LR的值是不一样的。
2.  不能回写,如果回写的话,好像回写的是用户模式的SP。

使用特权

评论回复
5
gaowenbiao|  楼主 | 2007-4-28 15:43 | 只看该作者

谢谢高手指点

谢谢高手指点,好象有点明白了,再找找资料看看书去!!

使用特权

评论回复
6
gaowenbiao|  楼主 | 2007-4-29 10:32 | 只看该作者

还有一点疑问

这个问题已经基本上搞清楚了,但是还有一点不明白,在uC/OS-II中的中断
嵌套保存拥护模式的SPSR和LR不难理解,但是为什么要保存SP的值呢,SP的值不是自动的增减的吗?到底有没有这个必要??程序如下:
        SUB     LR, LR, #4                     
        STMFD   SP!, {R0-R3, R12, LR}        
        MRS     R3, SPSR                       
       STMFD   SP, {R3, SP, LR}^     ;保存用户模式的SPSR,SP,LR   
                                                
        LDR     R2,  =OSIntNesting             
        LDRB    R1, [R2]
        ADD     R1, R1, #1
        STRB    R1, [R2]

        SUB     SP, SP, #4*3
        

        BL      OSIntExit

使用特权

评论回复
7
zlgARM| | 2007-4-29 13:44 | 只看该作者

gaowenbiao

看一下《ARM嵌入式系统基础教程》里的ARM状态下的寄存器部分。每种异常模式的堆栈指针寄存器都不一样的。

使用特权

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

本版积分规则

5

主题

16

帖子

1

粉丝