11

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

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

return被翻译成reti指令吗?还是我需要包括reti()我自己?

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

4

1 回答 1

9

就像 在汇编程序中
ISR(USART_RXC_vect)
不仅仅是字面意思一样,
USART_INTERUPT_VECTOR:

return;
不只是字面意思
ret

reti
在汇编程序中。

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

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

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

于 2015-08-04T22:22:37.247 回答