当前位置: 代码迷 >> 单片机 >> 一个延时程序仿真仿得小弟我连1+1都不会了
  详细解决方案

一个延时程序仿真仿得小弟我连1+1都不会了

热度:208   发布时间:2016-04-28 14:48:47.0
一个延时程序仿真仿得我连1+1都不会了
下面这个延时程序应该就是计数16000吧当i=2之后应该跳出这个子程序,这样理解应该没错吧,但是放在avr studio中软件仿真时,i=2之后继续走第一步,就是i=0,j=0,然后继续循环,不知道哪位大神指导其中缘由啊,求解答
void delay_ms(void)
{
   uint i=0,j=0;
 for (i=0;i<2;i++)
  for (j=0;j<8000;j++);  
}
------解决思路----------------------
估计是重复进入delay_ms了,真不行的话,在相应位置加入{},并且分行,在跟踪,看看问题出在哪(大括号处分行后一般会停留)
------解决思路----------------------
编译器对于这种操作可能会进行优化
最好每个循环操作一下内存的值   
------解决思路----------------------
你这样的循环是会被编译器优化掉的,最终只生成一句jmp指令。可以使用volatile关键词防止编译器对这段代码进行优化。修改如下:

void delay_ms(void)
{
    volatile uint i = 0, j = 0;
    for (i = 0; i < 2; i++)
        for (j = 0; j < 8000; j++);
}


------解决思路----------------------
引用:
中间加个nop吧

也可以在编译器中选择禁止优化,优化程度过高很容易出现这种问题
------解决思路----------------------
void delay_ms(void)重复调用,调用没写错基本就是优化问题
  相关解决方案