簡體   English   中英

無限循環中的return語句

[英]Return statement in an infinite loop

如果返回語句在這個無限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;
}

無論函數在函數中的位置如何,所有返回語句都將返回到調用函數的任何位置。

例如,如果我寫道:

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來確定它們的用法。

有多種方法可以通過return break goto退出循環

如果IFS0bits.T3IF != 0則使用您的代碼段,然后當count >= RESET_COUNT時,它最終將退出循環。 之后它將返回調用函數的位置。

要回答你的第二個問題,而(1)更像是while(true)。 因此,它會一直循環,直到遇到中斷。

當調用函數時,調用函數(或ISR)的地址放在堆棧的頂部。
return的執行將結束函數(或ISR)。 程序計數器(PC)使用此地址更新,因此程序流可以繼續調用地址后面的語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM