hubaixdl 发表于 2011-6-17 19:53:27

用proteus仿真AT89C51RD2时,无法使用片内xdata xram,请高手帮忙。

我用的是UCOS2 2.51,KEIL 3.5,PROTEUS7.7,别人移植好的文件,只有一个任务,目地是测试AT89C50RD2的片内XRAM,但是不管怎么设置,在没有外接RAM的情况下程序无法运行。请高手指点。
以下为附件:点击此处下载 ourdev_649789OAI1LP.rar(文件大小:107K) (原文件名:ucos2proteus.rar)

hubaixdl 发表于 2011-6-17 20:15:44

接上面
-----------------------------------------------------------------------
我用KEIL写了一个片内XRAM的测试小程序,在XDATA<768时,运行没有问题,(不像DATASHELL中所说的1792,是否为PROTEUS有BUG?),见附件。点击此处下载 ourdev_649790FWC6NW.rar(文件大小:37K) (原文件名:XRAMtest.rar)

huayuliang 发表于 2011-6-17 23:16:26

片内XRAM???

XRAM 指的就是外扩内存吧?

hubaixdl 发表于 2011-6-18 08:18:35

AT89C50RD2内部集成有1792的XRAM,没错。AT89C50RD2的说明书上有描述。在进行UCOS仿真时,在没有应用外部XRAM时,程序无法运行,可能是我设置的问题。但是用我自已的测试程序可以,但也只能仿真一部分,没有1792那么多。
请看附件:点击此处下载 ourdev_649894IVON6N.pdf(文件大小:1.32M) (原文件名:STC89C51RC.pdf)

huayuliang 发表于 2011-6-22 00:19:14

啊哦,还真的带XRAM,没用过这类的。

正好开着ISIS,看了下,应该是需要设置DATARAM。
Data Memory Map

这是帮助里的:
DATARAM Property
This specifies regions of the external memory map which can be treated as RAM and simulated internally to the 8051 model. A typical example would be:

DATARAM=0000-7FFF,C000-FFFF

This would specify two regions of external data memory.

hubaixdl 发表于 2011-6-22 11:43:25

花生:
我也看到了,在EDIT COMPONENT中修改DATA MEMORY MAP为0X00-0X6FF后,在用UCOS时,没有外接XRAM还是无法进行仿真(程序的XRAM为100多)。用我自己写的测试程序时,片内XRAM只能用到768,也没有1792那么多。看来我还是没有找到需要设置的地方。如有时间再帮我看一下。

huayuliang 发表于 2011-6-22 13:10:55

你把仿真文件和HEX文件发来吧。

不然俺得自己写程序试验了。机器又没装keil c51

hubaixdl 发表于 2011-6-22 13:47:20

UCOS2 2.51,KEIL 3.5,HEX文件,Program Size: data=121.0 xdata=109 code=6140,不接外部XRAM无法仿真,点击此处下载 ourdev_651079M9PFJL.rar(文件大小:5K) (原文件名:ucos.rar)

下面是我写的KEIL文件,用于验证XRAM<768
#include <reg51.h>
#define bb 381         //最大了,再增加就要用到外部XRAM
#define cc 50
int xdata aa;
int data dd;
del()
{
int j;
for(j=0;j<1000;j++);
}
int k;
int i;
int main()
{

while(1)
{

for(i=0;i<bb;i++)
{
aa=i+1;
k=aa;
P1=aa;
del();
}
for(i=0;i<cc;i++)
{
dd=i+1;
k=dd;
P3=dd;
del();
}
}
}
HEX:Program Size: data=109.0 xdata=768 code=361,此时不用外部XRAM即可仿真,点击此处下载 ourdev_651080PU8H81.rar(文件大小:455字节) (原文件名:1.rar)

下面的XRAM大于768时,也要外部XRAM
#include <reg51.h>
#define bb 481    //
#define cc 50
int xdata aa;
int data dd;
del()
{
int j;
for(j=0;j<1000;j++);
}
int k;
int i;
int main()
{

while(1)
{

for(i=0;i<bb;i++)
{
aa=i+1;
k=aa;
P1=aa;
del();
}
for(i=0;i<cc;i++)
{
dd=i+1;
k=dd;
P3=dd;
del();
}
}
}
hex大于768:Program Size: data=109.0 xdata=968 code=361,此时须要接外部XRAM才可仿真,点击此处下载 ourdev_651081EEP12X.rar(文件大小:460字节) (原文件名:2.rar)

huayuliang 发表于 2011-6-22 14:32:59

汗,不好意思,俺又犯这毛病了,顶楼就有。。。。

huayuliang 发表于 2011-6-22 14:50:54

回复【5楼】hubaixdl
花生:
我也看到了,在edit component中修改data memory map为0x00-0x6ff后,在用ucos时,没有外接xram还是无法进行仿真(程序的xram为100多)。用我自己写的测试程序时,片内xram只能用到768,也没有1792那么多。看来我还是没有找到需要设置的地方。如有时间再帮我看一下。
-----------------------------------------------------------------------

才注意到是这里错了,手册里要求的格式和你输入的不同:
比如1792个字节的XRAM,地址范围应该是 0x0000-0x06FF,但输入要按手册要求的格式,即:0000-06FF。这样就可以了,不能输入完全格式。
使用2.rar,仿真结果OK。

hubaixdl 发表于 2011-6-22 15:10:54

回复【9楼】huayuliang 花生
-----------------------------------------------------------------------

对了,按你说的仿真成功了,谢谢!
现在的问题是用UCOS生成的HEX没有办法仿真,见顶楼的附件,当删掉PROTEUS上的一条数据线时,CPU一直试图读取外部XRAM中的数据。网上也很难找到此方面的资料。

jlhgold 发表于 2011-6-22 17:11:30

楼主的问题在于太过相信keil的提示了 那些个bdata idata xdata在ucos下是不可信的

hubaixdl 发表于 2011-6-22 19:28:40

回复【11楼】jlhgold
-----------------------------------------------------------------------
(我想买一个仿真器,这样就不用在PROTEUS下仿真了,软件和硬件仿真有时有很大的区别。二手的最好,可以节约资金。如有朋友有用不上的51仿真器转让请MAIL我:hubaixdl@163.com)

感谢huayuliang 花生 已解决了一个问题。


51的RAM就是这三种bdata idata xdata,是有什么地方没有设定好,还是UCOS指定了访问外部XRAM?我看了几个移植好的UCOS2,都是要读外部XRAM.
有硬件仿真器的朋友请帮忙测试一下楼顶的HEX文件。

huayuliang 发表于 2011-6-22 23:09:55

回复【12楼】hubaixdl
-----------------------------------------------------------------------

话说如果你电路基础好的话,用proteus完成基本的功能实现,然后在设计电路时考虑一些实际的因素,基本上可以说仿真成功,实物也就是成功的了。

比如说我在弄AVR电路的时候,VMLAB 和 PROTEUS 一起用,VMLAB 我只用它编译和验证时序,另一边用PROTEUS加载HEX仿真(没法联调),一般来说,我仿真完成的东西,做出来也极少出问题需要修改程序和电路的。

从学AVR开始,俺至今都没用过硬件的仿真器,只有面包板,也懒得去做开发板。现成的开发板只对你进行编程调试有帮助,对电路的掌握没多少好处。

jlhgold 发表于 2011-6-23 08:35:40

回复【12楼】hubaixdl
-----------------------------------------------------------------------

keil编译后占用内存在没有操作系统的情况下是基本正确的,但ucos占用的内存并不只有显示给你看的这些,显示给你的是已经被强制占用的部分,有时候会有一些别的别的额外的临时缓冲所以有时候是内存溢出引发的

hubaixdl 发表于 2011-6-23 09:34:06

回复【14楼】jlhgold
-----------------------------------------------------------------------

在large模式下:
你说的对,我将PROTEUS的DATA MEMORY MAP 改为0000-fffe时,才不用接外部XRAM,说明在KEIL中,勾选片内XRAM 0000-06FF的约束条件并没有起到作用。

但矛盾的地方是,将PROTEUS的DATA MEMORY MAP 改为{default}时,外接XRAM,接8根地址线,外接的RAM只有256,也可以仿真,说明XRAM并没有超出KEIL所限定的109的空间,同样可以正常仿真。

程序编译后为 Program Size: data=121.0 xdata=109 code=5305,XDATA远小于1792。那是不是说此程序下载到硬件后,在没有外接RAM时也没有办法运行?还是在KEIL的编译中有约束条件设置选项,可以防止内存的溢出?

为什么出现以上的问题还是没有明白。

在COMPACT模式下:
同样的程序仿真成功!

谢谢两位的帮忙!!!

jlhgold 发表于 2011-6-23 12:28:41

回复【15楼】hubaixdl
-----------------------------------------------------------------------

这个。。。。。不知道了 没试过。。。

betbet 发表于 2011-12-10 23:32:08

真巧了,我也是移植uCOS时用的这个片子仿真,同样的问题。

gongxd 发表于 2012-6-17 20:03:42

问题解决

netawater 发表于 2012-11-25 17:11:14

遇到同样问题,解决了,谢谢!

prophetvista 发表于 2013-11-16 16:37:15

太感谢了。把源程序改的一塌糊涂,现在才发现是proteus的data memory map没有设置。
页: [1]
查看完整版本: 用proteus仿真AT89C51RD2时,无法使用片内xdata xram,请高手帮忙。