SHMI 发表于 2010-4-26 10:34:31

arm进入中断之前都需要保存那些寄存器

在周立功的模板里看到他保存了 R0-R3, R12, LR 这些寄存器 但是根据atpcs编码规则保存这些是不行的啊

周立功为什么这么写啊

有什么原因吗

SHMI 发表于 2010-4-26 10:58:38

网上强人真多啊
这个是周立功ucos的中断模板很详细的解释啊
点击此处下载 ourdev_549302.txt(文件大小:4K) (原文件名:IRQ.C的中文解释.txt)
在这里这里看的解释非常感谢cxyang老师
http://blog.chinaunix.net/u1/52323/showart_415698.html

jbb0523 发表于 2010-4-26 12:45:30

回复【楼主位】SHMI
-----------------------------------------------------------------------

同问,现在我也不太清楚到底要保存哪些寄存器,有时只保存一个,有时保存七八个,搞不懂,等待大牛指导啊。。。

SHMI 发表于 2010-4-26 13:56:45

周立功的中断处理程序
CODE32

    AREA    IRQ,CODE,READONLY

    MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function

      EXPORT$IRQ_Label                      ; The label for exports 输出的标号
      IMPORT$IRQ_Exception_Function          ; The imported labels 引用的外部标号

$IRQ_Label
      SUB   LR, LR, #4                      ; Calculate the returning address 计算返回地址
      STMFD   SP!, {R0-R3, R12, LR}         ; Protects the task environments保存任务环境
      MRS   R3, SPSR                        ; Protects the status variable    保存状态
      STMFD   SP, {R3,LR}^                  ; Protects SPSR and SP in user status, Notice: DO NOT write back.保存SPSR和用户状态的SP,注意不能回写
                                                ; If the SP is written back, it should be adjusted to its appropriate value later.如果回写的是用户的SP,所以后面要调整SP
      NOP
      SUB   SP, SP, #4*2

      MSR   CPSR_c, #(NoInt | SYS32Mode)    ; Switch to the System Mode 切换到系统模式
      
      BL      $IRQ_Exception_Function         ; call the C interrupt handler funtion 调用c语言的中断处理程序

      MSR   CPSR_c, #(NoInt | IRQ32Mode)    ; Switch bak to IRQ mode 切换回irq模式
      LDMFD   SP, {R3,LR}^                  ; Recover SPSR and SP in user status, Notic: DO NOT write back. 恢复SPSR和用户状态的SP,注意不能回写
                                                ; If the SP is written back, it should be adjusted to its appropriate value later.如果回写的是用户的SP,所以后面要调整SP
      MSR   SPSR_cxsf, R3
      ADD   SP, SP, #4*2                  ;

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

保存了r0-r3r12 lr但是编译器自动保存了 r4-r11 也就是说全部都保存了啊
是基于ads1.2支持atpcs编译规则

SHMI 发表于 2010-4-29 12:54:15

终于找到了 比较详细的介绍了啊
连接方式如下
http://tech.fuwuqi.com.cn/Development/embedded/2009-07-15/4762356812486.shtml

SHMI 发表于 2010-4-30 10:54:03

昨天看了一下周立功的模板和S3C44B0的模板
发现周立功的模板上进入中断子函数还要查找是发生了那个中断,应该是通过$IRQ_Label HANDLER $IRQ_Exception_Function来找的所以要用到r0-r3 继而先将这几个寄存器压栈
S3C44B0 的中断代码如下
IsrIRQ        ;using I_ISPR register.
    sub          sp,sp,#4       ;reserved for PC
    stmfd   sp!,{r8-r9}   

        ;IMPORTANT CAUTION
        ;if I_ISPC isn't' used properly, I_ISPR can be 0 in this routine.

    ldr          r9,AddrISPR;=I_ISPR
    ldr          r9,

        cmp                r9, #0x0        ;If the IDLE mode work-around is used,
                                                ;r9 may be 0 sometimes.
        beq                %F2

    mov          r8,#0x0
0
    movs    r9,r9,lsr #1
    bcs          %F1
    add          r8,r8,#4
    b          %B0

1
    ldr          r9,AddrHandleADC;=HandleADC
    add          r9,r9,r8
    ldr          r9,
    str          r9,
    ldmfd   sp!,{r8-r9,pc}

2
        ldmfd        sp!,{r8-r9}
        add                sp,sp,#4
        subs        pc,lr,#4
       
AddrISPR;There is no this phrases in original 44binit.s
    DCD   I_ISPR
AddrHandleADC   
    DCD   HandleADC
IsrIRQEnd
它是通过偏移地址直接计算出是哪一个中断,因此不需要r0-r3所以也就不需要压栈了啊


有不正确的地方还请高手指出啊 !!!!!!!!!!

anigon 发表于 2010-8-6 09:49:01

mark

ringan865 发表于 2010-8-6 10:30:19

mark
页: [1]
查看完整版本: arm进入中断之前都需要保存那些寄存器