Embedded 在msp430上,从for循环的结束返回到开始需要多少时间?

Embedded 在msp430上,从for循环的结束返回到开始需要多少时间?,embedded,msp430,code-composer,Embedded,Msp430,Code Composer,我这样问是因为下面的代码是我用来让两个LED完全交替闪烁的代码。但这并不能解释为什么会起作用。此带有2个xor的循环有2种状态,一种是引脚1(仅红色点亮)处于活动状态,另一种是引脚6和引脚1均处于活动状态(红色和绿色点亮)。但是这些灯闪烁着,就像它们在彼此之间完美地交替开关一样 #include <msp430g2553.h> // counter as a global variable unsigned int i = 0; void main(void) {

我这样问是因为下面的代码是我用来让两个LED完全交替闪烁的代码。但这并不能解释为什么会起作用。此带有2个xor的循环有2种状态,一种是引脚1(仅红色点亮)处于活动状态,另一种是引脚6和引脚1均处于活动状态(红色和绿色点亮)。但是这些灯闪烁着,就像它们在彼此之间完美地交替开关一样

#include <msp430g2553.h> 

// counter as a global variable
unsigned int i = 0;  

void main(void) 
{ 
    // stop the watchdog timer
    WDTCTL = WDTPW + WDTHOLD;  

    // set the direction register for LED1 and LED2
    P1DIR |= 0x41;  

    // initialize LED1 and LED2 to off
    P1OUT &= 0xBE;  

    //empty for loop is an infinite loop
    for (;;) 
    { 
        P1OUT ^= 0x01;

        // create a delay between toggles
        for(i=0; i< 20000; i++)  
        {    
            // empty statement, do nothing
        }

        P1OUT ^= 0x40;
    }
}
#包括
//计数器作为全局变量
无符号整数i=0;
真空总管(真空)
{ 
//停止看门狗定时器
WDTCTL=WDTPW+WDTHOLD;
//设置LED1和LED2的方向寄存器
P1DIR |=0x41;
//将LED1和LED2初始化为off
P1OUT&=0xBE;
//空for循环是一个无限循环
对于(;;)
{ 
P1OUT^=0x01;
//在切换之间创建延迟
对于(i=0;i<20000;i++)
{    
//空语句,什么也不做
}
P1OUT^=0x40;
}
}

主for循环的延迟是否可能导致这种错觉?

答案是返回到循环开始的速度非常快

此代码看起来应该为我替换指示灯。不过,你的评论似乎排得不好

它的主要部分在你的循环中。开始时,两个LED都熄灭。然后这样做(我已将评论更改为我认为他们所做的):


答案是回到循环的起点非常快

此代码看起来应该为我替换指示灯。不过,你的评论似乎排得不好

它的主要部分在你的循环中。开始时,两个LED都熄灭。然后这样做(我已将评论更改为我认为他们所做的):


无法根据您提供的内容来确定。为了更好地了解发生了什么,请在无限循环结束之前添加延迟循环的副本。如果您希望其他人阅读您的代码,如果其格式为可读性,则可能更礼貌,更可能吸引观众。空白和缩进也有助于理解。为您重新格式化。使
i
全球化的目的是什么?如果必须有全局变量,请不要将其称为
i
!在这种情况下,它不仅不需要是全局的,还可以被本地化为for循环:
for(volatile int i=0;i<20000;i++)
。如果您不希望循环被潜在地优化掉,则在任何情况下都应将其声明为易失性。无法根据您提供的内容确定。为了更好地了解发生了什么,请在无限循环结束之前添加延迟循环的副本。如果您希望其他人阅读您的代码,如果它的格式是为了可读性,那么它可能是有礼貌的,更容易吸引观众。空白和缩进也有助于理解。为您重新格式化。使
i
全球化的目的是什么?如果必须有全局变量,请不要将其称为
i
!在这种情况下,它不仅不需要是全局的,还可以被本地化为for循环:
for(volatile int i=0;i<20000;i++)
。如果你不希望循环被潜在地优化掉,那么它应该被声明为易失性的。是的,我对评论感到抱歉,这是我编辑的教科书代码,但我没有修改评论。谢谢你的例子真的帮助我把它形象化了。是的,我很抱歉评论,这是我编辑的教科书代码,但我没有修改评论。谢谢你的例子真的帮助我把它形象化了。
for (;;) {                   //  infinite loop
    P1OUT ^= 0x01;           // toggle state of LED1
    for(i=0; i< 20000; i++)  // create a delay 
        ;
    P1OUT ^= 0x40;           // toggle state of LED2
}
                      LED1          LED2
                      off           off

start into loop

Toggle LED1           on            off
wait
wait
wait
Toggle LED2           on            on    { go back to start of loop - quickly }
Toggle LED1           off           on 
wait
wait
wait
Toggle LED2           off           off 
Toggle LED1           on            off
wait 
...