uCOS-IIwilliam hill官网
直播中

高才

11年用户 76经验值
擅长:可编程逻辑 CRF/无线
私信 关注
[问答]

uCOS-II移植中任务切换的问题

uCOS-II移植中任务切换的问题
近来想学习嵌入式系统,在ATmega8单片机下跑了个UCOS系统。虽然完成了任务切换,但是对于涉及到的几个内核函数任由疑问:
OSCtxSw()代码如下:
OSCtxSw:
                PUSH_ALL                            ; Save current task's context
                PUSH_SREG
                PUSH_SP

                LDS     R30,OSTCBCur               ; Z = OSTCBCur->OSTCBStkPtr
                LDS     R31,OSTCBCur+1             ;
                ST      Z+,R28                      ; Save Y (R29:R28) pointer
                ST      Z+,R29                      ;

                RCALL    OSTaskSwHook               ; Call user defined task switch hook

                LDS     R16,OSPrioHighRdy          ; OSPrioCur = OSPrioHighRdy
                STS     OSPrioCur,R16

                LDS     R30,OSTCBHighRdy           ; Let Z point to TCB of highest priority task
                LDS     R31,OSTCBHighRdy+1         ; ready to run
                STS     OSTCBCur,R30               ; OSTCBCur = OSTCBHighRdy
                STS     OSTCBCur+1,R31             ;

                LD      R28,Z+                      ; Restore Y pointer
                LD      R29,Z+                      ;

                POP_SP                              ; Restore stack pointer
                LD      R16,Y+
                SBRC    R16,7
                RJMP    OSCtxSw_1
               
                OUT     SREG,R16                    ; Restore status register
                POP_ALL                             ; Restore all registers
                RET
OSCtxSw_1:
                CBR     R16,BIT07
                OUT     SREG,R16
                POP_ALL
                REti
其中PUSH_ALL用来保存CPU寄存器,其代码如下:
.macro  PUSH_ALL                            ; Save all registers
                ST      -Y,R0
                ST      -Y,R1
                ST      -Y,R2
                ST      -Y,R3
                ST      -Y,R4
                ST      -Y,R5
                ST      -Y,R6
                ST      -Y,R7
                ST      -Y,R8
                ST      -Y,R9
                ST      -Y,R10
                ST      -Y,R11
                ST      -Y,R12
                ST      -Y,R13
                ST      -Y,R14
                ST      -Y,R15
                ST      -Y,R16
                ST      -Y,R17
                ST      -Y,R18
                ST      -Y,R19
                ST      -Y,R20
                ST      -Y,R21
                ST      -Y,R22
                ST      -Y,R23
                ST      -Y,R24
                ST      -Y,R25
                ST      -Y,R26
                ST      -Y,R27
                ST      -Y,R30
                ST      -Y,R31
                IN      R16,RAMPZ
                ST      -Y,R16
                .endm
该函数实在任务调度函数OS_Sched()里调用的,但是OS_Sched()调用它之前也并没有把Y寄存器指向该任务堆栈栈顶地址,有大神知道这是怎么回事吗?中断任务切换函OSIntCtxSw()也是如此,直接PUSH_ALL、PUSH_SREG、PUSH_SP,并未指定被中断的任务的堆栈栈顶地址。我自己手动在保存CPU状态之前把Y寄存器地址指向任务堆栈地址后程序运行起来也没发现什么不同。
目前程序运行后任务之间的切换正常,但是中断和任务之间切换多次之后会跑飞。
求大神解惑。

回帖(3)

阳澄湖

2014-12-23 15:19:51
我也有同样的疑问,个人觉得usos系统关键就在任务的切换这几段汇编程序。
举报

高才

2014-12-23 17:31:14
引用: huzi741 发表于 2014-12-23 15:19
我也有同样的疑问,个人觉得usos系统关键就在任务的切换这几段汇编程序。

移植的工作 主要就是这几个汇编函数的编写,任务切换的时候这几个函数在保存CPU状态前并没有把Y寄存器指向任务堆栈栈顶啊。求解啊
举报

Honeyliu

2016-7-4 15:15:44
我在128上用ucosii、但是任务切换不了什么原因呀
举报

更多回帖

发帖
×
20
完善资料,
赚取积分