我正在使用AVR-GCC 4.9.2,我想知道如果我在AVR的ISR上做了過早的回報會發生什麼?ISR中的過早「返回」會發生什麼?
ISR(USART_RXC_vect)
{
...
if(idx == BUFSIZE)
return;
...
}
請問return
被翻譯成一個reti
指令?或者我需要自己添加一個reti()
?
我在尋找關於在幕後發生了什麼的詳細解釋。
我正在使用AVR-GCC 4.9.2,我想知道如果我在AVR的ISR上做了過早的回報會發生什麼?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)至少會提出警告。
如上所述here,在ISR(不在其子功能中)的早期return
被翻譯爲reti
,所以這沒有問題。
[評論#4](http://www.avrfreaks.net/comment/315442#comment-315442)在你提供的鏈接中表示它會「總是跳轉到ISR的函數epilogue'」,它將會轉「清理ISR使用的所有資源,恢復CPU狀態,最終結束執行RETI」。如果是這樣,你的答案可能有點誤導。 – 2015-08-04 21:38:25
@Roflo謝謝。在那裏的第二篇文章後,我停止閱讀。 – 2015-08-04 21:47:19