有人碰到过keil c51里的pdata_group问题没有?
2009年06月08日 18:59 发布者:phoenixmy
不知道怎么回事,pdata_group好像被限制到了0x80左右大小,稍微加点代码变量之类的就会报告溢出请问这是怎么回事?
按道理讲应该能达到0xff才对啊
网友评论
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
回复二楼,我在启动文件中看到的是:
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)
;
最好把相关程序贴上来,我帮你实验一下。
修改这几条:其他不动。
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,可能就不一样了。
我没试过。可以试试。
要是片内pdata,可能就不一样了。
我没试过。可以试试。
phoenixmy 2009年06月12日
先谢谢楼上,的确是片内ram,目前的困扰是,片上flash比较大,260k的容量,因此想尽可能多的放代码进去,结果pdata就溢出了,楼上有没有节省ram的好方法?
先谢谢楼上,的确是片内ram,目前的困扰是,片上flash比较大,260k的容量,因此想尽可能多的放代码进去,结果pdata就溢出了,楼上有没有节省ram的好方法?
hotpower 2009年06月12日
用位
用位
老郭 2009年06月12日
这个问题好。phoenixmy可以得一本书了吧,菜农兄?
这个问题好。phoenixmy可以得一本书了吧,菜农兄?
hotpower 2009年06月13日
哈哈~~~这个问题很怪异~~~俺真没遇到过~~~
估计法国本部的老外就脑浆~~~
哈哈~~~这个问题很怪异~~~俺真没遇到过~~~
估计法国本部的老外就脑浆~~~
ydz0515 2009年06月13日
“因此想尽可能多的放代码进去,结果pdata就溢出了,楼上有没有节省ram的好方法?”
pdata怎么是放代码的?是 Xdata里的一部分。
“因此想尽可能多的放代码进去,结果pdata就溢出了,楼上有没有节省ram的好方法?”
pdata怎么是放代码的?是 Xdata里的一部分。
phoenixmy 2009年06月14日
可能我说的不清楚,楼上理解有些误会
增加代码的同时,肯定要申请跟多的局部和全局变量么,这个没问题吧
因此pdata也罢,xdata也罢,就会出现不够的情况
目前这个芯片有260K的flash,可能按普通开发来说的话,空间肯定够用
但是目前需要增加尽可能多的功能进去,因此代码量可能有些达到极限了
头痛的地方就在这里
编译结果显示代码量大概在155k左右(我们目前只用了128k flash装载代码,剩下的是文件系统用),
keil的优化功能已经挺厉害的了,至少把代码都装进去,但是内存可就不是那么好省的了
可能我说的不清楚,楼上理解有些误会
增加代码的同时,肯定要申请跟多的局部和全局变量么,这个没问题吧
因此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缺省处理。
这还不简单?
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也生成不出来
恩,暂时是按照这种方法处理的,但是使用内存的时候还是得很小心,否则一不小心就会导致pdata溢出,pdata_group也生成不出来
ydz0515 2009年06月16日
本帖最后由 ydz0515 于 2009-6-16 08:31 编辑
那就 #pragma large // 或者 #pragma small
缺省使用xdata/data 区,不用pdata 区好了。
不必担心。
本帖最后由 ydz0515 于 2009-6-16 08:31 编辑
那就 #pragma large // 或者 #pragma small
缺省使用xdata/data 区,不用pdata 区好了。
不必担心。
phoenixmy 2009年06月16日
貌似keil不认#pragma large ,一编译就报错,不知道咋回事
貌似keil不认#pragma large ,一编译就报错,不知道咋回事
ydz0515 2009年06月16日
我用的好好的。8K的程序
#pragma large
#include
#include
......
必须放在程序第一条。
我用的好好的。8K的程序
#pragma large
#include
#include
......
必须放在程序第一条。
phoenixmy 2009年06月16日
很郁闷中
rebuild all返:
Target not created
没有任何error报告出来
很郁闷中
rebuild all返:
Target not created
没有任何error报告出来
孤独小行星 2011年03月26日
准备学习 看看!
准备学习 看看!
erds 2011年12月09日
可以试试
可以试试
2个原因:
1、要使pdata有效,必须在COMPACT编译模式下。
2、需要修改STARTUP.A51文件中的相关条目。(改了吗?)
3、填写BL51 LOCATA下的PDATA项。
4、干脆什么都不动,程序中修改P2=XXXX; 就行了。