UCOS 51移植 特殊指针问题

2020-02-01 16:30发布

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

;获得堆栈长度和起址
        MOV  A,SP
        CLR  C
        SUBB A,#OSStkStart
        MOV  R5,A     ;获得堆栈长度        
   
        ;OSTCBCur ===> DPTR  获得当前TCB指针,详见C51.PDF第178页
        MOV  R0,#LOW (OSTCBCur) ;获得OSTCBCur指针低地址,指针占3字节。+0类型+1高8位数据+2低8位数据
        INC  R0
        MOV  DPH,@R0    ;全局变量OSTCBCur在IDATA中
        INC  R0
        MOV  DPL,@R0
   
其中的OSTCBCur是申明为IDATA类型的指针变量的。它应该是一个特殊的指针和普通指针有所区别的。普通指针是3个字节,而特殊指针是2个字节的。 5AN()YP3$_{Y$LE](5C8PW1.jpg (280.96 KB, 下载次数: 0) 下载附件 2012-11-12 11:20 上传
上图就是C51上说的。。。请大神们指点一下。。。解开我心中的迷惑。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
rechan886
2020-02-02 12:25
----- 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;”。优化提高了效率,减少了通用性,不过我将在升级版本中采用带优化的写法。
    谢谢你的指正,希望继续交流,共同提高!

一周热门 更多>