ICC7.15 中关于const和__flash关键字的实际测试
来源:潇洒一回
自从ICC V7被发现可以使用某著名的Loader破解工具一网打尽以来,不知不觉中ICC已经迎来了7.15版。
从官方的改进日志中,我们发现,从稳定的7.13A到7.15,ICC着重增加了对 64bits的double型数据类型的支持,增加并修订了针对8位操作的优化选项……总之,小打小闹不断。可惜自从7.14以来,不知道是什么原因,Loader破解的版本总会随机的自动关闭,让我一直心有余悸——万一哪天写代码时突然遭闪机……岂不是欲哭无泪?所以,不急于吃螃蟹的人,我还是推荐大家留着宝贵的7.13A,毕竟稳定才是硬道理。
在7.14的某个亚版中,开始将const关键字和flash关键字的概念进行分离——总的来说就是试图还const以ANSI-C所定义的本来面貌,这对ICC的用户来说,是一个不小的改动。官方声称,通过option中增加的一个选项'Treat 'const' as '__flash'来实现向下兼容。本以为这是一个体贴的设计,无奈,兼容毕竟不是等同,笔者进行测试时就碰了一鼻子灰。
首先,建立两个文件。Example.c和Example.h
在Example.c中加入
const unsigned char g_chArray[2][3];
const unsigned int g_wArraySize = sizeof(g_chArray) / sizeof(g_chArray[0]);
在Example.h中加入
extern const unsigned char g_chArray[][3];
extern const unsigned int g_wArraySize;
当其他.c文件饱含Example.h进行编译时,7.13A可以正常通过。7.15种,如果没有选择 Treat 'const' as '__flash'如果没有出现SRAM 'Data'区溢出,则通常能正常通过(这是当然的,因为此时,数组合变量其实都占用着SRAM空间),如果选择了 Treat 'const' as '__flash' 噩梦从此开始。
无论如何,系统总是会爆出如下的错误:
const object 'g_wArraySize' has no initialized value
怪异吧?似乎是extern对__flash关键字修饰的变量不起作用?
为了验证自己的想法,修改程序如下:
1、首先去掉Treat 'const' as '__flash'选项前面的勾勾。
2、修改程序为:
Example.c
--------------------------------------
__flash unsigned char g_chArray[2][3];
const unsigned int g_wArraySize = sizeof(g_chArray) / sizeof(g_chArray[0]);
Example.h
--------------------------------------
extern __flash unsigned char g_chArray[][3];
extern const unsigned int g_wArraySize;
问题总算是被蒙混过去了。可是,我们牺牲了一个SRAM空间来保存const型变量……真是不爽阿……
extern 看来对 __flash型变量真的 不买账……期待官方的进一步改进。
在ICC下如何才能将指针数组的初始化内容放进flash空间
在ICC下如何才能将指针数组的初始化内容放进flash空间,我想把数组初始化内容放入flash空间,但在前面加const只是限定了array[n]指向了flash空间,而初始化的内容确在RAM里,去掉const 就能正确指到了RAM里初始化的内容,想问各位大虾如何限定初始化的内容放入flash空间。
你这个问题好像是const导致的。7.16里面const型的变量也是放在SRAM中的,你需要在Option选项卡里面
选择 Treat 'const' as '__flash'
请教一则关于const 在ICC中的使用
请教一则关于const 在ICC中的使用
我想定义一个字符串放在的一确定地址,使用const 时,ICC编译器好象不能指定地址,请问大家有什么办法吗?
可以指定地址的,这样试试
#pragma abs_address: 地址值
const unsigned a[10];
#pragma end_abs_address
阅读(3939) | 评论(0) | 转发(0) |