搜索
bottom↓
回复: 2

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

[复制链接]

出0入0汤圆

发表于 2009-7-2 10:37:35 | 显示全部楼层 |阅读模式
小弟想在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
        MOV  A,R0
        PUSH ACC
        MOV  A,R1
        PUSH ACC
        MOV  A,R2
        PUSH ACC
        MOV  A,R3
        PUSH ACC
        MOV  A,R4
        PUSH ACC
        MOV  A,R5
        PUSH ACC
        MOV  A,R6
        PUSH ACC
        MOV  A,R7
        PUSH ACC
        ENDM

POPALL  MACRO

        POP  ACC
        MOV  R7,A
        POP  ACC
        MOV  R6,A
        POP  ACC
        MOV  R5,A
        POP  ACC
        MOV  R4,A
        POP  ACC
        MOV  R3,A
        POP  ACC
        MOV  R2,A
        POP  ACC
        MOV  R1,A
        POP  ACC
        MOV  R0,A
        POP  DPH
        POP  DPL
        POP  B
        POP  ACC
        POP  PSW
        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:   
        MOV  R0,#LOW (OSTCBCur)
        INC  R0
        MOV  DPH,@R0  
        INC  R0
        MOV  DPL,@R0
        INC  DPTR      
        MOVX A,@DPTR   
        MOV  R0,A
        INC  DPTR
        MOVX A,@DPTR
        MOV  R1,A
        MOV  DPH,R0
        MOV  DPL,R1
        MOVX A,@DPTR
        MOV  R5,A
        MOV  R0,#OSStkStart
        
restore_stack:   
        INC  DPTR
        INC  R0
        MOVX A,@DPTR
        MOV  @R0,A
        DJNZ R5,restore_stack
        MOV  SP,R0
        INC  DPTR
        MOVX A,@DPTR
        MOV  ?C_XBP,A  
        INC  DPTR
        MOVX A,@DPTR
        MOV  ?C_XBP+1,A
        MOV  R0,#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:
        MOV  A,SP
        CLR  C
        SUBB A,#OSStkStart
        MOV  R5,A
        MOV  R0,#LOW (OSTCBCur)
        INC  R0
        MOV  DPH,@R0
        INC  R0
        MOV  DPL,@R0
        INC  DPTR     
        MOVX A,@DPTR  
        MOV  R0,A
        INC  DPTR
        MOVX A,@DPTR
        MOV  R1,A
        MOV  DPH,R0
        MOV  DPL,R1
        MOV  A,R5
        MOVX @DPTR,A     
        MOV  R0,#OSStkStart  

save_stack:   
        INC  DPTR
        INC  R0
        MOV  A,@R0
        MOVX @DPTR,A
        DJNZ R5,save_stack
        INC  DPTR
        MOV  A,?C_XBP
        MOVX @DPTR,A
        INC  DPTR
        MOV  A,?C_XBP+1
        MOVX @DPTR,A
        LCALL         _?OSTaskSwHook
        MOV  R0,#OSTCBCur
            MOV  R1,#OSTCBHighRdy
            MOV  A,@R1
        MOV  @R0,A
        INC  R0
            INC  R1
            MOV  A,@R1
        MOV  @R0,A
        INC  R0
            INC  R1
            MOV  A,@R1
        MOV  @R0,A
        MOV  R0,#OSPrioCur
            MOV  R1,#OSPrioHighRdy
            MOV  A,@R1
        MOV  @R0,A        
        LJMP OSCtxSw_in

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

        RSEG ?PR?OSIntCtxSw?OS_CPU_A
        
OSIntCtxSw:
        MOV  A,SP
        CLR  C
        SUBB A,#4
        MOV  SP,A
        
        LJMP OSIntCtxSw_in

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

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

OSTickISR:        
        USING 0
//        CLR  EA
        PUSHALL
        LCALL _?OSIntEnter           
        CLR  TR0
        MOV  TH0,#0F9H  
        MOV  TL0,#0F2H
        SETB TR0         
        LCALL _?OSTimeTick
        LCALL _?OSIntExit
        POPALL        
        RETI

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

        END

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-7-2 10:57:13 | 显示全部楼层
代码没看,推测任务堆栈的问题可能性最大

出0入0汤圆

发表于 2009-7-21 13:07:47 | 显示全部楼层
去掉所有编译优化
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-31 14:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表