欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2431|回復: 2
打印 上一主題 下一主題
收起左側

關于Cortex-M4內核的一個小問題

[復制鏈接]
回帖獎勵 6 黑幣 回復本帖可獲得 1 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
本帖最后由 MNwcy 于 2021-2-27 11:13 編輯

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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:474802 發表于 2021-2-28 19:24 | 只看該作者

歡迎討論
回復

使用道具 舉報

板凳
ID:474802 發表于 2021-3-7 23:39 | 只看該作者
自己挖的坑自己填!經過一番小研究有所收獲,總結一下:
1.關于子函數調用和異常中斷處理是兩種不同的情況,子函數調用是一個明確的關系,比如說我程序執行到哪里會調用這個子函數都是已知的(編譯期間就能確定的)。而異常和中斷的出現位置是不可知的。
2.舉個例子在A函數中調用了B函數,各個函數怎么執行的在編譯期間就確定了,當A調用B時,此時內部寄存器中的數據在執行完B后A還要接著用,所以就把調用B時會被改變的寄存器入棧保存(當然還有LR寄存器,入棧后LR會自動更新)
3.中斷和異常想來就來,所以并不確定是在那個位置跳轉到異常處理部分的,所以當異常中斷來后就會把所有的內部寄存器保存(這就是所謂的棧幀,所以棧幀的大小也是固定的,注意入棧是區分調用者寄存器和被調用者寄存器,入的棧不同)
進調試看下匯編就明白了。有說的不對的歡迎指正

評分

參與人數 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表