2017-03-09 77 views
3

ARM Cortex-M內核文檔說,執行了異常輸入堆棧分幀。這會導致寄存器R0,R1,R2,R3,R12,LR,PC,xPSR被壓入當前堆棧。 我的問題是爲什麼這種方式只推送這些寄存器而不是所有的上下文?例如,如果某些數據在R5寄存器中,則在異常處理程序使用該寄存器的情況下將被覆蓋。

異常處理程序的編譯函數本身會推送一些寄存器(以及其他常規函數,因爲異常處理函數沒有區別),但經過很多調試後,我發現事實並非總是如此,因爲寄存器的不同變化被推動然後恢復。ARM Cortex-M異常輸入和堆棧分幀

回答

8

爲什麼這種方式只推送這些寄存器而不是所有的 上下文?

提高中斷響應時間。更少的堆棧操作意味着處理程序可以更快地啓動。

例如,如果某些數據在R5寄存器中,在異常處理程序使用該寄存器的情況下,將被覆蓋 。

然後處理程序的責任是保存R5。

編譯異常處理程序本身的函數把一些寄存器 (以及所有其他常規功能,因爲異常處理程序 功能是沒有區別)

這是故意的。被調用的函數必須保存與中斷處理程序(R4-R11和SP)相同的一組寄存器。所以,如果一個正常的函數想要使用R5,它必須保存在某個地方並稍後恢復(詳情請參閱Procedure Call Standard for the ARM® Architecture)。這樣,編譯器可以像處理普通函數一樣處理中斷函數。

它並不總是這種情況,因爲寄存器的不同變化是 被推動然後恢復。

如果編譯的函數在不保存和恢復的情況下覆蓋R4-R11範圍內的寄存器,或者沒有正確恢復PC或SP,那麼編譯器會被中斷。

+1

我希望在這個論壇中的所有答案都是這樣的。清晰,簡單,帶有參考。謝謝! –