lanshuitianxia 发表于 2008-6-26 08:15:36

AVR Studio4.13+winavr编译大的数组问题,32768不可以32767就可以,如何解决超大数组

昨天编写TFT液晶的程序,单片机是Mega128,要显示一个静态图片,图片大小为128x128,经过取模软件取模后生成大小为32768的数组。但是编译时编译器提醒“array is too large”。后我把数组大小改为32767就能编译通过,图片在液晶上显示正常。难道WINAVR只支持最大到2^15-1的数组?
请教如何设置可以让编译器支持大于32767的数组,本来还想显示个120*160的图片的,不知道行不行了。keil c51到可以编译超大数组。

andyjuly 发表于 2008-6-26 08:16:55

数据没放到FLASH里?

lanshuitianxia 发表于 2008-6-26 08:22:39

肯定是放到FLASH里了,不会搞不清这个的。Mega128的RAM才4k,32768/1024=32k,这个RAM是放不下的。

andyjuly 发表于 2008-6-26 08:31:00

试了下了,的确有这个问题,唉,没调查就乱发言,犯错误了:(./emotion/em071.gif


********************************************************************
在ICC7.16A里又试了下,没有这个问题,编译通过了。

ywl0409 发表于 2008-6-26 08:56:00

会不会是编译器的设置问题?

lanshuitianxia 发表于 2008-6-26 09:15:15

我也在想是不是设置问题,但是我不知道如何设置。我看看是不是make文件哪里可以设置。

314forever 发表于 2008-6-26 09:36:44

你把一个32768的数组拆成两个,在文件中连续定义,这样在编译后两个数组在Flash空间中是连续放置的,然后用一个指针指向第一个数组的首地址,访问数据时可以无视数组的大小。比如用两个16384的数组存放32768个数据,*data指向第一个数组的其实地址,然后32768个数据可以这样访问*(data + add),add范围是0-32767。

lanshuitianxia 发表于 2008-6-26 11:26:00

楼上的是个方法,回去试试。但是最好还是能定义一个大于32767的数组。

lanshuitianxia 发表于 2008-6-26 12:40:54

没人知道吗?再顶上去。

kanprin 发表于 2008-6-26 15:47:32

如果可以保证RAM没被使用的话,用绝对指针访问来操作就可以连续访问了。

lanshuitianxia 发表于 2008-6-26 16:24:27

楼上kanprin 萧威,RAM肯定没有用作存数组。什么是绝对指针,那如何把图片的数据存到内部FLASH里呢,数据大小超过32767字节。

yyccaa 发表于 2008-6-26 17:53:03

目前avrgcc是有这个限制,准确的说是单个类型对象不能超过32k(所以不能通过多维数组、结构体来回避)。
如果要连续的32k以上的数据空间,还是得拆成多个32k以下的对象,然后通过段限定,设定每个对象在存储器中的绝对定位,使它们连续存储。如果觉得数组大小可能以后还变化,计算会比较麻烦,就要自定义链接脚本,可以不用计算空间分配了。

lanshuitianxia 发表于 2008-6-26 19:48:37

呵呵 看来定义这样的数组够麻烦。谢谢楼上yyccaa。改换其他编译器ICC或IAR不知道可不可以。

lanshuitianxia 发表于 2008-6-26 21:46:13

6楼的方法试过了,可以使用的。我把原来一个38400大的数组分成两个分别小于32767的数组(其实大概各19200大小左右),将这两个数组放在一个头文件中,直接调用第一个数组,然后调用的时候指针增加38400次(呵呵,其实已经越界了,跑到第二个数组中去了)。就这样一个120x160的图片显示正常了。这个确实比较麻烦。不过TFT图片狂耗FLASH,一个128也放不了一整张320x240的TFT图片。不过如果用数据压缩算法可能可以,毕竟有好多连续的地方颜色是一样的。

sqjh1988 发表于 2013-4-1 17:33:41

lanshuitianxia 发表于 2008-6-26 08:22 static/image/common/back.gif
肯定是放到FLASH里了,不会搞不清这个的。Mega128的RAM才4k,32768/1024=32k,这个RAM是放不下的。 ...

怎么把它放在FLASH里面,我也是用的128的单片机。需要串口接收一个1295个字节的数据,现在只能接收到255个,剩下的接收不到,应该怎么才能全部都接收到一个数组里呢。需不需要再添加什么库函数之类的,用c怎么实现呢、、、、急,拜托看到后请回。。。。
页: [1]
查看完整版本: AVR Studio4.13+winavr编译大的数组问题,32768不可以32767就可以,如何解决超大数组