ISR 中过早的 'return' 会发生什么?

What happens with a premature 'return' in an ISR?

我正在使用 AVR-GCC 4.9.2,我想知道如果我在 AVR 的 ISR 中过早 return 会发生什么情况?

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

return 会被翻译成 reti 指令吗?还是我自己需要添加 reti()

我正在寻找关于幕后发生的事情的详细解释。

就像
ISR(USART_RXC_vect)
不只是
USART_INTERUPT_VECTOR:
在汇编程序中,

return;
不只是
ret

reti
在汇编程序中。

C/C++ 中的两条指令都将被翻译成多个汇编程序语句,并且在这两种情况下都取决于上下文。在这种情况下,ISR(){} 的上下文非常单一,但它很可能还包括一些推送和存储 SREG。但是压入堆栈的次数将取决于函数中发生的事情。

因此任何 return; 都将根据上下文进行解释。在实际构建到子例程中的普通子例程结束时(许多有限使用的子例程出于代码效率原因由编译器获得 "in-lined")它将变成 ret 指令(在处理任何需要的 POP 之后和其他低级清理)。在中断结束时,它实际上意味着 "pop everything you pushed before (and also restore the SREG) and then reti"。

当您 return 一个类型时,该类型将被编译为通过平台系统传输该值,然后再包含 ret 指令。所以 return; 是一个非常上下文敏感的语句,你可以假设它会被正确解释,除非你做了非常奇怪的事情。但那些奇怪的事情将是一个好的编译器(如 AVR-GCC)至少会警告的事情。