搜索
bottom↓
回复: 19

【已解决】麻烦大家看一下为什么这个代码调试时正常,下载到目标板上运行却不正常。

[复制链接]

出0入0汤圆

发表于 2010-7-30 23:16:27 | 显示全部楼层 |阅读模式
#include <avr/io.h>

int main(void)

{
        unsigned int i=0,j=0,k=0,l=0;
        DDRD=0xff;
        while(1)
        {
                PORTD=0b00000000;
                for(k=0;k<10000;k++)
                for(l=0;l<10000;l++)
                for(j=0;j<10000;j++)
                for(i=0;i<10000;i++);
                PORTD=0b11111111;
                     for(k=0;k<10000;k++)
                for(l=0;l<10000;l++)
                for(j=0;j<10000;j++)
                for(i=0;i<10000;i++);
        }
}

很简单的一个入门程序,就是让LED灯闪烁。片上调试单步跟踪的时候LED灯是一闪一灭的,但把程序写到FLASH中运行的时候所有的灯却一直亮着。应该不是延迟的问题啊, 我的循环次数都设得那么大了。大家帮我想想是哪里的问题吧。
ps:我在AVR Studio中调试和编程,然后通过JTAG口把程序写到目标板上。芯片是Atmel16L-8PU

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

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

出0入0汤圆

发表于 2010-7-31 08:29:21 | 显示全部楼层
是这样延时的呀
没用过,呵呵

出0入0汤圆

发表于 2010-7-31 09:01:20 | 显示全部楼层
不是程序问题,应该是哪里设置不对,呵呵~~~~我没用过AVR。

出0入0汤圆

 楼主| 发表于 2010-7-31 09:10:06 | 显示全部楼层
会是哪里设置不对呢?

出0入0汤圆

发表于 2010-7-31 10:08:01 | 显示全部楼层
用示波器看看你的晶振有没起振??  还有你的延时是否过长,没看到LED变化的效果,通电时间长点看看有没有变化。要么将延时减小点看看

出0入0汤圆

发表于 2010-7-31 10:10:14 | 显示全部楼层
延时得太久了。。把数改小些。

出0入0汤圆

发表于 2010-7-31 10:19:41 | 显示全部楼层
这么大的循环值。你单步跟踪?鼠标没点坏吧?是设的断点吧?如果真是的单步跟踪调试出来能一闪一灭的话,,猜想应该是编译器优化掉那些for了。。所以,建议把for值改小点。然后在循环体里加_nop();或者设置一下优化等级或者选项。

出0入0汤圆

发表于 2010-7-31 10:28:49 | 显示全部楼层
楼主的程序没有优化的话,在最快的AVR(20MHz)上得跑上几十年PORTD口才取反一次...

出0入0汤圆

发表于 2010-7-31 10:36:11 | 显示全部楼层
刚算了一下,按照一次for循环,一个时钟周期完成,系统主频20M,那么,从亮到灭或者从灭到亮的时间是:
  10000*10000*10000*10000/20000000  / 60 /60  =  138888.88888888888888888888888889 hour

楼主是不是想写成:
or(k=0;k<10000;k++);
for(l=0;l<10000;l++) ;
for(j=0;j<10000;j++) ;
for(i=0;i<10000;i++);
而不是
or(k=0;k<10000;k++)
for(l=0;l<10000;l++)
for(j=0;j<10000;j++)
for(i=0;i<10000;i++);

出0入0汤圆

发表于 2010-7-31 10:36:29 | 显示全部楼层
没用过avr的但一看延时那么就肯定要等很久很久很久很久很久很久很久很久很久很久很久很久很久很久很久.................................................................................................................................................................睡着了!

出0入0汤圆

发表于 2010-7-31 10:36:42 | 显示全部楼层
回复【7楼】hsztc
楼主的程序没有优化的话,在最快的avr(20mhz)上得跑上几十年portd口才取反一次...
-----------------------------------------------------------------------

这几十年MCU一直在跑nop。。。。

出0入0汤圆

 楼主| 发表于 2010-7-31 10:37:40 | 显示全部楼层
_nop在哪个头文件里?

出0入0汤圆

 楼主| 发表于 2010-7-31 10:39:39 | 显示全部楼层
#include <avr/io.h>


int main(void)

{
        unsigned int i=0,j=0,k=0,l=0;

        DDRD=0xff;
        while(1)
        {
                PORTD=0b00000000;
                for(i=0;i<10;i++)
                {                       
                }
       
                PORTD=0b00000001;
                for(i=0;i<10;i++)
                {
               
                }
               
        }
}

这样写也是一样的。。。

出0入0汤圆

 楼主| 发表于 2010-7-31 10:47:05 | 显示全部楼层
会不会是芯片没有执行我的循环?

出0入0汤圆

发表于 2010-7-31 10:59:21 | 显示全部楼层
用编译器自带的delay。。本站的新手入门就是这样的

出0入0汤圆

 楼主| 发表于 2010-7-31 11:01:14 | 显示全部楼层
回复【14楼】little Monkey
用编译器自带的delay。。本站的新手入门就是这样的
-----------------------------------------------------------------------

能给个例子吗?

出0入0汤圆

发表于 2010-7-31 11:13:40 | 显示全部楼层
回复【12楼】facat
#include &lt;avr/io.h&gt;
int main(void)
{
unsigned int i=0,j=0,k=0,l=0;
ddrd=0xff;
while(1)
{
portd=0b00000000;
for(i=0;i&lt;10;i++)
{
}
portd=0b00000001;
for(i=0;i&lt;10;i++)
{
}
}
}
这样写也是一样的。。。
-----------------------------------------------------------------------

延时好短,看不到效果!

出0入0汤圆

 楼主| 发表于 2010-7-31 11:24:20 | 显示全部楼层
我找到解决方法了!!!!!



#include <avr/io.h>


int main(void)

{
        unsigned int i=0,j=0,l=0;
        volatile unsigned int k=0;//非常重要,一定要加上volatile关键字。
        DDRD=0xff;
        while(1)
        {k=0;
                PORTD=0b11111111;
                for(i=0;i<10000;i++)
                {
                        k++; //很重要,循环里一定要写语句。
                }
       
                PORTD=0b00000000;
                for(i=0;i<10000;i++)
                {
                        k++; //很重要,循环里一定要写语句。
                }
        }
}


我分析的原因是编译器对循环进行了优化,所以一定要在循环里写语句。不过这样还是不够的,还要给k加上volatile 关键字,否者编译器还是会跳过那两个空循环。嘻嘻!!!
我用的是avr studio 4.18+WinAvr20100110。

最后问一下,大家知道如何设置编译器不对我的程序进行优化吗?

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 00:29

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

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