打印

[求助]任务堆栈初始化中的设置问题

[复制链接]
1739|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bit6019|  楼主 | 2010-2-19 00:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST, os, ni, AC, Stack
大家好,有个问题请教。我用的是8962的开发板,在做移植到UCOS的过程中发现文件OS_CPU_C.C文件中的任务堆栈初始化函数,发现每个寄存器的赋值问题,我想问下,赋值问题和什么有关,应该怎样理解?望高人指教,谢谢。

OS_STK *OSTaskStkInit (void  (*task)(void  *parg), void  *parg, OS_STK  *ptos, INT16U  opt)
{
    OS_STK *stk;


    (void)opt;                                         /*  'opt' is not used, prevent  */
                                                                       /*  warning 没有用'opt',       */
                                                                        /*  防止编译警告                */
                                                                           
    stk = ptos;                                         /*  Load stack pointer          */
                                                      /*  装载堆栈指针  */                                    

                                                            /*  Registers stacked as if     */
                                                       /*  auto-saved on exception     */            
                                                          /*  模拟成异常,自动把寄存器压栈*/

    *(stk) = (INT32U)0x01000000L;                       /*  xPSR                        */
    *(--stk) = (INT32U)task;                               /*  Entry Point of the task     */
                                                                        /*  任务入口地址                */
    *(--stk) = (INT32U)0xFFFFFFFEL;                   /*  R14 (LR)  (init value will  */
                                                                     /*  cause fault if ever used)   */
                                                                           
    *(--stk) = (INT32U)0x12121212L;                      /*  R12                         */
    *(--stk) = (INT32U)0x03030303L;                     /*  R3                          */
    *(--stk) = (INT32U)0x02020202L;                  /*  R2                          */
    *(--stk) = (INT32U)0x01010101L;                     /*  R1                          */
    *(--stk) = (INT32U)parg;                         /*  R0 : argument  输入参数     */
                                                             /*  Remaining registers saved on*/
                                                                        /*  process stack               */   
                                                               /*  剩下的寄存器保存到堆栈      */

    *(--stk) = (INT32U)0x11111111L;                     /*  R11                         */
    *(--stk) = (INT32U)0x10101010L;                     /*  R10                         */
    *(--stk) = (INT32U)0x09090909L;                     /*  R9                          */
    *(--stk) = (INT32U)0x08080808L;                      /*  R8                          */
    *(--stk) = (INT32U)0x07070707L;                      /*  R7                          */
    *(--stk) = (INT32U)0x06060606L;                        /*  R6                          */
    *(--stk) = (INT32U)0x05050505L;                      /*  R5                          */
    *(--stk) = (INT32U)0x04040404L;                      /*  R4                          */

    return(stk);
}

相关帖子

沙发
北京户口| | 2010-2-19 00:48 | 只看该作者
这里的寄存器的值只是为了方便调试而设置的,返回值还是堆栈顶

使用特权

评论回复
板凳
北京户口| | 2010-2-19 00:48 | 只看该作者
在uCOS的所有移植代码中,任务堆栈的初始化值没有任何意义。

可能是所有程序人员为了便于理解,都是做如下的初始化值。

如R1=1;R2=2这样的方式!

这里初始化的任何值都是无意义的!

使用特权

评论回复
地板
S3C2440| | 2010-2-19 00:58 | 只看该作者
不知道,这个太难了!

使用特权

评论回复
5
ShakaLeo| | 2010-2-19 10:14 | 只看该作者
本帖最后由 ShakaLeo 于 2010-2-19 10:20 编辑

UCOSII规定每个任务可以有一个参数,而ARM编译器都会用R0来传递第一个参数,所以R0赋值为p_arg。xPSR的赋值确保处理器运行于thumb模式,因为cortex-M3只能运行于thumb模式。PC寄存器的赋值为task,即任务的起始地址。LR寄存器的赋值,使得任务不可能有“调用返回”的机会,因为任务不能返回,一旦返回,LR的值(0xFFFFFFFE)会导致异常。对R1-R12的赋值是没有实际意义的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

221

主题

1344

帖子

1

粉丝