搜索
bottom↓
回复: 15

C51使用PDATA出现异常,求助

[复制链接]

出0入0汤圆

发表于 2022-5-13 15:27:12 | 显示全部楼层 |阅读模式
本帖最后由 Superfire 于 2022-5-13 15:33 编辑


前辈们好,近些日子用到一个HX711,驱动程序用的下面的:
  1. Reference Driver(C)
  2. //-------------------------------------------------------------------
  3. sbit ADDO = P2^0;
  4. sbit ADSK = P2^1;
  5. unsigned long ReadCount(void){
  6. unsigned long Count;
  7. unsigned char i;
  8. ADDO=1;
  9. ADSK=0;
  10. Count=0;
  11. while(ADDO);
  12. for (i=0;i<24;i++){
  13. ADSK=1;
  14. Count=Count<<1;
  15. ADSK=0;
  16. if(ADDO) Count++;
  17. }
  18. ADSK=1;
  19. Count=Count^0x800000;
  20. ADSK=0;
  21. return(Count);
  22. }
复制代码


使用正常,没问题。。
但过些时间,增加一些别的东西,有个情况,keil编译告知data空间不足。
看网上教程,将图中所标memory model改成了pdata,改完之后,上面这个段程序就不能正常运行了,返回值持续为0。回头用这个demo跑程序,改成pdata也复现同样的情况。
将unsigned long类型改成unsigned int,demo程序可以运行,但不足24位,数据丢一些。。所以是跟数据类型有关系吗?
看坛友介绍,pdata是扩展的低256字节,和一些介绍https://www.amobbs.com/forum.php ... amp;highlight=pdata
看完不知道这些意味着什么,是否我这次的问题与其中相关。
请坛友们指点一下,非常感谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2022-5-13 16:07:17 | 显示全部楼层
Device 选的是 Intel 80/87C52, 有没有问题?

出0入18汤圆

发表于 2022-5-13 16:12:43 | 显示全部楼层
Pdata应该要先赋值P2的吧

出0入0汤圆

发表于 2022-5-13 19:52:12 | 显示全部楼层
pdata是分页寻址片外ram,你板上有吗?若有地址你是否赋值正确?

出0入0汤圆

发表于 2022-5-16 10:01:23 | 显示全部楼层
一直没搞懂这个pdata有什么用,还要手动对P2赋值换页,难道是为了不同进程的内存空间切换?

出0入0汤圆

 楼主| 发表于 2022-5-16 10:30:24 | 显示全部楼层
szdy 发表于 2022-5-13 19:52
pdata是分页寻址片外ram,你板上有吗?若有地址你是否赋值正确?
(引用自4楼)

没有外置的,片内有集成256b的RAM;;地址赋值应如何操作,这点不太明白

出0入0汤圆

 楼主| 发表于 2022-5-16 10:34:11 | 显示全部楼层
vuo50z 发表于 2022-5-16 10:01
一直没搞懂这个pdata有什么用,还要手动对P2赋值换页,难道是为了不同进程的内存空间切换? ...
(引用自5楼)

P2赋值是指的什么

出0入0汤圆

发表于 2022-5-16 13:00:39 | 显示全部楼层
Superfire 发表于 2022-5-16 10:30
没有外置的,片内有集成256b的RAM;;地址赋值应如何操作,这点不太明白
(引用自6楼)

还是要了解下51的体系结构。51的地址空间比较复杂,内部ram,rom和外部ram有各自的存取方式,其中内部ram还包含了寄存器和bit区。

出0入0汤圆

发表于 2022-5-16 16:57:02 | 显示全部楼层
本帖最后由 lyl1070 于 2022-5-16 17:13 编辑

memory model选项是指,将默认的变量存放到哪个位置(除了指定位置的变量外,没有指定的都放在这个位置)。
举例:

uchar idata i,flag; // 定义到idata区域。
uchar data i,flag; // 定义到data区域。
uchar xdata i,flag; // 定义到xdata区域。

uchar pdata i,flag; // 定义到pdata区域。

uchar i,flag; // 定义到memory model选项中的区域。

注:

data:固定指前⾯0x00-0x7f的128个RAM,可以⽤acc直接读写的,速度最快,⽣成的代码也最⼩。
idata:固定指前⾯0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的⽅式不同。
idata是⽤类似C中的指针⽅式访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)。

另外程序堆栈只能存放在idata中,而且是80H~0xFF之间,所以程序必须留出足够的idata空间,而不能超过128个。

xdata:外部扩展RAM,⼀般指外部0x0000-0xffff空间,⽤DPTR访问。

pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,⽤movx ACC,@Rx读写。

这个⽐较特殊。
有些说pdata是xdata的某一页,页数由某个寄存器控制。没用过,不好说。
所以楼主的程序使用pdata的前提是你的MCU要有xdata,还要指定页。

有例子:

MCU支持传统的访问外部RAM方法,可以使用MOVXA,@Ri或MOVX@Ri,A;来访问外部低256字节RAM;
使用MOVX A,@DPTR或MOVX@DPTR,A来访问外部480字节RAM。

用户也能用XPAGE寄存器来访问外部RAM,仅用MOVX A,@Ri或MOVX@Ri,A指令即可。
用户能用XPAGE来表示高于256字节的RAM地址。

出25入12汤圆

发表于 2022-5-16 17:47:37 | 显示全部楼层
我理解 PDATA就是  XDATA 的前256个字节, 因为访问不需要高位地址,比用DPTR访问快一点

芯片自带的XDATA 应该不要设置页,直接用就是了, 现在的片子总感觉没必要分这么细了, 麻烦,全用XDATA算了,

出0入0汤圆

发表于 2022-5-16 17:52:32 来自手机 | 显示全部楼层
lyl1070 发表于 2022-5-16 16:57
memory model选项是指,将默认的变量存放到哪个位置(除了指定位置的变量外,没有指定的都放在这个位置)。 ...
(引用自9楼)

另外程序堆栈只能存放在idata中,而且是80H~0xFF之间,所以程序必须留出足够的idata空间,而不能超过128个

这个你错了,SP在idata内都可以,不是必须80H~0FF范围

出0入0汤圆

发表于 2022-5-16 18:01:01 | 显示全部楼层
arm 发表于 2022-5-16 17:52
另外程序堆栈只能存放在idata中,而且是80H~0xFF之间,所以程序必须留出足够的idata空间,而不能超过128 ...
(引用自11楼)

这个倒是没注意过,我一般都是64或100个。

#define                SP_LEN                        100                                                        // 定义SP堆栈指针长度
uchar        idata SP_ADDR[SP_LEN]        _at_ (0xFF-SP_LEN);                // 定义SP堆栈位置,预留到idata区的未端

出0入0汤圆

发表于 2022-5-16 18:54:10 | 显示全部楼层
Superfire 发表于 2022-5-16 10:30
没有外置的,片内有集成256b的RAM;;地址赋值应如何操作,这点不太明白
(引用自6楼)

一般而言PDATA是51系列用扩展外设芯片内部的RAM,如8155,8255等IO扩展芯片内部的RAM,如果是51那芯片自身内部的PDATA那少见,你要看看芯片手册地址该如何定义

出0入0汤圆

 楼主| 发表于 2022-5-16 22:26:14 | 显示全部楼层
szdy 发表于 2022-5-16 18:54
一般而言PDATA是51系列用扩展外设芯片内部的RAM,如8155,8255等IO扩展芯片内部的RAM,如果是51那芯片自身内 ...
(引用自13楼)

查到的RC系列是256+256字节,内部确实是扩展了256字节,
MOVX @DPTR /xdata 地址大于100H才访问外部
MOVX @Ri /pdata 只访问内部扩展RAM
我目前的理解是:用pdata声明的变量,或者使用memory model选项(选择pdata),都会放在内部扩展的256字节上;
那么是不是可以理解 256+256则没有额外xdata呢?或者说,就此单片机来说来说,xdata空间=扩展256字节,也就是pdata区。
如9楼所指,程序应该是可以执行的;
那么回到demo程序里,为什么就异常了捏

出0入0汤圆

发表于 2022-5-17 10:04:26 | 显示全部楼层
arm 发表于 2022-5-16 17:52
另外程序堆栈只能存放在idata中,而且是80H~0xFF之间,所以程序必须留出足够的idata空间,而不能超过128 ...
(引用自11楼)

keil编译器可以模拟一个软堆栈(其他编译器应该也可以),放在xdata用dptr访问。
当年移植过usos ii,所有函数都要声明成可重入的,堆栈放在idata根本没法跑。

出0入0汤圆

发表于 2022-7-12 18:03:10 | 显示全部楼层
xdata pdata都是访问外部的内存,现在一般都是集成在芯片内部。pdata看指令会比xdata快一点,其次pdata是访问低256字节,xdata可以访问64KB
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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

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