我正在使用 AVR-GCC 4.9.2,我想知道如果我在 AVR 的 ISR 中过早返回会发生什么?
ISR(USART_RXC_vect)
{
...
if(idx == BUFSIZE)
return;
...
}
会return
被翻译成reti
指令吗?还是我需要包括reti()
我自己?
我正在寻找幕后发生的事情的详细解释。
就像
在汇编程序中
ISR(USART_RXC_vect)
不仅仅是字面意思一样,
USART_INTERUPT_VECTOR:
return;
不只是字面意思
ret
或
reti
在汇编程序中。
C/C++ 中的两条指令都将被翻译成多个汇编器语句,并且在这两种情况下都取决于上下文。在这种情况下,an 的上下文ISR(){}
非常单一,但很可能还包括一些推送和存储 SREG。但是推送到堆栈的次数将取决于函数中发生的情况。
所以将return;
在上下文中解释任何内容。在实际构建到子例程中的普通子例程结束时(出于代码效率的原因,许多有限使用的子例程被编译器“内联”)将成为ret
指令(在处理任何需要的 POP 和其他低级清理)。在中断结束时,它实际上意味着“弹出您之前推送的所有内容(并恢复 SREG)然后reti
”。
当您返回一个类型时,该类型将被编译为通过平台系统传输该值,然后再包含ret
指令。除非您做了非常return;
奇怪的事情,否则您可以假设将正确解释一个非常上下文敏感的语句。但是那些奇怪的事情将是一个好的编译器(如 AVR-GCC)至少会警告的事情。