为什么移植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 代码没看,推测任务堆栈的问题可能性最大 去掉所有编译优化
页:
[1]