无限循环中的return语句

时间:2014-03-25 20:47:34

标签: c return infinite-loop mplab

如果返回语句在此无限while(1)循环内,则返回到何处?更重要的是,我不知道while(1)循环可能会被打破???

void __attribute__((interrupt, no_auto_psv)) _T3Interrupt(void)
{
int count;

    IFS0bits.T3IF = 0;          // clear Tmr3 interrupt flag

    StopMotor();
    IEC0bits.ADIE = 0;          // disable ADC interrupt
    IEC0bits.CNIE = 0;          // disable CN interrupt
    IEC0bits.T3IE = 0;          // disable Tmr3 interrupt

    T3CONbits.TON = 1;          // restart tmr3
    count = 0;

    while (1)
    {
        if (IFS0bits.T3IF)
        {
            IFS0bits.T3IF = 0;  // clear flag
            if (count++ >= RESTART_COUNT)
            {
                IEC0bits.ADIE = 1;          // enable ADC interrupt
                IEC0bits.CNIE = 1;          // enable CN interrupt
                T3CONbits.TON = 0;          // stop tmr3
                IEC0bits.T3IE = 1;          // enable Tmr3 interrupt
                return;
            }
        }
    }
    return;
}

4 个答案:

答案 0 :(得分:7)

所有返回语句都将返回到调用函数的任何位置,无论它们在函数中的位置如何。

例如,如果我写道:

int main()
{
    _iT3Interrupt();

}

然后_iT3Interrupt中的return语句会将控制流还原为main

此外,任何循环都可以退出(即使条件为1true或某些等效项),并且具有以下任何结构:

break; //exits the loop

return; //exits the function, thus ending the loop

goto <label-outside-loop>; //self-explanatory

exit(); abort(); //exits the program. Bit of a stretch to say that this ends the loop...

在C ++中,throw,它将展开堆栈直到它到达相应的catch,从而退出该函数。 C setjmplongjmp函数也可能在这里适用,但我不知道足够的C来确定它们的用法,

答案 1 :(得分:2)

使用return break goto

离开循环有多种方法

使用您的代码段IFS0bits.T3IF != 0,然后它会在count >= RESET_COUNT时突然退出循环。之后它将返回到调用函数的位置。

答案 2 :(得分:1)

回答你的第二个问题,而(1)更像是while(true)。因此,它会一直循环,直到遇到中断。

答案 3 :(得分:0)

当调用一个函数的地址时,调用该函数(或ISR)的对象将放在堆栈的顶部。
return的执行将结束函数(或ISR)。程序计数器(PC)会使用该地址进行更新,因此程序流可以继续执行调用地址后的语句。