打印
[AVR单片机]

关于uc/os于AVR M128的范例,不懂!

[复制链接]
2389|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eqtwo|  楼主 | 2007-6-25 09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在执行
PUSHRS     ; Save current task's context
前怎么我感觉Y的值很随机的

如下
_OSCtxSw::
    PUSHRS    ;保存所有寄存器
    ...
         ...
         ...            
         POPRS    ;恢复所有寄存器
         RET
是否在执行OSCtxSw();前就已经把“当前任务的栈顶指针”赋值给Y了?
怎么我没有看到到?高人们方便指出吗?

相关帖子

沙发
eqtwo|  楼主 | 2007-6-26 13:54 | 只看该作者

哈哈,是我没有所清楚吗?

.macro PUSHRS
                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
                .endmacro

很容易理解以上宏定义“PUSHRS”是为了把寄存器的内容存到Y指向的位置,但是在执行“PUSHRS”时Y的值怎么好像是不定的?
我理解执行“PUSHRS”前,(即执行OSCtxSw()前),应该先把当前任务的栈顶赋值给Y,再进行任务调度?不知对否?在ucos程序里我就没有看到有这样的程序!!所以请高人指点!!谢谢!!

使用特权

评论回复
板凳
jchemail| | 2007-6-27 20:30 | 只看该作者

Y指向的就是当前任务的堆栈指针


_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                      ;

                CALL    _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
                POP_SREG                            ; Restore status register
                POP_ALL                             ; Restore all registers

                RET

堆栈结构:


PC (H)
PC (L)
              <--R29:R28(YH:YL)
Hard SP (H)
Hard SP (L)
SREG
RAMPZ
R31 (Z (H))
R30 (Z (L))
R27 (X (H))
R26 (X (L))
R25
R24
R23
R22
R21
R20
R19
R18
R17
R16
R15
R14
R13
R12
R11
R10
R9
R8
R7
R6
R5
R4
R3
R2
R1

使用特权

评论回复
地板
eqtwo|  楼主 | 2007-6-29 10:41 | 只看该作者

谢谢,楼上



执行PUSH_ALL前,“Y指向的就是当前任务的堆栈指针”,为什么?

那是硬件实现的吗?还是编译器实现?

如果不是硬件实现,或者编译器实现,能保证Y在C程序的任务运行时不会被其他操作修改吗?能保证在执行PUSH_ALL时,Y还是指向当前任务的堆栈指针?

不好意思,可能我还是没有转过弯来!!请指正!!

使用特权

评论回复
5
eqtwo|  楼主 | 2007-7-3 08:57 | 只看该作者

谢谢!!已经弄明白了,一时没转过弯来

使用特权

评论回复
6
ayb_ice| | 2007-7-9 15:10 | 只看该作者

6楼 对头...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

27

帖子

1

粉丝