搜索
bottom↓
回复: 13

ICCAVR6.31 图像数据存放问题

[复制链接]

出0入0汤圆

发表于 2012-12-6 15:40:23 | 显示全部楼层 |阅读模式
本帖最后由 190008417 于 2012-12-6 15:43 编辑

使用ICCAVR6.31编译环境:
单片机:Atmega128
功能:将一幅图显示在LCD上。
图像数组定义为:
    unsigned char bmp[]={这里面是76800个图像点阵数据};
通过一个显示函数将bmp数组里的图像数据显示在 LCD上。
显示函数定义为void showBMP(unsigned char pic[]);
在MAIN程序里调用为showBMP(bmp);
编译时出现以下错误:

    iccavr -o icebox_test_system -LC:\icc\lib -g -ucrtatmega.o -bfunc_lit:0x8c.0x20000 -dram_end:0x10ff -bdata:0x100.0x10ff -dhwstk_size:16 -beeprom:1.4096 -fihx_coff -S2 @icebox_test_system.lk   -lstudio -lcatmega
want size 9653
lo 256 hi 4351 size 4096
!E <library>(177): area 'data' not large enough
C:\icc\bin\imakew.exe: Error code 1
Done: there are error(s). Exit code: 1

在网上查到错误信息解释为如下:

!E <library>(0): area 'bss' not large enough
want size 1024
lo 260 hi 767 size 508
错误分析:bss段是编译器存放全局数组和局部静态数组的地方。如果我们在编写程序时声明了过大的数组、或局部静态数组,就有可能看到这个提示。
解决方法:如果某些数组是常量,我们就可以增加const关键字,将其放到空间相对宽裕的FLASH中(例如段码表、字模等)。对于其他情况,就只有简化程序或者外扩SRAM存储器了。
!E <library>(101): area 'data' not large enough
错误分析:data段是编译器放置全局变量和静态局部变量的地方。如果我们声明了过多的全局变量和局部静态变量,就有可能看到这个提示。
解决方法:简化程序或者外扩SRAM存储器
我将unsigned char bmp[]={这里面是76800个图像点阵数据}修改为const unsigned char bmp[]={这里面是76800个图像点阵数据}后编译出现以下错误:
!E D:\AVR_PROGRAM\±ùÏä²âÊÔϵͳ\icebox_test_system\LT320240T.C(1210): type error in argument 5 to `ShowBMP'; found `pointer to const unsigned char' expected `pointer to unsigned char'
C:\icc\bin\imakew.exe: Error code 1
C:\icc\bin\imakew.exe: 'LT320240T.o' removed.
Done: there are error(s). Exit code: 1

是不是将字符串数组定义为CONST型后,就不能做为函数的参数了。请各位大侠帮我看一下。

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入96汤圆

发表于 2012-12-6 15:52:52 | 显示全部楼层
光用const是不起作用的,得组合使用
#pragma data:code  //将数组存储到rom中
//LED显示                           h a f b g c e d
const uchar  seg56[17]={0X77,0X14,0X5b,0X5d,0X3c,0X6d,0X6f,0X54,0X7F,0X7d,0X7E,0X2f,0X63,0X1f,0X6b,0X08,0};

#pragma data:data //返回ram定义!

出0入0汤圆

 楼主| 发表于 2012-12-6 16:08:28 | 显示全部楼层
gallle 发表于 2012-12-6 15:52
光用const是不起作用的,得组合使用
#pragma data:code  //将数组存储到rom中
//LED显示                           h a f b g c  ...


将数组修改为
#pragma data:code
    const unsigned char bmp[]={这里面是76800个图像点阵数据};
#pragma data:data
重新编译还是跟上次一样:


C:\icc\bin\imakew -f icebox_test_system.mak
    iccavr -c -IC:\icc\include\ -e -DATMEGA -DATMega128  -l -g -Mavr_enhanced  D:\AVR_PROGRAM\冰箱测试系统\icebox_test_system\LT320240T.C
!E D:\AVR_PROGRAM\冰箱测试系统\icebox_test_system\LT320240T.C(1211): type error in argument 5 to `ShowBMP'; found `pointer to const unsigned char' expected `pointer to unsigned char'
C:\icc\bin\imakew.exe: Error code 1
Done: there are error(s). Exit code: 1

“found `pointer to const unsigned char' expected `pointer to unsigned char' ”这条错误信息网上解释为:“ 就是有个带符号字符的指针内容是const,说明这个指针指向的内容不能被修改,而程序需要一个可以被修改内容的char *.原因可能是你传了字符串常量给函数  ”

     如果要将一个字符常量数组当做函数的参数来使用,请问要怎样操作?

出0入96汤圆

发表于 2012-12-6 16:18:11 | 显示全部楼层
修改程序吧,说的是你的指针溢出了,
你有76800个点,用char型,就是9600Byte。超出了你定义的指针范围了,
把数据分成几个部分试试,左上,左下,右上,右下试试。

出0入0汤圆

 楼主| 发表于 2012-12-6 16:24:16 | 显示全部楼层
gallle 发表于 2012-12-6 16:18
修改程序吧,说的是你的指针溢出了,
你有76800个点,用char型,就是9600Byte。超出了你定义的指针范围了, ...

char型,9600Byte是怎么算的呀?我定义的是CHAR型数组,就是说76800个点的数据是字符型的。

出0入0汤圆

发表于 2012-12-6 16:28:07 | 显示全部楼层
void showBMP(const unsigned char *pic);

出0入0汤圆

 楼主| 发表于 2012-12-6 16:31:53 | 显示全部楼层
first_blood 发表于 2012-12-6 16:28
void showBMP(const unsigned char *pic);

还是不对,修改后编译还是出现以下错误:C:\icc\bin\imakew -f icebox_test_system.mak
    iccavr -c -IC:\icc\include\ -e -DATMEGA -DATMega128  -l -g -Mavr_enhanced  D:\AVR_PROGRAM\冰箱测试系统\icebox_test_system\LT320240T.C
!E D:\AVR_PROGRAM\冰箱测试系统\icebox_test_system\LT320240T.C(1211): type error in argument 5 to `ShowBMP'; found `unsigned char' expected `pointer to unsigned char'
C:\icc\bin\imakew.exe: Error code 1
Done: there are error(s). Exit code: 1

出0入96汤圆

发表于 2012-12-6 17:34:47 | 显示全部楼层
您看看最开始的错误代码
want size 9653
lo 256 hi 4351 size 4096

你这个总共要定义9653个byte变量,但是系统的总大小只有4096个。
所以建议你将它挪到rom区。
但是9600个byte还是大,所以建议您分块。

出0入0汤圆

发表于 2012-12-6 18:05:31 | 显示全部楼层
void showBMP(const unsigned char *pic);
可以的,我这边就这样编译,没问题。你把整个文件都发上来

出0入0汤圆

发表于 2012-12-6 18:07:16 | 显示全部楼层
你这个数组定义在flash的,肯定是全局变量,在函数中直接引用即可,不用特意传个const的指针进来的

出0入0汤圆

发表于 2012-12-6 20:55:00 | 显示全部楼层
本帖最后由 qwermhb 于 2012-12-6 20:58 编辑

我来个解决办法,这是因为你的数组是在flash里面 ,但是的函数的形参却是在ram 里面,所以你要用const 修饰你的形参,例如ShowPicture(const uchar *p )

出0入0汤圆

发表于 2012-12-6 21:16:59 | 显示全部楼层
定义程const  然后在iccavr里设置勾选“Treat‘const’as‘——flash’”

出0入0汤圆

 楼主| 发表于 2012-12-7 08:45:39 | 显示全部楼层
qwermhb 发表于 2012-12-6 20:55
我来个解决办法,这是因为你的数组是在flash里面 ,但是的函数的形参却是在ram 里面,所以你要用const 修饰 ...

非常感谢,按照你的解决办法,现在可以正确编译了!

出0入0汤圆

 楼主| 发表于 2012-12-7 08:48:51 | 显示全部楼层
Garbage614 发表于 2012-12-6 21:16
定义程const  然后在iccavr里设置勾选“Treat‘const’as‘——flash’”

首先,感谢你的回复,这种方法我已经试过了,还是不能正确编译,要按照11楼的方法才能正确编译!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 05:27

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

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