打印
[ZLG-ARM]

陈明计工程事,这个IRQ.S ...

[复制链接]
2441|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
火光|  楼主 | 2007-7-13 16:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DSP, DM, STM, IO, TI
这是IRQ.S中的一段程序:

    CODE32

    AREA    IRQ,CODE,READONLY

    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}           ; 保存任务环境
        MRS     R3, SPSR                        ; 保存状态
        STMFD   SP!, {R3}
        STMFD   SP, {LR}^                       ; 保存用户状态的SP,注意不能回写
                                                ; 如果回写的是用户的SP,所以后面要调整SP
        SUB     SP, SP, #4

        MSR     CPSR_c, #(NoInt | SYS32Mode)    ; 切换到系统模式
       
        BL      $IRQ_Exception_Function         ; 调用c语言的中断处理程序

        MSR     CPSR_c, #(NoInt | IRQ32Mode)    ; 切换回irq模式
        LDMFD   SP, {LR}^                       ; 恢复用户状态的SP,注意不能回写
                                                ; 如果回写的是用户的SP,所以后面要调整SP
        ADD     SP, SP, #4                      ; 
        LDMFD   SP!, {R3}
        MSR     SPSR_cxsf, R3

        LDMFD   SP!, {R0-R3, R12, PC}^          ;
    MEND
---------------------------------------------------------------------
本人感觉
        STMFD   SP, {LR}^  ; 保存用户状态的SP,注意不能回写
                           ; 如果回写的是用户的SP,所以后面要调整SP
        LDMFD   SP, {LR}^  ; 恢复用户状态的SP,注意不能回写
                           ; 如果回写的是用户的SP,所以后面要调整SP

        这两句话有些矛盾啊,程序和注释之间!
        是否该改成:
        (1)
        STMFD   SP, {SP}^
        LDMFD   SP, {SP}^
        考虑到 前后两个SP分别出于系统模式和用户模式,相互之间独立,
        是否可以进一步变成下面的形状:
        (2)
        STMFD   SP!, {SP}^
        LDMFD   SP!, {SP}^
        
        当然(1)的做法看起来比较稳妥些!
      


相关帖子

沙发
kl818bc| | 2007-7-13 16:46 | 只看该作者

不要把X86的观念带过来

原文没有错

注意一下 ARM 汇编的后缀

使用特权

评论回复
板凳
bqt| | 2007-7-13 17:16 | 只看该作者

re:

完整的基于UCOSII的程序应该是这样的:
MACRO
$IRQ_Label OS_HANDLER $IRQ_Exception_Function

        EXPORT  $IRQ_Label                      ; 输出的标号
        IMPORT  $IRQ_Exception_Function         ; 引用的外部标号

$IRQ_Label
        SUB     LR, LR, #4                      ; 计算返回地址
        STMFD   SP!, {R0-R3, R12, LR}           ; 保存任务环境
        MRS     R3, SPSR                        ; 保存状态
        STMFD   SP, {R3, SP, LR}^               ; 保存用户状态的R3,SP,LR,注意不能回写
                                                ; 如果回写的是用户的SP,所以后面要调整SP
        LDR     R2,  =OSIntNesting              ; OSIntNesting++
        LDRB    R1, [R2]
        ADD     R1, R1, #1
        STRB    R1, [R2]

        SUB     SP, SP, #4*3
        
        MSR     CPSR_c, #(NoInt | SYS32Mode)    ; 切换到系统模式
        CMP     R1, #1
        LDREQ    R0, =StackUsr
        LDREQ    SP, [R0]
        
        BL      $IRQ_Exception_Function         ; 调用c语言的中断处理程序

        MSR     CPSR_c, #(NoInt | SYS32Mode)    ; 切换到系统模式
        LDR     R2, =OsEnterSum                 ; OsEnterSum,使OSIntExit退出时中断关闭
        MOV     R1, #1
        STR     R1, [R2]

        BL      OSIntExit

        LDR     R2, =OsEnterSum                 ; 因为中断服务程序要退出,所以OsEnterSum=0
        MOV     R1, #0
        STR     R1, [R2]

        MSR     CPSR_c, #(NoInt | IRQ32Mode)    ; 切换回irq模式
        LDMFD   SP, {R3, SP, LR}^               ; 恢复用户状态的R3,SP,LR,注意不能回写
                                                ; 如果回写的是用户的SP,所以后面要调整SP
        LDR     R0, =OSTCBHighRdy
        LDR     R0, [R0]
        LDR     R1, =OSTCBCur
        LDR     R1, [R1]
        CMP     R0, R1

        ADD     SP, SP, #4*3                    ; 
        MSR     SPSR_cxsf, R3
        LDMEQFD SP!, {R0-R3, R12, PC}^          ; 不进行任务切换
        LDR     PC, =OSIntCtxSw                 ; 进行任务切换
    MEND

对于这句:STMFD   SP, {R3, SP, LR}^
因为寄存器列表中包涵有SP,且第一个操作数寄存器也是SP,虽然意义上不是同一个SP,但是此时如果使用:STMFD   SP!, {R3, SP, LR}^ 回写SP是不行的,编译就不会通过,违反了ARM汇编的规则设置。所以要写成:STMFD   SP, {R3, SP, LR}^   然后后面(注意:好像还不能立刻减回来,要隔个一两句再减,不然可能有警告!)再把SP减回来:SUB     SP, SP, #4*3

而 STMFD   SP!, {R3,LR}^ 用ADS编译可能会有一个警告,但是功能是对的。我用H-JTAG + S3C2410 仿真看过

对于出栈的情况也是一样。

保存用户模式下的一些寄存器到IRQ堆栈中去,是为了后面在系统模式下运行中断处理程序,总的来说也就是为了实现IRQ中断嵌套!

以上是本人的理解仅供参考,如有不对,还请指出,共同学习啊!

使用特权

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

哈哈,,,

   bqt朋友的说法很有道理,也很有耐心,,,
   谢谢你!

使用特权

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

本版积分规则

19

主题

75

帖子

0

粉丝