Return statement in an infinite loop
c, infinite-loop, mplab, return
Solution
All return statements will return to wherever the function was called from, regardless of where they are located within the function.
For instance, if I wrote:
int main()
{
_iT3Interrupt();
}
Then the return statement in `_iT3Interrupt` will revert control flow back to `main`.
Also, any loop can be exited (even if the condition is `1`, `true`, or some equivalent) with any of the following constructs:
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...
And in C++, `throw`, which will unwind the stack until it reaches a corresponding catch, thus exiting the function. The C `setjmp` and `longjmp` functions may also be applicable here, but I don't know enough C to be certain of their usage.
Problem
Where does this return statement return to if it is inside this infinite while(1) loop? More importantly, I had no idea that a while(1) loop could be broken??? ``` 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; } ```