查看: 10599|回复: 18

[提问] 有人碰到过keil c51里的pdata_group问题没有?

[复制链接]
发表于 2009-6-8 18:59:00 | 显示全部楼层 |阅读模式
关键词: group , Keil , pdata
不知道怎么回事,pdata_group好像被限制到了0x80左右大小,稍微加点代码变量之类的就会报告溢出
请问这是怎么回事?
按道理讲应该能达到0xff才对啊
发表于 2009-6-9 11:05:14 | 显示全部楼层
2个原因:

1、要使pdata有效,必须在COMPACT编译模式下。
2、需要修改STARTUP.A51文件中的相关条目。(改了吗?)
3、填写BL51 LOCATA下的PDATA项。
4、干脆什么都不动,程序中修改P2=XXXX; 就行了。
 楼主| 发表于 2009-6-10 20:47:06 | 显示全部楼层
回复二楼,我在启动文件中看到的是:

IDATALEN        EQU    100H     ; the length of IDATA memory in bytes.
;
XDATASTART      EQU     0H      ; the absolute start-address of XDATA memory
XDATALEN        EQU  1000H      ; the length of XDATA memory in bytes.
;
PDATASTART      EQU     0H      ; the absolute start-address of PDATA memory
PDATALEN        EQU     0H      ; the length of PDATA memory in bytes.

这样合理不?



2个原因:

1、要使pdata有效,必须在COMPACT编译模式下。
2、需要修改STARTUP.A51文件中的相关条目。(改了吗?)
3、填写BL51 LOCATA下的PDATA项。
4、干脆什么都不动,程序中修改P2=XXXX; 就行了。
ydz0515 发表于 2009-6-9 11:05
发表于 2009-6-11 11:25:18 | 显示全部楼层
修改这几条:其他不动。

PPAGEENABLE     EQU     0       ; set to 1 if pdata object are used.       //应该设为 1 ?
;
PPAGE           EQU     0       ; define PPAGE number.
;
PPAGE_SFR       DATA    0A0H    ; SFR that supplies uppermost address byte
;               (most 8051 variants use P2 as uppermost address byte)
;


最好把相关程序贴上来,我帮你实验一下。
发表于 2009-6-11 15:34:26 | 显示全部楼层
要是片内pdata,可能就不一样了。

我没试过。可以试试。
 楼主| 发表于 2009-6-12 16:50:55 | 显示全部楼层
先谢谢楼上,的确是片内ram,目前的困扰是,片上flash比较大,260k的容量,因此想尽可能多的放代码进去,结果pdata就溢出了,楼上有没有节省ram的好方法?
发表于 2009-6-12 20:46:27 | 显示全部楼层
用位
发表于 2009-6-12 20:59:21 | 显示全部楼层
这个问题好。phoenixmy可以得一本书了吧,菜农兄?
发表于 2009-6-13 03:54:16 | 显示全部楼层
哈哈~~~这个问题很怪异~~~俺真没遇到过~~~


估计法国本部的老外就脑浆~~~
发表于 2009-6-13 11:08:08 | 显示全部楼层
“因此想尽可能多的放代码进去,结果pdata就溢出了,楼上有没有节省ram的好方法?”

pdata怎么是放代码的?是 Xdata里的一部分。
 楼主| 发表于 2009-6-14 10:21:05 | 显示全部楼层
可能我说的不清楚,楼上理解有些误会
增加代码的同时,肯定要申请跟多的局部和全局变量么,这个没问题吧
因此pdata也罢,xdata也罢,就会出现不够的情况

目前这个芯片有260K的flash,可能按普通开发来说的话,空间肯定够用
但是目前需要增加尽可能多的功能进去,因此代码量可能有些达到极限了
头痛的地方就在这里

编译结果显示代码量大概在155k左右(我们目前只用了128k flash装载代码,剩下的是文件系统用),
keil的优化功能已经挺厉害的了,至少把代码都装进去,但是内存可就不是那么好省的了
发表于 2009-6-15 16:03:45 | 显示全部楼层
这还不简单?
Keil中每个函数的参数和局部变量都可以分别指定其存储器模式的。例如:
#pragma  compact

void funcA( int i, char x) small
{ char abc;  int *ptr;  //分配在data区
  .....
}
void funcB( int i, char x) large   
{ char abc;   int *ptr;    //分配在xdata区
  .....
}

不特别指定的,编译器按照compact缺省处理。
 楼主| 发表于 2009-6-15 16:36:48 | 显示全部楼层
恩,暂时是按照这种方法处理的,但是使用内存的时候还是得很小心,否则一不小心就会导致pdata溢出,pdata_group也生成不出来
发表于 2009-6-16 08:29:01 | 显示全部楼层
本帖最后由 ydz0515 于 2009-6-16 08:31 编辑

那就   #pragma  large                //  或者  #pragma  small

缺省使用xdata/data 区,不用pdata 区好了。

不必担心。
 楼主| 发表于 2009-6-16 10:12:10 | 显示全部楼层
貌似keil不认#pragma  large     ,一编译就报错,不知道咋回事
发表于 2009-6-16 16:43:05 | 显示全部楼层
我用的好好的。8K的程序

#pragma large
#include
#include
......

必须放在程序第一条。
 楼主| 发表于 2009-6-16 17:05:53 | 显示全部楼层
很郁闷中
rebuild all返:
Target not created

没有任何error报告出来
发表于 2011-3-26 16:22:50 | 显示全部楼层
准备学习   看看!
发表于 2011-12-9 20:47:33 | 显示全部楼层
可以试试
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表