標(biāo)題: 關(guān)于Cortex-M4內(nèi)核的一個(gè)小問題 [打印本頁]

作者: MNwcy    時(shí)間: 2021-2-26 11:24
標(biāo)題: 關(guān)于Cortex-M4內(nèi)核的一個(gè)小問題
本帖最后由 MNwcy 于 2021-2-27 11:13 編輯

在看Cortex-M4的資料,就是權(quán)威指南那本書的時(shí)候,看到了關(guān)于異常發(fā)生時(shí)的入棧敘述, 看到這里有點(diǎn)疑問了,我的疑問就是“為什么入棧保存的只有八個(gè)字的數(shù)據(jù)?”對于這個(gè)不懂的地方我有幾點(diǎn)思考,希望前輩們能不吝解惑。
1.我在看資料時(shí)還知道了,寄存器R0~R3、R12、LR、PSR的八個(gè)字大小的值會(huì)在異常發(fā)生后進(jìn)行入棧操作,這幾個(gè)寄存器被叫做“調(diào)用者保存寄存器”,R4~R11寄存器被叫做“被調(diào)用者保存寄存器”,也就是說,調(diào)用者保存寄存器是異常中斷發(fā)生時(shí) ”父函數(shù)“需要入棧保存的部分,而“被調(diào)用者保存寄存器”在進(jìn)入到“子函數(shù)”中需要由子函數(shù)進(jìn)行暫存,然后在子函數(shù)結(jié)束返回父函數(shù)時(shí)進(jìn)行 被調(diào)用者寄存器 恢復(fù)。關(guān)于這兩個(gè)概念我不了解,這個(gè)規(guī)范的好處是什么。網(wǎng)上的論壇搜到的問答感覺模棱兩可,如果有人懂的話歡迎解答。2.在查資料的過程中,看到有人說的是棧幀“八個(gè)字”大小,只是“官方標(biāo)配”,根據(jù)實(shí)際的情況,編譯器會(huì)將需要存儲(chǔ)的量都入棧,也就是說棧幀的大小并不是固定的。但是從權(quán)威指南那本書中看,棧幀大小不是八字就是26字(包含了浮點(diǎn)數(shù)寄存器)。這里是相互沖突的。
3.我的一點(diǎn)猜測,是不是在函數(shù)A執(zhí)行過程中只要其未完全執(zhí)行完畢(比如被異常B中斷或調(diào)用子函數(shù)C),函數(shù)A在RAM中所占動(dòng)態(tài)內(nèi)存是不是就不會(huì)釋放。這樣也就解釋了為什么只有內(nèi)部通用寄存器的數(shù)值需要入棧保存,當(dāng)從中斷B或者函數(shù)C返回時(shí),恢復(fù)通用寄存器內(nèi)的值,然后從返回地址處繼續(xù)執(zhí)行即可。


作者: MNwcy    時(shí)間: 2021-2-28 19:24
1275109681 發(fā)表于 2021-2-27 15:08
頂一下

歡迎討論
作者: MNwcy    時(shí)間: 2021-3-7 23:39
自己挖的坑自己填!經(jīng)過一番小研究有所收獲,總結(jié)一下:
1.關(guān)于子函數(shù)調(diào)用和異常中斷處理是兩種不同的情況,子函數(shù)調(diào)用是一個(gè)明確的關(guān)系,比如說我程序執(zhí)行到哪里會(huì)調(diào)用這個(gè)子函數(shù)都是已知的(編譯期間就能確定的)。而異常和中斷的出現(xiàn)位置是不可知的。
2.舉個(gè)例子在A函數(shù)中調(diào)用了B函數(shù),各個(gè)函數(shù)怎么執(zhí)行的在編譯期間就確定了,當(dāng)A調(diào)用B時(shí),此時(shí)內(nèi)部寄存器中的數(shù)據(jù)在執(zhí)行完B后A還要接著用,所以就把調(diào)用B時(shí)會(huì)被改變的寄存器入棧保存(當(dāng)然還有LR寄存器,入棧后LR會(huì)自動(dòng)更新)
3.中斷和異常想來就來,所以并不確定是在那個(gè)位置跳轉(zhuǎn)到異常處理部分的,所以當(dāng)異常中斷來后就會(huì)把所有的內(nèi)部寄存器保存(這就是所謂的棧幀,所以棧幀的大小也是固定的,注意入棧是區(qū)分調(diào)用者寄存器和被調(diào)用者寄存器,入的棧不同)
進(jìn)調(diào)試看下匯編就明白了。有說的不對的歡迎指正




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1