本帖最后由 MNwcy 于 2021-2-27 11:13 編輯
在看Cortex-M4的資料,就是權威指南那本書的時候,看到了關于異常發生時的入棧敘述,
123.png (35.31 KB, 下載次數: 41)
下載附件
2021-2-26 11:16 上傳
444.png (40.87 KB, 下載次數: 38)
下載附件
2021-2-26 11:16 上傳
666.png (26.34 KB, 下載次數: 37)
下載附件
2021-2-26 11:18 上傳
看到這里有點疑問了,我的疑問就是“為什么入棧保存的只有八個字的數據?”對于這個不懂的地方我有幾點思考,希望前輩們能不吝解惑。
1.我在看資料時還知道了,寄存器R0~R3、R12、LR、PSR的八個字大小的值會在異常發生后進行入棧操作,這幾個寄存器被叫做“調用者保存寄存器”,R4~R11寄存器被叫做“被調用者保存寄存器”,也就是說,調用者保存寄存器是異常中斷發生時 ”父函數“需要入棧保存的部分,而“被調用者保存寄存器”在進入到“子函數”中需要由子函數進行暫存,然后在子函數結束返回父函數時進行 被調用者寄存器 恢復。關于這兩個概念我不了解,這個規范的好處是什么。網上的論壇搜到的問答感覺模棱兩可,如果有人懂的話歡迎解答。2.在查資料的過程中,看到有人說的是棧幀“八個字”大小,只是“官方標配”,根據實際的情況,編譯器會將需要存儲的量都入棧,也就是說棧幀的大小并不是固定的。但是從權威指南那本書中看,棧幀大小不是八字就是26字(包含了浮點數寄存器)。這里是相互沖突的。
3.我的一點猜測,是不是在函數A執行過程中只要其未完全執行完畢(比如被異常B中斷或調用子函數C),函數A在RAM中所占動態內存是不是就不會釋放。這樣也就解釋了為什么只有內部通用寄存器的數值需要入棧保存,當從中斷B或者函數C返回時,恢復通用寄存器內的值,然后從返回地址處繼續執行即可。
|