搜索
bottom↓
回复: 21

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

[复制链接]

出0入0汤圆

发表于 2011-6-17 19:53:27 | 显示全部楼层 |阅读模式
我用的是UCOS2 2.51,KEIL 3.5,PROTEUS7.7,别人移植好的文件,只有一个任务,目地是测试AT89C50RD2的片内XRAM,但是不管怎么设置,在没有外接RAM的情况下程序无法运行。请高手指点。
以下为附件:点击此处下载 ourdev_649789OAI1LP.rar(文件大小:107K) (原文件名:ucos2proteus.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

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

出0入0汤圆

发表于 2011-6-17 23:16:26 | 显示全部楼层
片内XRAM???

XRAM 指的就是外扩内存吧?

出0入0汤圆

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

出0入0汤圆

发表于 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.

出0入0汤圆

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

出0入0汤圆

发表于 2011-6-22 13:10:55 | 显示全部楼层
你把仿真文件和HEX文件发来吧。

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

出0入0汤圆

 楼主| 发表于 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[bb];
int data dd[cc];
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[bb];
int data dd[cc];
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)

出0入0汤圆

发表于 2011-6-22 14:32:59 | 显示全部楼层
汗,不好意思,俺又犯这毛病了,顶楼就有。。。。

出0入0汤圆

发表于 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。

出0入0汤圆

 楼主| 发表于 2011-6-22 15:10:54 | 显示全部楼层
回复【9楼】huayuliang 花生
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-6-22 17:11:30 | 显示全部楼层
楼主的问题在于太过相信keil的提示了 那些个bdata idata xdata在ucos下是不可信的

出0入0汤圆

 楼主| 发表于 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文件。

出0入0汤圆

发表于 2011-6-22 23:09:55 | 显示全部楼层
回复【12楼】hubaixdl  
-----------------------------------------------------------------------

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

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

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

出0入0汤圆

发表于 2011-6-23 08:35:40 | 显示全部楼层
回复【12楼】hubaixdl  
-----------------------------------------------------------------------

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

出0入0汤圆

 楼主| 发表于 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模式下:
同样的程序仿真成功!

谢谢两位的帮忙!!!

出0入0汤圆

发表于 2011-6-23 12:28:41 | 显示全部楼层
回复【15楼】hubaixdl  
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-12-10 23:32:08 | 显示全部楼层
真巧了,我也是移植uCOS时用的这个片子仿真,同样的问题。

出0入0汤圆

发表于 2012-6-17 20:03:42 | 显示全部楼层
问题解决

出0入0汤圆

发表于 2012-11-25 17:11:14 | 显示全部楼层
遇到同样问题,解决了,谢谢!

出0入0汤圆

发表于 2013-11-16 16:37:15 | 显示全部楼层
太感谢了。把源程序改的一塌糊涂,现在才发现是proteus的data memory map没有设置。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-28 20:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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