chenbei81 发表于 2005-4-20 20:02:13

ucosII移植到M128时的OSTaskStkInit()函数的疑问,请大家说一说!谢谢了!

以下的程序在M128上已经运行成功

OS_STK *OSTaskStkInit (void (*task)(void *pd),void *pdata, OS_STK *ptos, INT16U opt){

    INT8U*stk;

    INT8U*stks;        // Temp. variable used for setting up AVR hardware stack

    INT16U tmp;

    opt   = opt;               

    stk   = (INT8U *)ptos;// Wandlung von ptos in Bytezeiger

        // AVR return stack ("hardware stack")

    stks    = (INT8U *)(ptos)-(OS_TASK_DEF_STK_SIZE-32);

// the function address has an extra level of indirection. Fetch the actual address.   

    tmp = *(INT16U const *)task;   

    *stks-- = (INT8U)tmp;        //Put task start address on top of hardware stack

    *stks-- = (INT8U)(tmp >> 8);

    *stk-- = (INT8U)0x00;                // R0= 0x00

    。

    。

    。

    *stk-- = (INT8U)0x30;

    *stk-- = (INT8U)0x31;

    *stk-- = (INT8U)0x00;//0x3b

    *stk-- = (INT8U)0x80;        //SREG = Interrupts enabled

    tmp    = (INT16U)(stks);

    *stk-- = (INT8U)(tmp >> 8);

    *stk   = (INT8U)(tmp);

    return ((void *)stk);

}

这个是可以运行的移植程序,我有些不明白:

1。关于软堆栈和硬堆栈的概念

    stks    = (INT8U *)(ptos)-(OS_TASK_DEF_STK_SIZE-32);

    tmp = *(INT16U const *)task;

    *stks-- = (INT8U)tmp;       

    *stks-- = (INT8U)(tmp >> 8);

    tmp    = (INT16U)(stks);

    *stk-- = (INT8U)(tmp >> 8);

    *stk   = (INT8U)(tmp);

    以上好像是说把task的地址放到堆栈的最上面,但是ucos的书上是说任务地址放在最下面的呀?

2。*stk-- = (INT8U)0x00;//0x3b

   *stk-- = (INT8U)0x80;//SREG = Interrupts enabled

   我知道这个分别是rampz和sreg,但是为什么保存在这个位置呢?

3。看以前的帖子好像说移植和编译器也有关系,我没有找到相关资料,只知道移植和处理器有关,请知情者说一下吧!



-----此内容被chenbei81于2005-04-21,14:39:07编辑过


-----此内容被chenbei81于2005-04-21,15:21:37编辑过

chenbei81 发表于 2005-4-21 10:03:38

是不是我写的太罗嗦啦?怎么都没人说话呢?用过的人说说吧!

chenbei81 发表于 2005-4-21 17:25:38

自己顶!做过的说说啊!
页: [1]
查看完整版本: ucosII移植到M128时的OSTaskStkInit()函数的疑问,请大家说一说!谢谢了!