ba_wang_mao 发表于 2008-4-30 17:21:07

请教uCOS/II 任务堆栈初始化子程序OSTaskStkInit SP指针的问题

OS_STK*OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
    INT16U *stk;
    opt    = opt;                           /* 'opt' is not used, prevent warning                      */
    stk    = (INT16U *)ptos;                /* Load stack pointer                                    */
    *stk-- = (INT16U)FP_SEG(pdata);         /* Simulate call to function with argument               */
    *stk-- = (INT16U)FP_OFF(pdata);         
    *stk-- = (INT16U)FP_SEG(task);
    *stk-- = (INT16U)FP_OFF(task);
    *stk-- = (INT16U)0x0202;                /* SW = Interrupts enabled                                 */
    *stk-- = (INT16U)FP_SEG(task);          /* Put pointer to task   on top of stack                   */
    *stk-- = (INT16U)FP_OFF(task);
    *stk-- = (INT16U)0xAAAA;                /* AX = 0xAAAA                                             */
    *stk-- = (INT16U)0xCCCC;                /* CX = 0xCCCC                                             */
    *stk-- = (INT16U)0xDDDD;                /* DX = 0xDDDD                                             */
    *stk-- = (INT16U)0xBBBB;                /* BX = 0xBBBB                                             */
    *stk-- = (INT16U)0x0000;                /* SP = 0x0000                                             */
    *stk-- = (INT16U)0x1111;                /* BP = 0x1111                                             */
    *stk-- = (INT16U)0x2222;                /* SI = 0x2222                                             */
    *stk-- = (INT16U)0x3333;                /* DI = 0x3333                                             */
    *stk-- = (INT16U)0x4444;                /* ES = 0x4444                                             */
    *stk   = _DS;                           /* DS = Current value of DS                              */
    return ((OS_STK *)stk);
}
    请问:在上面的子程序中,除SP必须被初始化=0x0000外,其余可以随意吗?
  因为我认为在任务切换子程序OSCtxSw()中,首先通过
         LES    BX, DWORD PTR DS:_OSTCBCur      ; OSTCBCur->OSTCBStkPtr = SS:SP
            MOV    ES:, SS                   ;
            MOV    ES:, SP   
    获取当前任务的堆栈,即SS:SP,因此SP在任务创建时必须初始化SP=0x0000。

ba_wang_mao 发表于 2008-4-30 17:23:47

不好意思,贴错了,应该为

        LES    BX, DWORD PTR DS:_OSTCBHighRdy; SS:SP = OSTCBHighRdy->OSTCBStkPtr
            MOV    SS, ES:                   ;
            MOV    SP, ES:                     ;
    获取当前任务的堆栈,即SS:SP,因此SP在任务创建时必须初始化SP=0x0000。
  如果堆栈指针SP在创建任务时,SP<>0,则会空闲一段空间。
页: [1]
查看完整版本: 请教uCOS/II 任务堆栈初始化子程序OSTaskStkInit SP指针的问题