Chinaunix首页 | 论坛 | 博客
  • 博客访问: 962661
  • 博文数量: 175
  • 博客积分: 2788
  • 博客等级: 少校
  • 技术积分: 2060
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-25 12:25
个人简介

知之者不如好之,好之者不如乐之

文章分类

全部博文(175)

文章存档

2016年(1)

2015年(20)

2014年(8)

2013年(68)

2012年(16)

2011年(35)

2010年(1)

2008年(26)

分类: IT业界

2012-04-17 19:51:04

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) |
给主人留下些什么吧!~~