我正在使用 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++ 中的两条指令都将被翻译成多个汇编语句,并且在这两种情况下都取决于上下文。 ISR(){}
的上下文在这种情况下是完全单轨的,但它很可能还包括一些推送和存储 SREG。但是插入堆栈的次数将取决于函数中发生的情况。
任何 return;
也是如此在上下文中解释。在实际构建到子例程中的正常子例程的末尾(出于代码效率原因,许多有限使用的子例程被编译器“内联”)将成为 ret
指令(在处理任何需要的 POP 和其他低级别清理之后)。在中断结束时,它实际上意味着“弹出您之前推送的所有内容(并恢复 SREG),然后弹出 reti
”。
当您返回将被编译为通过平台系统传输该值的类型时,在包含 ret
之前操作说明。所以return;
是一个非常上下文敏感的语句,你可以假设它会被正确解释,除非你做了非常奇怪的事情。但是那些奇怪的事情将是一个好的编译器(如 AVR-GCC)至少会警告的事情。
关于embedded - ISR 中过早出现 'return' 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32020556/