关于*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,这样不才是保存寄存器?请问哪位可以解释一下 这里不是保存寄存器内容, 是模仿中断给推荐初始化 以上例子是UCOS网站上的M128在IAR下的程序,同时也看了下其它网友在M16 winavr下的例子,也是这样写法。因此只能怀疑是自己哪里理解错了, 先谢了,如果只是初始化,它把寄存器原地址保存在堆栈里面,有何意义?因为在OS_CPU_A.S中,好像只有PUSH、POP,这些操作都是直接把堆栈数据保存或者取出啊 初始化是让堆栈指针指向正确的位置。
任务经过初始化后,堆栈中已经有寄存器的位置了,任务第一次运行时,这些值会从堆弹出。
里面的具体值无所谓,因为任务还没有运行过,任务的寄存器的值也没意义。
你可以直接 *psoft_stk = *psoft_stk - 8。写固定的值可能是为了调试方便。
我记得ucos可以传一个参数给任务,只有那个参数的值有意义。 原来是这样,那明白了,谢谢。
页:
[1]