|
以下的程序在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编辑过 |
|