搜索
bottom↓
回复: 14

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

[复制链接]

出0入0汤圆

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2008-6-26 08:16:55 | 显示全部楼层
数据没放到FLASH里?

出0入0汤圆

 楼主| 发表于 2008-6-26 08:22:39 | 显示全部楼层
肯定是放到FLASH里了,不会搞不清这个的。Mega128的RAM才4k,32768/1024=32k,这个RAM是放不下的。

出0入0汤圆

发表于 2008-6-26 08:31:00 | 显示全部楼层
试了下了,的确有这个问题,唉,没调查就乱发言,犯错误了:(


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

出0入0汤圆

发表于 2008-6-26 08:56:00 | 显示全部楼层
会不会是编译器的设置问题?

出0入0汤圆

 楼主| 发表于 2008-6-26 09:15:15 | 显示全部楼层
我也在想是不是设置问题,但是我不知道如何设置。我看看是不是make文件哪里可以设置。

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2008-6-26 11:26:00 | 显示全部楼层
楼上的是个方法,回去试试。但是最好还是能定义一个大于32767的数组。

出0入0汤圆

 楼主| 发表于 2008-6-26 12:40:54 | 显示全部楼层
没人知道吗?再顶上去。

出0入0汤圆

发表于 2008-6-26 15:47:32 | 显示全部楼层
如果可以保证RAM没被使用的话,用绝对指针访问来操作就可以连续访问了。

出0入0汤圆

 楼主| 发表于 2008-6-26 16:24:27 | 显示全部楼层
楼上kanprin 萧威,RAM肯定没有用作存数组。什么是绝对指针,那如何把图片的数据存到内部FLASH里呢,数据大小超过32767字节。

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2008-6-26 19:48:37 | 显示全部楼层
呵呵 看来定义这样的数组够麻烦。谢谢楼上yyccaa。改换其他编译器ICC或IAR不知道可不可以。

出0入0汤圆

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

出0入0汤圆

发表于 2013-4-1 17:33:41 | 显示全部楼层
lanshuitianxia 发表于 2008-6-26 08:22
肯定是放到FLASH里了,不会搞不清这个的。Mega128的RAM才4k,32768/1024=32k,这个RAM是放不下的。 ...

怎么把它放在FLASH里面,我也是用的128的单片机。需要串口接收一个1295个字节的数据,现在只能接收到255个,剩下的接收不到,应该怎么才能全部都接收到一个数组里呢。需不需要再添加什么库函数之类的,用c怎么实现呢、、、、急,拜托看到后请回。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 17:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表