Embedded 过早';返回';在ISR中?
我使用的是AVR-GCC4.9.2,我想知道如果我在AVR上的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 在汇编
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
指令之前,该类型将被编译为通过平台系统传输该值。Soreturn
是一个非常上下文敏感的语句,您可以假设它将被正确解释,除非您做了非常奇怪的事情。但是这些奇怪的事情是一个好的编译器(比如AVR-GCC)至少会警告的