[英]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
。
此外,可以使用以下任何構造退出任何循環(即使條件為1
, true
或某些等效項):
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 setjmp
和longjmp
函數也可能在這里適用,但我不知道足夠的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.