IAR变量绝对定位问题~~~~~~~
在IAR for msp430里:
在一个.c文件里定义:
__no_init char array1[100]@0x2000;
其它文件要引用这个全局数组,怎么做?
在相应的.h文件里声明:
extern __no_init char array1[]; //这样是不行的!!!
(这声明在IAR FOR A V R是可以的!!!)
在两个IDE里,如果在.c这样定义:
#prmaga location="meseg"
__no_init char array1[100];
在相应的.h文件里就可以这样声明:
extern __no_init char array1[]; //这样是是行的!!!
烦人,都是IAR的,搞得如此复杂。。。
(我们一种产品,有两款型号,一种用M128,一种用MSP430F5418)
在iar for msp430里,用了@这个符号后,extern这个关键字好象失去作用了。。。
最后只得用这种办法定义声明用@定位的全局变量:类似系统的头文件,比如"msp430x54x.h"那样建一个专用的.h文件,在这个.h文件里定义变量,
注意:是在.h里定义变量,而不仅仅是声明!如:
mypub.h文件:
__no_init char a@0x1500;
__no_init int b@0x1510;
.......
然后要用到的地方引用这个.h文件,不要当心,编译会通过的,哈哈,打破了c的常规了,就是这个@做鬼。。。。
[解决办法]
我用的是IAR,不过是For ARM
我的使用方法,调试通过,仅供参考:
1、在 xxx.h 文件中:
__no_init char a @0x20000000;
2、在需要使用此变量的 xxx.c 文件中直接 include "xxx.h"
个人认为,绝对定址并是像我们的变量声明,需要编译器去分配空间,而更像define一个符号而已,当然这个地址绝对不能放到xcl文件中描述的堆栈空间中