Что происходит с преждевременным "возвратом" в ISR?

Я использую AVR-GCC 4.9.2, и я хотел бы знать, что произойдет, если я сделаю преждевременное возвращение в ISR на AVR?

ISR(USART_RXC_vect)
{
    ...
    if(idx == BUFSIZE)
        return;
    ...
 }

Будет ли преобразован return в инструкцию reti? Или мне нужно включить reti() сам?

Я ищу подробное объяснение того, что происходит за кулисами.

Ответ 1

Как и как ISR(USART_RXC_vect)
не буквально просто USART_INTERUPT_VECTOR:
в ассемблере,

return;
не буквально просто ret
или
reti
в ассемблере.

Обе инструкции в C/С++ будут переведены в несколько операторов Assembler, и в обоих случаях это будет зависеть от контекста. Контекст для ISR(){} является довольно однодорожечным в этом случае, но он, скорее всего, также включает несколько нажатий и сохранение SREG. Но количество нажатий на стек будет зависеть от того, что происходит в этой функции.

Таким образом, любой return; интерпретируется в контексте. В конце нормальной подпрограммы, которая фактически встроена в подпрограмму (многие подпрограммы ограниченного использования получают "встроенные" компилятором для повышения эффективности кода), она станет инструкцией ret (после обработки любых необходимых СОЗ и других низкоуровневая очистка). В конце прерывания это на самом деле означает "всплыть все, что вы нажали раньше (а также восстановить SREG), а затем reti".

Когда вы возвращаете тип, который будет скомпилирован для передачи этого значения через платформенную систему, перед включением инструкции ret. Поэтому return; - это очень контекстно-зависимая инструкция, которую вы можете предположить, будет интерпретироваться правильно, если вы не делаете очень странные вещи. Но эти странные вещи будут хорошими компиляторами (например, AVR-GCC), по крайней мере, предупреждают.

Ответ 2

Как сказано здесь, преждевременные return в ISR (не в его дочерних функциях) переведены на reti, так что это без проблем.