IMcome_in 发表于 2013-5-10 21:13:32

移植ucosii碰到的疑惑,望大神解惑!

任务切换函数如下,不明白的是为什么没有把PC指针压入堆栈呢,我看了直接调用和间接调用OSCtxSw的函数也没有做这样的一个事情。望大神解答:
OSCtxSw
            push      sr                  ; emulate interrupt by also saving the SR
            PUSHALL                         ; push all registers            
            
            mov.w   &OSTCBCur, R13      ; OSTCBCur->OSTCBStkPtr = SP
            mov.w   SP, 0(R13)

            call      #OSTaskSwHook

            mov.b   &OSPrioHighRdy, R13   ; OSPrioCur = OSPrioHighRdy
            mov.b   R13, &OSPrioCur       ;
                        
            mov.w   &OSTCBHighRdy, R13    ; OSTCBCur= OSTCBHighRdy
            mov.w   R13, &OSTCBCur      ;
                        
            mov.w   @R13, SP            ; SP      = OSTCBHighRdy->OSTCBStkPtr
            
            POPALL                        ; pop all registers
            
            reti                            ; return from interrup

evanzn 发表于 2013-5-10 22:54:53

软中断指令会强制返回地址和处理器状态压入当前任务的堆栈。

IMcome_in 发表于 2013-5-10 23:58:32

evanzn 发表于 2013-5-10 22:54 static/image/common/back.gif
软中断指令会强制返回地址和处理器状态压入当前任务的堆栈。

好像没有用到软中断指令?

evanzn 发表于 2013-5-11 01:01:48

1.在x86的移植版本中,OS_TASK_SW()函数模拟一次中断过程,ISR入口地址指向OSCtxSw,声明为:#define OS_TASK_SW() asm INT uCOS。
2。在atmega128等其他移植版本,若处理器不提供软终端机制,则#defineOS_TASK_SW()       OSCtxSw();函数调用的话也会自动将返回地址入栈,
总之,返回地址总是自动入栈的。

IMcome_in 发表于 2013-5-11 11:16:40

evanzn 发表于 2013-5-11 01:01 static/image/common/back.gif
1.在x86的移植版本中,OS_TASK_SW()函数模拟一次中断过程,ISR入口地址指向OSCtxSw,声明为:#define OS_TA ...

谢谢!我明白了,你说的是!
页: [1]
查看完整版本: 移植ucosii碰到的疑惑,望大神解惑!