搜索
bottom↓
回复: 30

ICCAVR7.16A 关于const指令的疑问

[复制链接]

出0入0汤圆

发表于 2010-1-6 12:54:04 | 显示全部楼层 |阅读模式
ICCAVR中用const指令定义FLASH常量,保存在FLASH中。
比如:const unsigned char font6x8[][6]={......};
原理上常量数据大小只受FLASH大小限制,与RAM大小无关。

但在实际使用中我发现,在M16的FLASH区用
const unsigned char font12x12[][24]={......};
定义一个大于1024字节的字库时,编译不通过。
提示:
!E <library>(31): area 'data' not large enough
want size 1128
lo 96 hi 1119 size 1024
Done: there are error(s). Exit code: 1. Wed Jan 06 12:27:28 2010

请教高手解答该问题。

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

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

出0入0汤圆

 楼主| 发表于 2010-1-6 13:00:03 | 显示全部楼层
下面附上ICCAVR7.16A软件

ICCAVR7.16Aourdev_523343.rar(文件大小:8.97M) (原文件名:iccavrv7.16a.rar)

出0入296汤圆

发表于 2010-1-6 13:01:47 | 显示全部楼层
把const改为__flash

出0入0汤圆

 楼主| 发表于 2010-1-6 13:12:01 | 显示全部楼层
改成flash后果然编译通过了,谢谢!

出0入0汤圆

 楼主| 发表于 2010-1-6 22:15:56 | 显示全部楼层
将ICCAVR编译设置里的“treat 'const' as '_flash'”打勾就OK了。

出0入0汤圆

发表于 2010-1-6 22:23:11 | 显示全部楼层
如果我的一个函数
void UART0_TransmitString(const unsigned char *pointer)
{
        while((*pointer)!='\0')
        {
                USART0_Send_Byte(*(pointer++));
        }
}
调用时UART0_TransmitString("Get");
在treat 'const' as '_flash'选中的情况下
为什么编译通不过呢?

难道非要先定义一个const数组,然后在函数中调用这个数组的指针才可以吗?

出0入0汤圆

发表于 2010-1-6 22:25:10 | 显示全部楼层
编译时说字符串的指针与函数参数的指针类型不一样

出0入0汤圆

发表于 2010-1-8 21:10:00 | 显示全部楼层
请教“傻孩子”
__flash 和const有什么不同呢?
const我理解的意思是把数据保存到flash中。
__flash呢?

出0入0汤圆

发表于 2010-1-10 00:49:20 | 显示全部楼层
同问,有什么不同呢?

出0入0汤圆

发表于 2010-1-10 07:30:09 | 显示全部楼层
同问,区别?感兴趣……

出0入4汤圆

发表于 2010-1-10 10:58:59 | 显示全部楼层
看来"const==把数据保存到flash" 害人不浅呀!

出0入0汤圆

发表于 2010-1-10 23:21:52 | 显示全部楼层
楼上能详细说说吗?

出0入0汤圆

发表于 2010-1-10 23:31:55 | 显示全部楼层
感兴趣……

出0入4汤圆

发表于 2010-1-11 00:37:44 | 显示全部楼层
const是标准C语言的一个关键字,它限定一个变量不允许被改变。核心是:不允许被改变!
更常见的用法就是用它来修饰常量(通常是多个, 如数组),仅被const修饰的数组一般是位于RAM区的。
某些编译平台(如IAR for MSP430)对标准C的const进行扩展,在该平台内编译的代码,其中的const功能是将它所修饰的常量置于flash区。
平台变了就不能这么用了。
关于const修饰指针之类的,就请自己放狗吧。

__flash不是标准C的关键字,是ICCAVR的扩展,即ICCAVR自定义关键字。
不知道有没有说错。

出0入0汤圆

发表于 2010-1-11 01:14:11 | 显示全部楼层
const在ICCAVR里面不是放到flash区吗???
如果就是一般的不变,那和volatile有什么区别?

出0入4汤圆

发表于 2010-1-11 01:44:07 | 显示全部楼层
const的比喻: 你摆了些不能用手碰的东东在外面,这时候2个小朋友走过来要动,你大喝一声: 眼看手不动,只许看,不许动!   
可怜2个小家伙被你吓的尿了一裤子,哪里还敢动?!
volatile的比喻: 话说你外甥留了一张他的地址便条给你,并且跟你说: 如果有人要找他就叫他按便条上的地址去找。
某天王麻子找你外甥办事,按照你给他的地址找过去,谁知你外甥搬走了,没找着。   没找着当然不行,怎么办? 打电话(加volatile)呗,一下就问到地址了。
不用volatile就是到你这里看便条上的地址; 用volatile就是不到你这里看地址,每次直接打电话给你外甥问地址--谁叫他总是搬家?! 呵呵。

比喻不是很恰当,但可以看出:上两者完全不搭界。

出0入0汤圆

发表于 2010-1-11 05:22:31 | 显示全部楼层
明白!谢谢sunliezhi!

出0入0汤圆

发表于 2010-1-11 12:32:36 | 显示全部楼层
谢谢sunliezhi!

出0入0汤圆

发表于 2010-2-6 15:46:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-2-6 18:40:19 | 显示全部楼层
回复【6楼】mingyuexin1981
如果我的一个函数
void UART0_TransmitString(const unsigned char *pointer)
{
while((*pointer)!='\0')
{
USART0_Send_Byte(*(pointer++));
}
}
调用时UART0_TransmitString("Get");
在treat 'const' as '_flash'选中的情况下
为什么编译通不过呢?
难道非要先定义一个const数组,然后在函数中调用这个数组的指针才可以吗?
-----------------------------------------------------------------------
编译选项:Project/Option/Target/"Strings in flash only" 也要选上才行。

出0入0汤圆

发表于 2010-4-8 21:59:56 | 显示全部楼层
受益了,呵呵,谢谢各位的意见

出0入0汤圆

发表于 2010-8-2 15:53:53 | 显示全部楼层
受益了,呵呵,谢谢各位的意见

出0入0汤圆

发表于 2010-9-13 10:36:51 | 显示全部楼层
恩 呵呵   用mega128的时候  由于ram 比较大  到今天才发现这个问题,const直接用的时候 默认编译时是放到ram中的 ,导致编译数据超过了ram的范围,后来在Project/Option/Compiler/Treat 'const' as _flash 勾上  就不会出现问题了

另外以前打印一个字符串的时候,用函数是也必须输入const类型的参数,这样用的时候就必须写上2个 如LCD_Print(const uchar s)
LCD_Print(uchar s),否则编译不会通过。一个是打印ram中的 一个是打印flash中的,这样就觉得比较麻烦 。也不知道有没有比较好的解决方案,Keil里面  好像没有这么严格
也谢谢【20楼】 shark     Project/Option/Target/"Strings in flash only"的提示

出0入0汤圆

发表于 2010-9-28 23:51:27 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-9-29 06:28:32 | 显示全部楼层
"const是标准C语言的一个关键字,它限定一个变量不允许被改变。核心是:不允许被改变! "

more precisely, a variable declared "const" means that you cannot write to it. "const" declaration by itself does not imply any storage class (flash vs. ram for example).

however, most compilers will treat a "const" declared variable in flash.

But there are exceptions to that, as you are find out here in ICC, as well as Keil C51 where you have to declare a const variable "code" to force it to be stored in flash.

again, the surest bet is to read the compiler manual.

出0入0汤圆

发表于 2010-9-29 07:54:34 | 显示全部楼层
受教了!!!

出0入0汤圆

发表于 2010-9-29 08:10:46 | 显示全部楼层
6.X版本是放在FLASH中的。
7.X改了_FLASH关键字。

出0入0汤圆

发表于 2013-3-22 18:07:45 | 显示全部楼层
傻孩子大虾果然猛啊,弄了很久没弄好,改成__flash 就好了

出0入0汤圆

发表于 2013-7-7 21:45:19 | 显示全部楼层
改成volatile也可以,我刚刚试过来!

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 00:25

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

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