打印

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

[复制链接]
3078|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();
}
这是完整程序

使用特权

评论回复
5
nicker88|  楼主 | 2010-12-26 11:08 | 只看该作者
好像不是自动优化的问题,icc优化选项我都没选

使用特权

评论回复
6
okay007| | 2010-12-26 11:22 | 只看该作者
开看门狗了吗?看门狗时间是多少?关掉试一下!

使用特权

评论回复
7
nicker88|  楼主 | 2010-12-26 11:51 | 只看该作者
6# okay007
看门狗关的。没有问题

使用特权

评论回复
8
nicker88|  楼主 | 2010-12-26 12:13 | 只看该作者
我用的是ICC 7.22 专业版,但是那2个自动优化选项我都没选啊

使用特权

评论回复
9
jt4117| | 2010-12-26 12:25 | 只看该作者
有可能是仿真时,程序跑的速度慢的缘故。 延时调短。 就试出来了。

使用特权

评论回复
10
sdwys| | 2010-12-26 15:35 | 只看该作者
看看汇编代码

使用特权

评论回复
11
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的

使用特权

评论回复
12
areshan| | 2010-12-27 09:27 | 只看该作者
那你把延时换成其他的写法吧,比如while(i--) nop();等等!!!!!!!

使用特权

评论回复
13
areshan| | 2010-12-27 09:29 | 只看该作者
ICC的编译器个人认为不太好用,有些不规范的写法它都不给提示!

使用特权

评论回复
14
nicker88|  楼主 | 2010-12-27 10:22 | 只看该作者
那你把延时换成其他的写法吧,比如while(i--) nop();等等!!!!!!!
areshan 发表于 2010-12-27 09:27

这个我试过了,还是一样

使用特权

评论回复
15
areshan| | 2010-12-27 12:00 | 只看该作者
估计是仿真的问题,你不程序烧到开发板是试试!比如delay函数后面加个点灯,看看能程序能不能跑到那里!

使用特权

评论回复
16
nicker88|  楼主 | 2010-12-27 21:34 | 只看该作者
15# areshan
单步仿真居然能通过,只不过有提示
AVR Simulator: Stack Overflow at 0x00b2
AVR Simulator: Stack Overflow at 0x00a8
每执行一次delay就一次提示,为什么啊,怎么可能溢出

使用特权

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

本版积分规则

0

主题

98

帖子

1

粉丝