AVR自动优化?为什么延时函数没法调用

[复制链接]
4511|15
 楼主| nicker88 发表于 2010-12-26 10:05 | 显示全部楼层 |阅读模式
void delay(unsigned int t)
{
unsigned int i;
for(i=0;i<t;i++)NOP();
}

main里面是这么调用的:
while(1)
{
  E(1);
  delay(2000);
  E(0);
  delay(2000);
}
我用的是ICC,这个延时在keil里没有问题,但是到icc就不行了,他进到第一个delay里面就出不了了,为什么,好像是跟icc的自动优化有关是吧?其实还有其他好多个函数也都是进去了就出不来,求指点。。。
STM32W108 发表于 2010-12-26 10:38 | 显示全部楼层
void delay(unsigned int t)
{
volatile unsigned int i;
for(i=0;i<t;i++)NOP();
}
 楼主| nicker88 发表于 2010-12-26 10:48 | 显示全部楼层
试了2楼那个,还是不行
 楼主| nicker88 发表于 2010-12-26 10:50 | 显示全部楼层
#include<iom128v.h>
#include<macros.h>

#define E(n) {PORTG=((PORTG&0XFB)^(n<<2));}

void delay(unsigned int t);

unsigned int temp;
unsigned int x;
void main()
{
DDRG=0xff;
DDRC=0xff;
while(1)
{
  E(1);
  delay(2000);
  E(0);
  delay(2000);
}
}

void delay(unsigned int t)
{
volatile unsigned int i;
for(i=0;i<t;i++)NOP();
}
这是完整程序
 楼主| nicker88 发表于 2010-12-26 11:08 | 显示全部楼层
好像不是自动优化的问题,icc优化选项我都没选
okay007 发表于 2010-12-26 11:22 | 显示全部楼层
开看门狗了吗?看门狗时间是多少?关掉试一下!
 楼主| nicker88 发表于 2010-12-26 11:51 | 显示全部楼层
6# okay007
看门狗关的。没有问题
 楼主| nicker88 发表于 2010-12-26 12:13 | 显示全部楼层
我用的是ICC 7.22 专业版,但是那2个自动优化选项我都没选啊
jt4117 发表于 2010-12-26 12:25 | 显示全部楼层
有可能是仿真时,程序跑的速度慢的缘故。 延时调短。 就试出来了。
sdwys 发表于 2010-12-26 15:35 | 显示全部楼层
看看汇编代码
 楼主| nicker88 发表于 2010-12-26 22:54 | 显示全部楼层
000000C9: delay
42:       void delay(unsigned int t)
+000000C9:   9722        SBIW    R28,0x02         Subtract immediate from word
45:        for(i=0;i<t;i++)NOP();
+000000CA:   2422        CLR     R2               Clear Register
+000000CB:   2433        CLR     R3               Clear Register
+000000CC:   8239        STD     Y+1,R3           Store indirect with displacement
+000000CD:   8228        STD     Y+0,R2           Store indirect with displacement
+000000CE:   C006        RJMP    PC+0x0007        Relative jump
45:        for(i=0;i<t;i++)NOP();
+000000CF:   0000        NOP                      No operation
45:        for(i=0;i<t;i++)NOP();
+000000D0:   8188        LDD     R24,Y+0          Load indirect with displacement
+000000D1:   8199        LDD     R25,Y+1          Load indirect with displacement
+000000D2:   9601        ADIW    R24,0x01         Add immediate to word
+000000D3:   8399        STD     Y+1,R25          Store indirect with displacement
+000000D4:   8388        STD     Y+0,R24          Store indirect with displacement
45:        for(i=0;i<t;i++)NOP();
+000000D5:   8028        LDD     R2,Y+0           Load indirect with displacement
+000000D6:   8039        LDD     R3,Y+1           Load indirect with displacement
+000000D7:   1620        CP      R2,R16           Compare
+000000D8:   0631        CPC     R3,R17           Compare with carry
+000000D9:   F3A8        BRCS    PC-0x0A          Branch if carry set
+000000DA:   9622        ADIW    R28,0x02         Add immediate to word
是不是有问题啊,怎么有几个标号45的
areshan 发表于 2010-12-27 09:27 | 显示全部楼层
那你把延时换成其他的写法吧,比如while(i--) nop();等等!!!!!!!
areshan 发表于 2010-12-27 09:29 | 显示全部楼层
ICC的编译器个人认为不太好用,有些不规范的写法它都不给提示!
 楼主| nicker88 发表于 2010-12-27 10:22 | 显示全部楼层
那你把延时换成其他的写法吧,比如while(i--) nop();等等!!!!!!!
areshan 发表于 2010-12-27 09:27

这个我试过了,还是一样
areshan 发表于 2010-12-27 12:00 | 显示全部楼层
估计是仿真的问题,你不程序烧到开发板是试试!比如delay函数后面加个点灯,看看能程序能不能跑到那里!
 楼主| nicker88 发表于 2010-12-27 21:34 | 显示全部楼层
15# areshan
单步仿真居然能通过,只不过有提示
AVR Simulator: Stack Overflow at 0x00b2
AVR Simulator: Stack Overflow at 0x00a8
每执行一次delay就一次提示,为什么啊,怎么可能溢出
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

98

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部