Ответ 1
Как и как
ISR(USART_RXC_vect)
не буквально просто
USART_INTERUPT_VECTOR:
в ассемблере,
return;
не буквально просто
ret
или reti
в ассемблере.
Обе инструкции в C/С++ будут переведены в несколько операторов Assembler, и в обоих случаях это будет зависеть от контекста. Контекст для ISR(){}
является довольно однодорожечным в этом случае, но он, скорее всего, также включает несколько нажатий и сохранение SREG. Но количество нажатий на стек будет зависеть от того, что происходит в этой функции.
Таким образом, любой return;
интерпретируется в контексте. В конце нормальной подпрограммы, которая фактически встроена в подпрограмму (многие подпрограммы ограниченного использования получают "встроенные" компилятором для повышения эффективности кода), она станет инструкцией ret
(после обработки любых необходимых СОЗ и других низкоуровневая очистка). В конце прерывания это на самом деле означает "всплыть все, что вы нажали раньше (а также восстановить SREG), а затем reti
".
Когда вы возвращаете тип, который будет скомпилирован для передачи этого значения через платформенную систему, перед включением инструкции ret
. Поэтому return;
- это очень контекстно-зависимая инструкция, которую вы можете предположить, будет интерпретироваться правильно, если вы не делаете очень странные вещи. Но эти странные вещи будут хорошими компиляторами (например, AVR-GCC), по крайней мере, предупреждают.