我是在
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上说的。。。请大神们指点一下。。。解开我心中的迷惑。
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;”。优化提高了效率,减少了通用性,不过我将在升级版本中采用带优化的写法。
谢谢你的指正,希望继续交流,共同提高!
一周热门 更多>