OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » ucos2,OSTaskStkInit 关于ucos2的移植函数的一些不解 -

共4条 1/1 1 跳转至

ucos2,OSTaskStkInit 关于ucos2的移植函数的一些不解 - OSTaskStkInit

院士
2006-12-22 22:43:00    评分
ucos2,OSTaskStkInit 关于ucos2的移植函数的一些不解 - OSTaskStkInit



关键词: ucos2     OSTaskStkInit     关于     移植    

院士
2006-12-22 22:43:00    评分
2楼
问         OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
    OS_STK *stk;

    opt    = opt;                           /* 'opt'  没有使用。作用是避免编译器警告    */
    stk    = ptos;                          /* 获取堆栈指针                                       */

                                            /* 建立任务环境,ADS1.2使用满递减堆栈       */
    *stk = (OS_STK) task;                   /*  pc  */
    *--stk = (OS_STK) task;                 /*  lr  */

    *--stk = 0;                             /*  r12  */
    *--stk = 0;                             /*  r11  */
    *--stk = 0;                             /*  r10  */
    *--stk = 0;                             /*  r9   */
    *--stk = 0;                             /*  r8   */
    *--stk = 0;                             /*  r7   */
    *--stk = 0;                             /*  r6   */
    *--stk = 0;                             /*  r5   */
    *--stk = 0;                             /*  r4   */
    *--stk = 0;                             /*  r3   */
    *--stk = 0;                             /*  r2   */
    *--stk = 0;                             /*  r1   */
    *--stk = (unsigned int) pdata;          /*  r0,第一个参数使用R0传递   */
    *--stk = (USER_USING_MODE|0x00);        /*  spsr,允许 IRQ, FIQ 中断   */
    *--stk = 0;                             /*  关中断计数器OsEnterSum;    */

    return (stk);
}

==================================
    *stk = (OS_STK) task;                   /*  pc  */
    *--stk = (OS_STK) task;                 /*  lr  */

干什么用的?不是很明白
==================================
    *--stk = 0;                             /*  r8   */
    *--stk = 0;                             /*  r7   */
    *--stk = 0;                             /*  r6   */
    *--stk = 0;                             /*  r5   */
    *--stk = 0;                             /*  r4   */
    *--stk = 0;                             /*  r3   */
    *--stk = 0;                             /*  r2   */
    *--stk = 0;                             /*  r1   */

好像跟绍贝贝翻译的那本书上说法的不太一样,不是要保存寄存器吗?怎么都置0了? 1: 初始化的时候当然要清零了 2: 置0并且压入堆栈了。等下弹出来就象复位后一样~~~~ 3: 嗯,也是这样也对


书上说的,要保存寄存器的值
就像刚发生过中断一样

仔细想想初始化一个任务没必要那样做 4: 还有    *--stk = 0;                             /*  r12  */
    *--stk = 0;                             /*  r11  */
    *--stk = 0;                             /*  r10  */
    *--stk = 0;                             /*  r9   */
    *--stk = 0;                             /*  r8   */
    *--stk = 0;                             /*  r7   */
    *--stk = 0;                             /*  r6   */
    *--stk = 0;                             /*  r5   */
    *--stk = 0;                             /*  r4   */
    *--stk = 0;                             /*  r3   */
    *--stk = 0;                             /*  r2   */
    *--stk = 0;                             /*  r1   */


+++++++++++++++++++++++++++++
可是,那些语句和后面的注释怎么就一一对应了? 5: 这些数据现在是保存在的堆栈中的,等下任务开始执行时,就从堆栈中弹出,弹出来刚好放在后面注释中的寄存器中。因为这些是工作寄存器,全部要压栈或者从堆栈中恢复的。 6: 还有==================================
    *stk = (OS_STK) task;                   /*  pc  */
    *--stk = (OS_STK) task;                 /*  lr  */

干什么用的?不是很明白 7: 后面不是有注释么?分别对应着pc寄存器和lr寄存器而lr寄存器在函数返回时,就会返回到任务入口处了。至于pc,为何要设置,这个我就不清楚了,也许是随意弄上去的一句,并没什么实际意义,只是为了把R15(即PC)也弄一下吧。

菜鸟
2011-02-20 01:32:30    评分
3楼
OSTaskStkInit()这个函数根据什么来定义那些堆栈的顺序的,不明白,也没找到答案

菜鸟
2011-04-26 16:20:58    评分
4楼

我今天也在纠结这个,查了很多资料,终于明白了。  在给任务安排的堆栈中,可以分为两大类,一类是给寄存器用的,如OSTaskStkInit(),还有一类是给TCB数据块用的。OSTaskStkInit(),中的其实为留给寄存器的空间赋上什么样的值都是可以的,因为这只是为任务的寄存器预留空间用的,当然当任务被挂起时,就会将寄存器值保存在些空间上。我知道的就这些了。


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]