打印
[ZLG-ARM]

关于UCOS的OSINTCTXSW的问题!

[复制链接]
1444|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
areshan|  楼主 | 2010-12-6 10:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
NTC, ucos, ST, pc, RS
你好,刚看周立功的移植文档,下面一段有些看不懂,还请指教!!!
OSIntCtxSw
                                                    ;下面为保存任务环境
        LDR     R2, [SP, #20]                       ;获取PC,为什么堆栈加20就是PC,
                                                               ;sp是栈顶,离PC是17,把PC保存
                                                               ;到R2中,那R2是不是被破坏了
        LDR     R12, [SP, #16]                      ;获取R12,R12有什么特殊性吗?
        MRS     R0, CPSR                    ;R0没有被破坏
        MSR     CPSR_c, #(NoInt | SYS32Mode);切换到系统模式,关中断???
        MOV     R1, LR
        STMFD   SP!, {R1-R2}                        ;保存LR,PC
        STMFD   SP!, {R4-R12}                       ;保存R4-R12
        MSR     CPSR_c, R0
        LDMFD   SP!, {R4-R7}                        ;获取R0-R3
        ADD     SP, SP, #8                          ;出栈R12,PC
        
        MSR     CPSR_c, #(NoInt | SYS32Mode)
        STMFD   SP!, {R4-R7}                        ;保存R0-R3
        
        LDR     R1, =OsEnterSum                     ;获取OsEnterSum
        LDR     R2, [R1]
        STMFD   SP!, {R2, R3}                       ;保存CPSR,OsEnterSum
                                                             ;没有看到前面有对R3给值
                                                    ;保存当前任务堆栈指针到当前任务的TCB
        LDR     R1, =OSTCBCur
        LDR     R1, [R1]
        STR     SP, [R1]
        BL      OSTaskSwHook                        ;调用钩子函数
                                                    ;OSPrioCur <= OSPrioHighRdy
        LDR     R4, =OSPrioCur
        LDR     R5, =OSPrioHighRdy
        LDRB    R6, [R5]
        STRB    R6, [R4]
                                                    ;OSTCBCur <= OSTCBHighRdy
        LDR     R6, =OSTCBHighRdy
        LDR     R6, [R6]
        LDR     R4, =OSTCBCur
        STR     R6, [R4]
OSIntCtxSw_1
                                                    ;获取新任务堆栈指针
        LDR     R4, [R6]
        ADD     SP, R4, #68                         ;17寄存器CPSR,OsEnterSum,R0-R12,LR,SP
        LDR     LR, [SP, #-8]
        MSR     CPSR_c, #(NoInt | SVC32Mode)        ;进入管理模式
        MOV     SP, R4                              ;设置堆栈指针
        LDMFD   SP!, {R4, R5}                       ;CPSR,OsEnterSum
                                                    ;恢复新任务的OsEnterSum
        LDR     R3, =OsEnterSum
        STR     R4, [R3]
   
        MSR     SPSR_cxsf, R5                       ;恢复CPSR
        LDMFD   SP!, {R0-R12, LR, PC }^             ;运行新任务
前面那段保存工作寄存器的代码,为什么把R12,R0-R3,R4-11,分开,什么规则????十分的困惑????

相关帖子

沙发
linas| | 2010-12-7 13:48 | 只看该作者
帮你把问题顶上去。

使用特权

评论回复
板凳
msp430ing| | 2010-12-12 17:39 | 只看该作者
可以给个文档不?

使用特权

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

本版积分规则

127

主题

728

帖子

0

粉丝