|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2014-4-19 12:43:26
|
显示全部楼层
gonboy 发表于 2014-4-19 09:33
static __flash UINT8 month_adj[13]={0,6,2,2,5,0,3,5,1,4,6,2,4};
UINT8 GetGregorianWeekDay(const CAL ...
和这个没有关系了,现在已经解决, 我不好说这是不是编译器的一个BUG, 出错的原因是因为我使用绝对定位的方式在0x1FFF处放置了一个FLASH变量:
__root __flash UINT8 OSCCAL_VALUE @ 0x1FFF = 0xFF;
这个变量用来给编程器放置RC校准值用的,因为最开始用的mega88PA,所以放在此位置,后来程序空间不够了,改成mega168PA,但是这个定位的位置忘了改了.
可能是某个函数比较长, 编译器链接时, 这个位置放不下这个长函数,然后报错了, 但是, 我的整个程序只有9K多的空间, 而mega168PA是16K, 所以事实上
从0x2000开始还有很多空间没用上, 而编译器给的提示来看,从0x2000-0x2FdF他作为保留空间, 而没有使用, 所以程序只有9K, 但却不能放在16K的空间里了
, 当换了328P编译后, 他又重新从0x4000处开始放置程序, 所以能编译通过.
所以现在有一个结论, 当你使用绝对定位在程序空间中某处放置一个变量时,IAR编译器有可能会把他附近的一片连续空间作为保留, 规则是什么,还没搞清规则律
, 有可能会导致大量空闲的程序空间不能使用, 而导致因空间不足而报错, 我这个程序实际上最后编完成只用了9958字节, 就是因为1FFF处有个变量而导致空间
不足报错. 事实上从0x2000开始还有约6000多字节未使用
|
|