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

2009年06月08日 18:59    发布者:phoenixmy
不知道怎么回事,pdata_group好像被限制到了0x80左右大小,稍微加点代码变量之类的就会报告溢出
请问这是怎么回事?
按道理讲应该能达到0xff才对啊

网友评论

ydz0515 2009年06月09日
2个原因:

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

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 http://www.eechina.com/images/common/back.gif
ydz0515 2009年06月11日
修改这几条:其他不动。

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)
;


最好把相关程序贴上来,我帮你实验一下。
ydz0515 2009年06月11日
要是片内pdata,可能就不一样了。

我没试过。可以试试。
phoenixmy 2009年06月12日
先谢谢楼上,的确是片内ram,目前的困扰是,片上flash比较大,260k的容量,因此想尽可能多的放代码进去,结果pdata就溢出了,楼上有没有节省ram的好方法?
hotpower 2009年06月12日
用位
老郭 2009年06月12日
这个问题好。phoenixmy可以得一本书了吧,菜农兄?
hotpower 2009年06月13日
哈哈~~~这个问题很怪异~~~俺真没遇到过~~~


估计法国本部的老外就脑浆~~~
ydz0515 2009年06月13日
“因此想尽可能多的放代码进去,结果pdata就溢出了,楼上有没有节省ram的好方法?”

pdata怎么是放代码的?是 Xdata里的一部分。
phoenixmy 2009年06月14日
可能我说的不清楚,楼上理解有些误会
增加代码的同时,肯定要申请跟多的局部和全局变量么,这个没问题吧
因此pdata也罢,xdata也罢,就会出现不够的情况

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

编译结果显示代码量大概在155k左右(我们目前只用了128k flash装载代码,剩下的是文件系统用),
keil的优化功能已经挺厉害的了,至少把代码都装进去,但是内存可就不是那么好省的了
ydz0515 2009年06月15日
这还不简单?
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缺省处理。
phoenixmy 2009年06月15日
恩,暂时是按照这种方法处理的,但是使用内存的时候还是得很小心,否则一不小心就会导致pdata溢出,pdata_group也生成不出来
ydz0515 2009年06月16日
本帖最后由 ydz0515 于 2009-6-16 08:31 编辑

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

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

不必担心。
phoenixmy 2009年06月16日
貌似keil不认#pragma  large     ,一编译就报错,不知道咋回事
ydz0515 2009年06月16日
我用的好好的。8K的程序

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

必须放在程序第一条。
phoenixmy 2009年06月16日
很郁闷中
rebuild all返:
Target not created

没有任何error报告出来
孤独小行星 2011年03月26日
准备学习   看看!
erds 2011年12月09日
可以试试