Embedded 过早';返回';在ISR中?

Embedded 过早';返回';在ISR中?,embedded,avr,isr,Embedded,Avr,Isr,我使用的是AVR-GCC4.9.2,我想知道如果我在AVR上的ISR中过早返回会发生什么 ISR(USART_RXC_vect) { ... if(idx == BUFSIZE) return; ... } 是否将返回转换为reti指令?或者我自己需要包含一个reti() 我正在寻找关于幕后活动的详细解释。正如 ISR(USART\u RXC\u vect) 不仅仅是 USART\u中断向量: 在汇编程序中 返回 不仅仅是 ret 或 reti 在汇编

我使用的是AVR-GCC4.9.2,我想知道如果我在AVR上的ISR中过早返回会发生什么

ISR(USART_RXC_vect)
{
    ...
    if(idx == BUFSIZE)
        return;
    ...
 }
是否将
返回
转换为
reti
指令?或者我自己需要包含一个
reti()

我正在寻找关于幕后活动的详细解释。

正如
ISR(USART\u RXC\u vect)

不仅仅是
USART\u中断向量:

在汇编程序中

返回
不仅仅是
ret


reti

在汇编程序中

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

任何
都会返回必须在上下文中解释。在实际构建到子例程中的正常子例程结束时(出于代码效率的原因,许多有限使用的子例程被编译器“内联”),它将成为
ret
指令(在处理任何需要的POP和其他低级清理之后)。在中断结束时,它实际上意味着“弹出您之前推过的所有内容(并恢复SREG),然后
reti

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