打印
[AVR单片机]

ATtiny13A 一条寄存器配置语句导致代码巨大

[复制链接]
1559|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
weibestww|  楼主 | 2013-11-29 17:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
紧急求助!
本人使用gcc +avrstudio 开发ATtiny13A 芯片,遇到奇怪问题,当代码如下时:
while(1)
{      
  read_nADCs_reault(&ADC_count_total,NUM_ADCs);
        ADC_count_total = ADC_count_total>>2;
        curr_percent  -= (ADC_count_total-DES_ADC)*0.6;
  if(curr_percent >100)
  {
            curr_percent = 100;
  }
     if(curr_percent < 0)
  {
            curr_percent = 0;
  }
        curr_percent = curr_percent*0.256;
}
编出出来结果是:
AVR Memory Usage
----------------
Device: attiny13a
Program:     298 bytes (29.1% Full)
(.text + .data + .bootloader)
Data:         10 bytes (15.6% Full)
(.data + .bss + .noinit)


但是当在上述代码if 语句内加入一条寄存器配置的语句时 如
if(curr_percent >100)
  {
            curr_percent = 100;
            PORTB |= 1<<4;
  }
这种情况出现:
Program:    3692 bytes (360.5% Full)
(.text + .data + .bootloader)

Data:        274 bytes (428.1% Full)
(.data + .bss + .noinit)
程序和数据全部超出范围

另外如果在最后一句加入OCR0A = curr_percent;时同样会出现编译之后代码超出非常多的情况,那位遇到过或者知道怎么解决,请赐教!!非常感激!!

相关帖子

沙发
huangxz| | 2013-11-29 23:12 | 只看该作者
这是典型的gcc高度优化引起的。只要对物理寄存器操作,这段代码就不会被优化掉,楼主其实芯片已经不够用了。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
weibestww + 3 20
板凳
l4157| | 2013-11-30 11:39 | 只看该作者
MGD,ATtiny13这种1K程序的芯片用浮点数?还是改一下算法吧!

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
weibestww + 3
地板
weibestww|  楼主 | 2013-12-2 13:21 | 只看该作者
两位指点的对,浮点数改掉之后代码就正常了,多谢!

使用特权

评论回复
5
qin552011373| | 2013-12-2 14:29 | 只看该作者
建议不要在AVR系列的上面运行浮点运算,可以改成先整成,再除以或者移位运算,avr没有硬件乘法或者除法器的

使用特权

评论回复
6
qin552011373| | 2013-12-2 14:30 | 只看该作者
楼主的问题既然解决了,可以结贴散分咯

使用特权

评论回复
7
么么沫沫| | 2013-12-2 15:14 | 只看该作者

使用特权

评论回复
8
weibestww|  楼主 | 2013-12-2 16:46 | 只看该作者
无法结贴,什么情况???

使用特权

评论回复
9
tarzar| | 2013-12-4 11:07 | 只看该作者
avr只有硬件乘法器,除法只能用右移了

使用特权

评论回复
10
qin552011373| | 2013-12-6 08:48 | 只看该作者
weibestww 发表于 2013-12-2 16:46
无法结贴,什么情况???

现在可以了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

52

帖子

1

粉丝