下面这个延时程序应该就是计数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++);
}
------解决思路----------------------
也可以在编译器中选择禁止优化,优化程度过高很容易出现这种问题
------解决思路----------------------
void delay_ms(void)重复调用,调用没写错基本就是优化问题