单片机 keil c 关于 data段超出的问题

我编了一段比较大的程序,code段够用,但是data段不够用,更改存储模式后发现data+xdata段=210;我用的是at89s51,data段128,这是不够用的,但是我在keil里更换了仿真芯片为at89s52的时候,为什么还是说我data段超出了范围?这是为什么。。s52不是data区256的吗

楼主:是这样的
xdata是不包括在256的,是单片机有XDATA才能调用。
258是包括DATA和IDATA;分别对应低128和高128。追问

MAIN.C(451): error C249: 'DATA': SEGMENT TOO LARGE,用的是达盛的仿真芯片,仿真的是at89s51/52,这是在small模式下的出错提示,如果调成large: Program Size: data=10.1 xdata=202 code=4187,可是最终我要实际的烧在真的芯片里面运行的,而且不加任何外部存储器,这咋整。。
那我可以直接把变量存在高128中吗?s51有idata吗?只有s52有吗?比如我吧一个变量这么定义
unsigned char idata i ;

追答

1,只能在small模式下,否则在单片机跑不起来!
2,AT89S51不存在XDADA,你把所有定义成XDATA局部和全局变量修改为IDATA就可以了!·

追问

也就是说我这种定义变量到idata的方式是可以的?能在small下跑起来,能否在真实at89s52芯片中烧制并运行吗?

有没有这样一种可能,就是2个cpu一起驱动同一个模块,比如说两个cpu一个接led点阵一个接语音isd1700,然后两个cpu都接同一个7279和键盘,让7279同时给2个cpu传输数据,然后2个cpu分别跑程序,程序7279以及其他部分相同,只是一个有led模块的程序,一个有语音模块的程序,让这两个cpu合力完成这个系统?

追答

1,可以at89s52芯片中烧制并运行。
2,可以的,一个KEYBOARD接两个CPU是可以的,但是地是要连接在一起的!

追问

这没事,我们2个51板子单独供电,我们一开始试出来,但是后来失败了,我们再调调

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-03-20
贴完整的出错提示。
另外s52的idata区才是256。高128字节SRAM只能间接寻址访问的。追问

MAIN.C(451): error C249: 'DATA': SEGMENT TOO LARGE,用的是达盛的仿真芯片,仿真的是at89s51/52,这是在small模式下的出错提示,如果调成large: Program Size: data=10.1 xdata=202 code=4187,可是最终我要实际的烧在真的芯片里面运行的,而且不加任何外部存储器,这咋整。。那我可以直接把变量存在高128中吗?s51有idata吗?只有s52有吗?比如我吧一个变量这么定义
unsigned char idata i ;

第2个回答  2013-01-18
http://zhidao.baidu.com/question/327195991.html
定义的时候加一个unsigned char code .......我加了一个code就可以了

单片机 keil c 关于 data段超出的问题
xdata是不包括在256的,是单片机有XDATA才能调用。258是包括DATA和IDATA;分别对应低128和高128。

用Keil编译程序时数据段过长怎么办?
程序DATA区空间已超过指定单片机的DATA区空间,可以用keil C编译的时候压缩。优化代码大小步骤 第一步:project >> Option for Target “**” 打开如图 2界面。选择“target”,勾选上“Use MicroLIB”再编译。分析:microLIB是缺省的C库,而且microLIB进行了高度优化。如果不勾选“Use MicroLIB”,keil...

Keil C程序中定义的一维数组字节过大该怎么办?
楼上则正解 做单片机的话, 还是必须要了解一下其存储结构, 最起码得知道data idata xdata所指的存储区域 idata 指向的片内ram ,大小范围为256字节,所以你一个数组定义在idata段内,不能超过256字节,超过就会报错。xdata指向的片外ram,大小范围为64KB,你可以将你需要的大容量数组定义在该段内。

keil链接时data字段被超
data超出了就应当分配到idata中。

我用KEIL软件 提示我 data segment too large 我该怎么修改
int random_array[10][10][10];这个全局数组需要占用2000字节的空间,而默认的存储区域中只有128字节。你需要了解一下51平台相关基础知识,不要以为单片机有计算机那么多的资源。

单片机keil编译出错ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT,请 ...
Flash\/ROM前者是4kB,后者是8kB。至于其它区别,则取决于厂家和系列设计。如果是同厂家同系列则无其它区别。上面的data指的是片内的RAM还是片外的RAM?它们分别应该是多少?另外code空间多大?提示是说idata段溢出。这是片内的RAM,即内部寻址空间256字节。code空间上面已经说了,52是8kB。用人说C52比...

关于keil中的data和xdata 问题
“我用的单片机有512字节的空间”即使有额外的SRAM,一般也需要设置寄存器打开的。而且只扩256字节的型号一般映射到页内空间,需通过MOVX与@Ri访问。所以你可以试试PDATA方式。“我的程序中的变量超过114字节就编译不通过了”应当将部分变量分配到内部间接寻址区,如下:unsigned char idata ucMyVariable;...

'DATA 'SEGMENT TOO LARGE
当用C语言写单片机程序,编译过程中出现“DATA segment too large”的编译错误时,是因为128字节的数据空间已经用完了,如果是只读不写的数组的话,可以在数组前面加上code,编译错误就会消失。例如:code unsigned int p3data[49]={0x00,0x19,0x01,0x1a,0x02,0x1b,0x03,0x1c,0x04,0x1d,0x05,...

请问keil中编译后的Program Size:data xdata code上限是多少_百度知 ...
code只和硬件有关,不能超过你ROM总量,你的ROM总量一般最多是64KB,如果在项目选好芯片,如果超出会提示的。使用keil的code banking功能可以超过64KB,但没有验证过最大值。data和你的最大嵌套层级有关,计算时注意考虑中断嵌套,排除嵌套需要保留的堆栈就是你的最大data,你的芯片RAM如果只有128B,...

关于keil中的data和x
当你编写程序时,如果发现变量超过114字节,可能会遇到编译错误。这是因为单片机的内存空间有限,不能容纳过多的全局变量。为解决这个问题,可以考虑将部分变量移动到内部间接寻址区,如这样定义:unsigned char idata ucMyVariable;这样做可以优化内存使用,确保程序能够在单片机的内存限制下顺利编译和运行。记得...

相似回答