laozi1231234 发表于 2010-9-24 17:10:38

UCOS中断级任务切换的小疑问

在 王田苗 主编的《嵌入式系统设计与实例开发》中,关于UCOS移植到44b0的OSInitCtxSw()代码

;程序里的注释是书本里的,括号里的问题是我的疑问

OSIntCtxSw
    ADD    R7, SP, #16      ;保存寄存器指针---(这时R7=SP+16不是已经指向了PC的地址吗?)
    LDR    SP, =IRQStack    ;FIQ_STACK      (sp重新回到栈底,用于下一次的中断保存入栈,
                                                到这里已经不用IRQ堆指针了,传递参数的工作交给了R7)
    MRS    R1, SPSR         ;得到暂停的SPSR
    ORR    R1, R1, #OxC0    ;关闭IRQ, FIQ
    MSR    CPSR_cxsf, R1    ;转换模式( SVC_MODE )

    LDR    R0,     ;从IRQ堆栈中得到IRQ's LR (任务 PC)---(为什么这里还要加上52?)

    SUB    R0, R0, #4       ;当前PC地址是(saved_LR-4 )
    STMFDSP!, {R0}      ;保存任务PC
    STMFDSP!, {LR}      ;保存LR
    MOV    LR, R7         ;保存FIQ堆栈ptr in LR
    LDMFDLR!, {R0-R12}    ;从FIQ堆栈中得到保存的寄存器
    STMFDSP!, {R0-R12}    ;在任务堆栈中保存寄存器
    MRS    R4, CPSR
    BIC    SP!, {R0-R12}
    ……
    ……
    接下来是执行新的任务
    ……
    ……
   ————————————————————————————————————————————————
    这里的程序,应该是把IRQ堆栈中保存的任务寄存器值取出来,再保存到任务堆栈中,然后执行新的任务。

    中断发生后,依次保存的: PC(R15)、R14_IRQ、R13_IRQ、R12、R11……R0( SPSR与CPSR不是很清楚), 这时SP->R0。当执行第一句
      ADD R7, SP, #16
后,由于44b0堆栈是从上往下长的, 所以R7应该指向了PC,但下面
      LDR    R0,     ;从IRQ堆栈中得到IRQ's LR (任务 PC)---(为什么这里还要加上52?)
为什么还要加上52???
   

   是我理解错了,还是书本问题!!!

wanmyqawdr 发表于 2010-9-24 19:09:04

52 / 4 好像是13,寄存器帧的偏移,从那里开始装入下个任务的工作寄存器,忘得差不多了

tigerchen 发表于 2010-9-24 22:27:00

mark
页: [1]
查看完整版本: UCOS中断级任务切换的小疑问