dsb123 发表于 2009-7-2 10:37:35

为什么移植ucos时局部变量不能保存?

小弟想在c8051下移植ucos,参照大量资料之后,现在基本完成,任务能够正常切换,时间节拍也生效了。
但是在测试的时候发现一个问题: 任务中的局部变量在任务切换后发生改变了!
下面是任务切换部分的代码,请大家随便发表意见。

;********************************************************************************************************

$NOMOD51
EA        BIT          0A8H.7
SP        DATA        081H
B        DATA        0F0H
ACC        DATA        0E0H
DPH        DATA        083H
DPL        DATA        082H
PSW        DATA        0D0H
TR0        BIT          088H.4
TH0        DATA        08CH
TL0        DATA        08AH

      NAME OS_CPU_A         

?PR?OSStartHighRdy?OS_CPU_A    SEGMENT CODE
?PR?OSCtxSw?OS_CPU_A         SEGMENT CODE
?PR?OSIntCtxSw?OS_CPU_A      SEGMENT CODE
?PR?OSTickISR?OS_CPU_A         SEGMENT CODE

      EXTRN DATA(?C_XBP)

      EXTRN IDATA (OSTCBCur)
      EXTRN IDATA (OSTCBHighRdy)
      EXTRN IDATA (OSRunning)
      EXTRN IDATA (OSPrioCur)
      EXTRN IDATA (OSPrioHighRdy)
   
          EXTRN CODE(_?OSTaskSwHook)
      EXTRN CODE(_?OSIntEnter)
      EXTRN CODE(_?OSIntExit)
      EXTRN CODE(_?OSTimeTick)

      PUBLIC OSStartHighRdy
      PUBLIC OSCtxSw
      PUBLIC OSIntCtxSw
      PUBLIC OSTickISR
      
?STACK SEGMENT IDATA
      RSEG ?STACK
OSStack:
      DS 40H
OSStkStart IDATA OSStack-1

;*********************************************************************************************************
;                                       PUSHALL AND POPALL
;*********************************************************************************************************

PUSHALL MACRO
            
               PUSH PSW
      PUSH ACC
      PUSH B
      PUSH DPL
      PUSH DPH
      MOVA,R0
      PUSH ACC
      MOVA,R1
      PUSH ACC
      MOVA,R2
      PUSH ACC
      MOVA,R3
      PUSH ACC
      MOVA,R4
      PUSH ACC
      MOVA,R5
      PUSH ACC
      MOVA,R6
      PUSH ACC
      MOVA,R7
      PUSH ACC
      ENDM

POPALLMACRO

      POPACC
      MOVR7,A
      POPACC
      MOVR6,A
      POPACC
      MOVR5,A
      POPACC
      MOVR4,A
      POPACC
      MOVR3,A
      POPACC
      MOVR2,A
      POPACC
      MOVR1,A
      POPACC
      MOVR0,A
      POPDPH
      POPDPL
      POPB
      POPACC
      POPPSW
      ENDM   


;*********************************************************************************************************
;                                          START MULTITASKING
;                                       void OSStartHighRdy(void)
;
; Note(s) : 1) OSStartHighRdy() MUST:
;            a) Call OSTaskSwHook() then,
;            b) Set OSRunning to TRUE,
;            c) Switch to the highest priority task.
;*********************************************************************************************************

      RSEG ?PR?OSStartHighRdy?OS_CPU_A

OSStartHighRdy:
      USING 0
      LCALL _?OSTaskSwHook

OSCtxSw_in:   
      MOVR0,#LOW (OSTCBCur)
      INCR0
      MOVDPH,@R0
      INCR0
      MOVDPL,@R0
      INCDPTR      
      MOVX A,@DPTR   
      MOVR0,A
      INCDPTR
      MOVX A,@DPTR
      MOVR1,A
      MOVDPH,R0
      MOVDPL,R1
      MOVX A,@DPTR
      MOVR5,A
      MOVR0,#OSStkStart
      
restore_stack:   
      INCDPTR
      INCR0
      MOVX A,@DPTR
      MOV@R0,A
      DJNZ R5,restore_stack
      MOVSP,R0
      INCDPTR
      MOVX A,@DPTR
      MOV?C_XBP,A
      INCDPTR
      MOVX A,@DPTR
      MOV?C_XBP+1,A
      MOVR0,#LOW (OSRunning)
      MOV@R0,#01   
      POPALL
      SETB EA
      RETI

;*********************************************************************************************************
;                         PERFORM A CONTEXT SWITCH (From task level) - OSCtxSw()
;*********************************************************************************************************

      RSEG ?PR?OSCtxSw?OS_CPU_A

OSCtxSw:   
      PUSHALL
   
OSIntCtxSw_in:
      MOVA,SP
      CLRC
      SUBB A,#OSStkStart
      MOVR5,A
      MOVR0,#LOW (OSTCBCur)
      INCR0
      MOVDPH,@R0
      INCR0
      MOVDPL,@R0
      INCDPTR   
      MOVX A,@DPTR
      MOVR0,A
      INCDPTR
      MOVX A,@DPTR
      MOVR1,A
      MOVDPH,R0
      MOVDPL,R1
      MOVA,R5
      MOVX @DPTR,A   
      MOVR0,#OSStkStart

save_stack:   
      INCDPTR
      INCR0
      MOVA,@R0
      MOVX @DPTR,A
      DJNZ R5,save_stack
      INCDPTR
      MOVA,?C_XBP
      MOVX @DPTR,A
      INCDPTR
      MOVA,?C_XBP+1
      MOVX @DPTR,A
      LCALL         _?OSTaskSwHook
      MOVR0,#OSTCBCur
          MOVR1,#OSTCBHighRdy
          MOVA,@R1
      MOV@R0,A
      INCR0
          INCR1
          MOVA,@R1
      MOV@R0,A
      INCR0
          INCR1
          MOVA,@R1
      MOV@R0,A
      MOVR0,#OSPrioCur
          MOVR1,#OSPrioHighRdy
          MOVA,@R1
      MOV@R0,A      
      LJMP OSCtxSw_in

;*********************************************************************************************************
;                   PERFORM A CONTEXT SWITCH (From interrupt level) - OSIntCtxSw()
;*********************************************************************************************************

      RSEG ?PR?OSIntCtxSw?OS_CPU_A
      
OSIntCtxSw:
      MOVA,SP
      CLRC
      SUBB A,#4
      MOVSP,A
      
      LJMP OSIntCtxSw_in

;*********************************************************************************************************
;                                    IRQ Interrupt Service Routine
;*********************************************************************************************************

      CSEG AT 000BH   
      LJMP OSTickISR
      RSEG ?PR?OSTickISR?OS_CPU_A

OSTickISR:      
      USING 0
//      CLREA
      PUSHALL
      LCALL _?OSIntEnter         
      CLRTR0
      MOVTH0,#0F9H
      MOVTL0,#0F2H
      SETB TR0         
      LCALL _?OSTimeTick
      LCALL _?OSIntExit
      POPALL      
      RETI

;*********************************************************************************************************
;                                     THE END
;*********************************************************************************************************

      END

flight871 发表于 2009-7-2 10:57:13

代码没看,推测任务堆栈的问题可能性最大

ralfak 发表于 2009-7-21 13:07:47

去掉所有编译优化
页: [1]
查看完整版本: 为什么移植ucos时局部变量不能保存?