搜索
bottom↓
回复: 6

求助: 请搞手指点,程序空间不够了, 这是否是IAR编译器的BUG?()

[复制链接]

出0入0汤圆

发表于 2014-4-18 14:04:04 | 显示全部楼层 |阅读模式
当我芯片选用 ATMEGA168PA时, iar(IAR EWAVR 5.51.0), 编译通过,  在链接时出错, 提示空间不足,如下图所示


于是我把芯片选择了管脚兼容的328P, 这时编译通过了, 如下图


然后问题来了:
编译器提示用了9858个字节, 很明显这并没有超出168pa的FLASH空间大写, 最少还有7K可用的, 难道是编译器的BUG?

我重复了以下过程: 当我去掉以下函数后(该函数单独编译,显示300多字节), 即使我再申请一个3K的FLASH数组,也不会报错,真心不懂了,下面
就是这个个引起错误的函数
//==============================================================================
//获取星期序数
UINT8 GetGregorianWeekDay(const CALENDAR_DATE* gc)//UINT16 gc_year, UINT8 gc_month, UINT8 gc_day)
{
        static __flash UINT8 month_adj[13]={0,6,2,2,5,0,3,5,1,4,6,2,4};

        INT16 Y,C,M,D;
        C = gc->year / 100;
        Y = gc->year % 100;   //gc_year -(gc_year/100)*100;
        M = month_adj[gc->month];        
        D = gc->day;
      
        UINT8 w = ( (Y/4) + (Y%7) - (2*(C%4)) + M + D)%7;
        return w;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

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

出0入0汤圆

 楼主| 发表于 2014-4-18 14:59:54 | 显示全部楼层
换了最新的IAR EWAVR 6.30还是一样结果

出0入0汤圆

发表于 2014-4-18 15:14:24 | 显示全部楼层
到底是數組大了
還是程序大了 ?
看看你的LST

出0入0汤圆

 楼主| 发表于 2014-4-18 15:32:41 | 显示全部楼层
本帖最后由 tomhe666 于 2014-4-18 15:36 编辑

从总数上看,程序空间是够的,我现在查到有一个函数编译后长度是769字节, 然后这个函数注释掉就可以, 还没搞清楚为什么, 似乎168PA没有长跳转指令?

修改: 刚才看了下, 168PA和328P的指令集是一样的,都有JMP 和 CALL指令, MEGA88PA这两条指令都无

出10入46汤圆

发表于 2014-4-19 09:33:48 | 显示全部楼层
static __flash UINT8 month_adj[13]={0,6,2,2,5,0,3,5,1,4,6,2,4};

UINT8 GetGregorianWeekDay(const CALENDAR_DATE* gc)//UINT16 gc_year, UINT8 gc_month, UINT8 gc_day)
{
     
        INT16 Y,C,M,D;
        C = gc->year / 100;
        Y = gc->year % 100;   //gc_year -(gc_year/100)*100;
        M = month_adj[gc->month];        
        D = gc->day;
      
        UINT8 w = ( (Y/4) + (Y%7) - (2*(C%4)) + M + D)%7;
        return w;
}

试下

出0入0汤圆

 楼主| 发表于 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多字节未使用

出10入46汤圆

发表于 2014-4-21 13:51:15 | 显示全部楼层
这种问题,编译的时候。 编译结果会提示的。
一般会提示XX 被填充。

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

本版积分规则

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

GMT+8, 2024-7-23 22:47

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

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