lbheibai 发表于 2008-8-30 11:37:00

关于*OSTaskStkInit()中寄存器保存问题

在OSTaskStkInit()中,有一段堆栈初始化代码:

...
    *psoft_stk--= (INT8U)0x00;            /* R0    = 0x00                                             */
    *psoft_stk--= (INT8U)0x01;            /* R1    = 0x01                                             */
    *psoft_stk--= (INT8U)0x02;            /* R2    = 0x02                                             */
    *psoft_stk--= (INT8U)0x03;            /* R3    = 0x03                                             */
    *psoft_stk--= (INT8U)0x04;            /* R4    = 0x04                                             */
    *psoft_stk--= (INT8U)0x05;            /* R5    = 0x05                                             */
    *psoft_stk--= (INT8U)0x06;            /* R6    = 0x06                                             */
    *psoft_stk--= (INT8U)0x07;            /* R7    = 0x07                                             */
...
这段代码的目的是要把R0、R1...等寄存器的内容保存在堆栈里面,然后在OS_CPU_A.S文件中,通过汇编POP操作取出,那为什么不用在(INT8U)0x00 前面加 *号呢*(INT8U)0x00,这样不才是保存寄存器?请问哪位可以解释一下

yoyo_fly 发表于 2008-8-30 11:39:14

这里不是保存寄存器内容, 是模仿中断给推荐初始化

lbheibai 发表于 2008-8-30 11:39:30

以上例子是UCOS网站上的M128在IAR下的程序,同时也看了下其它网友在M16 winavr下的例子,也是这样写法。因此只能怀疑是自己哪里理解错了,

lbheibai 发表于 2008-8-30 11:48:08

先谢了,如果只是初始化,它把寄存器原地址保存在堆栈里面,有何意义?因为在OS_CPU_A.S中,好像只有PUSH、POP,这些操作都是直接把堆栈数据保存或者取出啊

zllfdd 发表于 2008-8-30 13:05:13

初始化是让堆栈指针指向正确的位置。
任务经过初始化后,堆栈中已经有寄存器的位置了,任务第一次运行时,这些值会从堆弹出。
里面的具体值无所谓,因为任务还没有运行过,任务的寄存器的值也没意义。
你可以直接 *psoft_stk = *psoft_stk - 8。写固定的值可能是为了调试方便。

我记得ucos可以传一个参数给任务,只有那个参数的值有意义。

lbheibai 发表于 2008-8-30 14:51:42

原来是这样,那明白了,谢谢。
页: [1]
查看完整版本: 关于*OSTaskStkInit()中寄存器保存问题