查看: 3621|回复: 1

[S12] ucos移植至S12XE的堆栈初始化问题

[复制链接]

该用户从未签到

7

主题

37

帖子

0

新手上路

Rank: 1

积分
62
最后登录
1970-1-1
发表于 2013-11-26 16:56:55 | 显示全部楼层 |阅读模式
诸位好。在下有个UCOS-II移植到S12XEP100单片机的问题。
使用了安大神在论坛上提供的官方的UCOS-II移植例程。在这个例程里有一个堆栈初始化函数不能理解。请诸位赐教。
函数代码如下所示:
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT16U opt)
{
    INT16U *wstk;
    INT8U  *bstk;
    opt     =  opt;                                             /* 'opt' is not used, prevent warning                   */
    wstk    =  (INT16U *)ptos;                                  /* Load stack pointer                                   */
    *--wstk =  (INT16U)p_arg;                                   /* Simulate call to function with argument              */
    *--wstk =  (INT16U)(((INT32U)task) >> 8);                   /* Return address of simulated call. Format: PCHCL    */
    *--wstk =  (INT16U)(((INT32U)task) >> 8);                   /* Put task return address on top of stack              */
    *--wstk =  (INT16U)0x2222;                                  /* Y Register                                           */
    *--wstk =  (INT16U)0x1111;                                  /* X Register                                           */
    *--wstk =  (INT16U)0xBBAA;                                  /* D Register                                           */
    *--wstk =  (INT16U)0x0080;                                  /* CCR: Disable STOP, Int. Level = 0. User Mode         */
    bstk    =  (INT8U *)wstk;                                   /* Convert WORD ptr to BYTE ptr to set CCR              */
    *--bstk = *(INT8U *)0x10;                                   /* Save the GPAGE register (see note 6)                 */
    *--bstk = *(INT8U *)0x17;                                   /* Save the EPAGE register (see note 6)                 */
    *--bstk = *(INT8U *)0x16;                                   /* Save the RPAGE register (see note 6)                 */
    *--bstk =  (INT8U  )task;                                   /* Save the task's PPAGE register value                 */
    return ((OS_STK *)bstk);                                    /* Return pointer to new top-of-stack                   */
}
主要不能理解的是上述加粗的三行。
为何会有两句一模一样的*--wstk =  (INT16U)(((INT32U)task) >> 8);                  
应该是PCL先入栈,PCH后入栈,因此第一条*--wstk =  (INT16U)(((INT32U)task) >> 8);    是不是先压入PCL呢?
注释中表明函数返回地址格式为PCHCLPAGE。但是对于全局地址GLOBAL其格式应该是PPAGE值在bit21~bit14,LOCAL地址在bit13~bit0。因此这个返回地址格式描述是不是错了?
 
 
我知道答案 目前已有0人回答
回复

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2013-11-27 10:49:35 | 显示全部楼层

    RE:ucos移植至S12XE的堆栈初始化问题

    这个是UCOS的堆栈初始化,这个我也得研究一下。不好意思。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-10 05:40 , Processed in 0.084948 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表