rechan886 发表于 2012-11-12 11:21:40

UCOS 51移植 特殊指针问题

       我是在http://www.amobbs.com/forum.php?mod=viewthread&tid=3396563这里看的ucos 51移植的代码。然后在移植汇编的时候有下面的代码

;获得堆栈长度和起址
      MOVA,SP
      CLRC
      SUBB A,#OSStkStart
      MOVR5,A   ;获得堆栈长度      
   
      ;OSTCBCur ===> DPTR获得当前TCB指针,详见C51.PDF第178页
      MOVR0,#LOW (OSTCBCur) ;获得OSTCBCur指针低地址,指针占3字节。+0类型+1高8位数据+2低8位数据
      INCR0
      MOVDPH,@R0    ;全局变量OSTCBCur在IDATA中
      INCR0
      MOVDPL,@R0
   
其中的OSTCBCur是申明为IDATA类型的指针变量的。它应该是一个特殊的指针和普通指针有所区别的。普通指针是3个字节,而特殊指针是2个字节的。
上图就是C51上说的。。。请大神们指点一下。。。解开我心中的迷惑。

rechan886 发表于 2012-11-12 21:44:39

怎么没人解答呢???自己顶一下。。。

hell-prototypes 发表于 2012-11-12 22:13:37

我看半天,怎么看不出来你的迷惑是什么。。。

rechan886 发表于 2012-11-13 12:50:53

    ;OSTCBCur ===> DPTR获得当前TCB指针,详见C51.PDF第178页
      MOVR0,#LOW (OSTCBCur) ;获得OSTCBCur指针低地址,指针占3字节。+0类型+1高8位数据+2低8位数据
      INCR0
      MOVDPH,@R0    ;全局变量OSTCBCur在IDATA中
      INCR0
      MOVDPL,@R0
jiu

rechan886 发表于 2012-11-13 12:53:03

    ;OSTCBCur ===> DPTR获得当前TCB指针,详见C51.PDF第178页
      MOVR0,#LOW (OSTCBCur) ;获得OSTCBCur指针低地址,指针占3字节。+0类型+1高8位数据+2低8位数据
      INCR0
      MOVDPH,@R0    ;全局变量OSTCBCur在IDATA中
      INCR0
      MOVDPL,@R0
就是上面他说OSTCBCur指针是三个字节啊。。我认为是两个字节。 直接就是1高8位数据+2低8位数据啊。。。
{:sad:}

hell-prototypes 发表于 2012-11-13 16:17:01

OSTCBCur是放在IDATA空间里面的指针变量,但它是通用型指针,所以OSTCBCur是要占用3个字节空间。
如果OSTCBCur是指向IDATA的指针那么就只要占用两个字节。

rechan886 发表于 2012-11-13 23:33:58

当时我在ucos.h的声明中看到的是
OS_EXTidata OS_TCB   *OSTCBCur;                     /* Pointer to currently running TCB         */

在keil中说明
   long * idata varptr; /* generic ptr stored in idata */
   long code *powtab; /* ptr to long(s) in code */   
这两者有什么区别呢???   

rechan886 发表于 2012-12-19 21:14:59

----- Original Message -----
From: zhouzmy <zhouzmy@zju.edu.cn>
To: <gdtyy@ri.gdt.com.cn>
Sent: Monday, November 11, 2002 1:03 PM
Subject: 一个不太严重的错误
杨屹:
   你好!
   我看了你的程序,恕我直言,我觉得你可能对指针理解错误,我看了一下C51.PDF文件,指针定义有如下几种:
   通用指针:
         char *s;            //定义s为指向char的指针,s占3个字节
   指明存储器的指针:
         char data *s;      //s为指向存贮在data的char,s占1字节
         char xdata * idata s;//s存储在idata中,它指向存储在xdata的char,s占2字节

   因此,移植程序还可以优化,可以通过指明存储器的方法来减少一个字节的存储单元。
   如果我有什么说错了,欢迎探讨。

reply:2002/11/12 12:42
zhouzmy,你好!
    我看了一下C51.PDF文件,你说的完全正确。优化方法也对。
    我当时忙着移植OS,对C51文档只捡重点的看,很多细节忽略了,至今也没有从头到尾看一遍。不过我的程序经过了测试,虽然忽略了指针细节,但凑巧蒙对了。比如“OS_EXT idata OS_TCB   *OSTCBCur;”一句,当时不知idata放在何处,只好通过调试确定,我参照的源码是3字节的,当时还纳闷放在*号前为什么不对(即“OS_EXT OS_TCB idata * OSTCBCur;”)。我于是不加思索地把它放在了OS_EXT后,现在一查C51.PDF才恍然大梧,原来这相当于将其放在*号后(即“OS_EXT OS_TCB * idata OSTCBCur;”),而且KEIL建议不要这么做,以后版本可能不支持。
    我的软件按正确写法(带优化)为:“OS_EXT OS_TCB xdata * idata OSTCBCur;”。不支持优化的推荐写法为“OS_EXT OS_TCB * idata OSTCBCur;”。优化提高了效率,减少了通用性,不过我将在升级版本中采用带优化的写法。
    谢谢你的指正,希望继续交流,共同提高!
页: [1]
查看完整版本: UCOS 51移植 特殊指针问题