2015-08-04 48 views
10

我正在使用AVR-GCC 4.9.2,我想知道如果我在AVR的ISR上做了過早的回報會發生什麼?ISR中的過早「返回」會發生什麼?

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

請問return被翻譯成一個reti指令?或者我需要自己添加一個reti()

我在尋找關於在幕後發生了什麼的詳細解釋。

回答

9

正如
ISR(USART_RXC_vect)
是不是真的只是
USART_INTERUPT_VECTOR:
在彙編 ,

return;
是不是真的只是
ret

reti
彙編程序中的。

C/C++中的兩條指令都將被翻譯成多個彙編語句,並且在這兩種情況下都取決於上下文。在這種情況下,ISR(){}的上下文是相當單一的,但它很可能還包括一些推動和存儲SREG。但是推入堆棧的數量將取決於函數中發生的情況。

因此,任何return;將在上下文中解釋。在實際構建到子例程中的正常子例程結束時(爲了代碼效率的原因,許多限制使用的子例程被編譯器「內聯」),它將成爲ret指令(在處理任何需要的POP和其他低級別的子程序之後)級清理)。在中斷結束時,它實際上意味着「彈出之前推送的所有內容(並恢復SREG),然後執行reti」。

在包含ret指令之前,當您返回將通過平臺系統傳輸該值的類型時。所以return;是一個非常敏感的語句,你可以假設它會被正確解釋,除非你做了很奇怪的事情。但那些奇怪的東西將會是一個好的編譯器(比如AVR-GCC)至少會提出警告。

3

如上所述here,在ISR(不在其子功能中)的早期return被翻譯爲reti,所以這沒有問題。

+0

[評論#4](http://www.avrfreaks.net/comment/315442#comment-315442)在你提供的鏈接中表示它會「總是跳轉到ISR的函數epilogue'」,它將會轉「清理ISR使用的所有資源,恢復CPU狀態,最終結束執行RETI」。如果是這樣,你的答案可能有點誤導。 – 2015-08-04 21:38:25

+0

@Roflo謝謝。在那裏的第二篇文章後,我停止閱讀。 – 2015-08-04 21:47:19

相關問題