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)至少会警告的事情。
我正在使用 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)至少会警告的事情。