ARM Cortex-M內核文檔說,執行了異常輸入堆棧分幀。這會導致寄存器R0,R1,R2,R3,R12,LR,PC,xPSR被壓入當前堆棧。 我的問題是爲什麼這種方式只推送這些寄存器而不是所有的上下文?例如,如果某些數據在R5寄存器中,則在異常處理程序使用該寄存器的情況下將被覆蓋。
異常處理程序的編譯函數本身會推送一些寄存器(以及其他常規函數,因爲異常處理函數沒有區別),但經過很多調試後,我發現事實並非總是如此,因爲寄存器的不同變化被推動然後恢復。ARM Cortex-M異常輸入和堆棧分幀
3
A
回答
8
爲什麼這種方式只推送這些寄存器而不是所有的 上下文?
提高中斷響應時間。更少的堆棧操作意味着處理程序可以更快地啓動。
例如,如果某些數據在R5寄存器中,在異常處理程序使用該寄存器的情況下,將被覆蓋 。
然後處理程序的責任是保存R5。
編譯異常處理程序本身的函數把一些寄存器 (以及所有其他常規功能,因爲異常處理程序 功能是沒有區別)
這是故意的。被調用的函數必須保存與中斷處理程序(R4-R11和SP)相同的一組寄存器。所以,如果一個正常的函數想要使用R5,它必須保存在某個地方並稍後恢復(詳情請參閱Procedure Call Standard for the ARM® Architecture)。這樣,編譯器可以像處理普通函數一樣處理中斷函數。
它並不總是這種情況,因爲寄存器的不同變化是 被推動然後恢復。
如果編譯的函數在不保存和恢復的情況下覆蓋R4-R11範圍內的寄存器,或者沒有正確恢復PC或SP,那麼編譯器會被中斷。
相關問題
- 1. VxWorks堆棧幀異常大
- 2. 需要堆棧幀,ARM
- 3. 如何從異常「跳」到堆棧幀?
- 4. 調用堆棧上的異常處理堆棧幀的順序
- 5. 異常和堆棧跟蹤
- 6. 堆棧空異常
- 7. 堆棧幀和堆棧指針
- 8. 堆棧幀內存分配
- 9. Java異常處理和堆棧跟蹤
- 10. Resque:異常和堆棧跟蹤
- 11. AppDomain.FirstChanceException和堆棧溢出異常
- 12. 堆棧溢出異常
- 13. 導致堆棧異常(x86)
- 14. 堆棧空間異常
- 15. 空引用異常堆棧
- 16. 堆棧溢出異常
- 17. 堆棧展開異常C++
- 18. 異常堆棧跟蹤
- 19. 堆棧溢出異常
- 20. Sammy.js異常堆棧跟蹤
- 21. ARM AArch64堆棧管理
- 22. C++禁用堆棧幀下面的異常
- 23. 在異常情況下獲取函數的堆棧幀
- 24. Zend_Search_Lucene「在第0行未知堆棧幀時拋出的異常」
- 25. 內存分配,堆棧和堆棧
- 26. 獲取堆棧幀
- 27. 打印堆棧幀
- 28. 訪問堆棧幀
- 29. ARM:無幀指針的調用堆棧生成
- 30. 堆棧和堆棧幀有什麼區別?
我希望在這個論壇中的所有答案都是這樣的。清晰,簡單,帶有參考。謝謝! –