单片机C 程序中定义的数组字节过大该怎么办

Keil C程序编译如下:
MAIN.C(15): error C249: 'IDATA': SEGMENT TOO LARGE
Target not created
部分用到缓存数组的源程序如下:
unsigned char idata huancun[320];
tmp=~huancun[i*8+ia];
huancun[ia]<<=1;
if(huancun[ia+1]&0x80)
huancun[ia]++;
huancun[ia]<<=1;

第1个回答  2012-11-17
C51不允许对数组的大小作动态定义,即数组大小不依赖于程序运行。数组初始化的时候,大小必须已定义类型。这个在C++标准中有描述。const的变量不一定是已定义的,向你上面的const int m=n;需要看n时候在编译阶段是否是已定义的。数组下标最好不要用未知数据的变量。
第2个回答  2012-11-17
直接换个单片机 纠结什么呀 如果你时间充足 在考虑怎么优化程序
第3个回答  推荐于2016-09-11
变量的定义通常有可以定义在几个地方:
1、定义在普通的RAM中,这种方式是不用对变量进行额外说明的,就是普通的定义变量
2、定义在ROM中,不过通常这种变量通常以静态数据形式出现,如一张图片的数据,程序里通常不会修改这种变量中的值,只是读取值内容而已。
3、定义在扩展RAM中,但这要看你的单片机是否支持这样的扩展RAM,而且支持的大小是多少。
以STC12C5A32S2为例,常规RAM只有128个字节,但有1K的扩展RAM,32K的ROM,还有32K的EEPROM。通常在写比较大的程序时,那种需要修改的变量内容都尽可能的定义到扩展RAM中,即使这样因为一些基本的函数或变量交换,都还会浪费掉常规RAM的使用率。

定义在常规RAM变量的格式是:
数据类型或结构类型名 变量名;
如:char a;

定义在扩展RAM变量的格式是:
xdata 数据类型或结构类型名 变量名;

如:xdata char a;

定义在ROM变量的格式是:

code 数据类型或结构类型名 变量名;

如:code char a;

合理的应用常规RAM、扩展RAM和ROM是程序的关键,如果你觉得你的的程序已经算合理的安排了这些RAM和ROM之类的分配,任然不能满足你的程序需求,你就该考虑更换单片机机型或考虑用其他的东西来完成你的这种需求,如用ARM、Mips等,总之先确保软件的理念正常,然后检查实施过程无误,再考虑更换硬件方案。本回答被网友采纳

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

单片机 编译好的代码太大 烧写不进去 怎么办
程序的大小和生成的hex大小没关系。而是看你的code区占用了多少,你的单片机有多大的code区,另外内存通常是运行中存储数据的。比8k的flash大的单片机太多了。code代码区 data片内 xdata片外

keil中数组太大,编译出错,该怎么解决
如果是51单片机的话,因为RAM资源很小,所以要尽量节约每一个字节RAM,如果是常量数组就定义成常量,例如 code char datastr[2]={1,2};如果有外部RAM,则定义到XRAM中,例如:xdata char datastr[2];能用BIT就不要用char,能用char 就不要用Int。

单片机中c程序数据超过256怎么办
如果是的话,那就尽量把全局变量改成局部变量,布尔量尽量都都定义成bit,放到bdata区,不要用char型,尽量少用局部数组,用指针。还有个大绝招,就是地址复用,在定义了变量后,用_at_来定义其具体的地址,可以重复,但要注意重复的变量会不会同时使用到 ...

由于写的c51程序超出了128B,没有外部存储的设备,现想用idata,请教idata...
单片机C语言里以下几种存储空间:1 code 用来存储代码和常数,或者常数数组的,比如你程序定义的数组,如果不需要改动,即只是用来读取,不用赋值的,可以定义到code空间里,比如我们常用的7段数码管的显示数组,又或者NTC的表格,这些不需要改动,只用来读取的,定义到code里。2 data空间:单片机内部RAM的...

C语言定义一个C程序数组 长度为10的阶乘3628800 定义的时候一直显示数组...
一次申请不了那么多内存的。可以分开申请,比如分成20块,则原下标为x的数,现在用*(p[x\/(3628800\/20)] + x%(3628800\/20))即可 int *p[20], i, j;for(i = 0; i < 20; i++){ p[i] = (int*)malloc(sizeof(int) * 3628800\/20);for(j = 0; j < 3628800\/20; j++){ (p...

关于单片机RAM的问题,定义大数组导致程序不好使,STC52单片机
52单片机用户可以使用的RAM最大从08H~FFH,也就是说只有248Byte,如果使用STC单片机,有些有内部扩展RAM,如果打开的话,你的程序是没有问题的,不过得定义成XDATA,普通的52是不行的。

单片机c语言程序中,数组最多能有几个元素?为什么我定定义了一个全局的...
原则上,C语言中数组所包含的元素个数理论上多少都行,如果要开一个很大的数组,比如int arrayint[10000][10000];在main()中声明该数组就会使应用程序退出,但是如果你把该数组的声明放在所有函数体之外,让它变成一个全局变量,就没有任何限制了,你想开多大的数组都可以。但在单片机c语言程序中,...

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

51单片机中如何定义比较大的数组变量 比如 char[1024][10]
定义这种大的数组,你首先得有这么大的RAM才可以,不然肯定不好用。内部地址空间就别想了,肯定是放在外部。如果是常数数组,可以定义到代码里面,code char cc[1024][10],这种程序只能读,不能改,像字库点阵一般用这种。如果有足够的外部RAM,xdata char xx[1024][10]; 这是把数组定义到外部RAM...

相似回答