打印

ARM汇编STR lr, [pc, #SAVED_LR-.-8]

[复制链接]
4292|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rtj640|  楼主 | 2009-11-4 08:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
gooogleman| | 2009-11-4 09:19 | 只看该作者
有点奇怪。我也是第一次见到。嘿嘿。SAVED_LR应该是个整体的,.-8代表当前地址减去8
我在ARM9见过类似的东西。

以上纯属个人见解,不太确定,如果我说错了,楼主请指出。

使用特权

评论回复
板凳
yuhuihui| | 2009-11-4 09:41 | 只看该作者
:D

使用特权

评论回复
地板
暮然| | 2009-11-4 10:26 | 只看该作者
没弄过ucos,lz这几句没有上下环境,不做解释。
不过,提醒,arm7是三级流水线,恢复lr必须要pc-8。

使用特权

评论回复
5
rtj640|  楼主 | 2009-11-4 20:24 | 只看该作者
不好意思,开始贴出的没有说明白.
过程是这样的,UCOS 在执行OSIntExit()退出管理函数时 进行的中断任务切换函数OSIntCtxSw()
函数OSIntCtxSw()的具体代码如下: 前面的一部分都看不明白什么意思,为什么要这样做

OSIntCtxSw
        ;set need_to_swap_context is '0'
        MOV                r1, #0
        STR                r1, [r0]


        ;now context switching
        LDMIA    sp!,{r0-r11,lr}
        SUB                lr, lr, #4

        STR                                lr, [pc, #SAVED_LR-.-8]

        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;Change Supervisor mode
        ;!!!r12 register don't preserved. (r12 that PC of task)

    MRS             lr, SPSR
         AND                                lr, lr, #0xFFFFFFE0
         ORR                                lr, lr, #0x13
    MSR             CPSR_cxsf, lr


        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;Now  Supervisor mode
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        STR                r12, [sp, #-8]        ; saved r12
        LDR                r12, [pc, #SAVED_LR-.-8]
        STMFD        sp!, {r12}                ; r12 that PC of task
        SUB                sp, sp, #4                ; inclease stack point
        LDMIA        sp!, {r12}                ; restore r12
        STMFD        sp!, {lr}                ; save lr
        STMFD        sp!, {r0-r12}        ; save register file and ret address
        MRS                r4, CPSR
        STMFD        sp!, {r4}                ; save current PSR
        MRS                r4, SPSR                ; YYY+
        STMFD        sp!, {r4}                ; YYY+ save SPSR



        ; OSPrioCur = OSPrioHighRdy
        LDR        r4, addr_OSPrioCur
        LDR        r5, addr_OSPrioHighRdy
        LDRB        r6, [r5]
        STRB        r6, [r4]
       
        ; Get current task TCB address
        LDR        r4, addr_OSTCBCur
        LDR        r5, [r4]
        STR        sp, [r5]                ; store sp in preempted tasks's TCB

        ; Get highest priority task TCB address
        LDR        r6, addr_OSTCBHighRdy
        LDR        r6, [r6]
        LDR        sp, [r6]                ; get new task's stack pointer

        ; OSTCBCur = OSTCBHighRdy
        STR        r6, [r4]                ; set new current task TCB address

        LDMFD        sp!, {r4}                ; YYY+
;        AND                r4, r4, #0xFFFFFF20
;        ORR                r4, r4, #0x13
        MSR        SPSR_cxsf, r4                ; YYY+
        LDMFD        sp!, {r4}                ; YYY+
;        AND                r4, r4, #0xFFFFFF20
;        ORR                r4, r4, #0x13
        MSR        CPSR_cxsf, r4                ; YYY+
        LDMFD        sp!, {r0-r12, lr, pc}        ; YYY+

使用特权

评论回复
6
HeyMe| | 2009-11-9 16:47 | 只看该作者
首先应该明白ARM7是三级流水结构,比如当中断发生时,LR自动保存当前PC的值,也就是执行位置的PC+8。所以当执行完中断服务程序返回的时候,PC需指向下一条位置也就是PC-4的位置。

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝