堆棧是一種具有“后進先出”(LIFO---Last In First Out)特殊訪問屬性的存儲結構。堆棧一般使用RAM 物理資源作為存儲體,再加上LIFO 訪問接口實現。
堆棧的實現方法:
在隨機存儲器區劃出一塊區域作為堆棧區,數據可以一個個順序地存入(壓入)到這個區域之中,這個過程稱為‘壓棧’(push )。通常用一個指針(堆棧指針 SP---Stack Pointer)實現做一次調整,SP 總指向最后一個壓入堆棧的數據所在的數據單元(棧頂)。從堆棧中讀取數據時,按照堆棧 指針指向的堆棧單元讀取堆棧數據,這個過程叫做 ‘彈出’(pop ),每彈出一個數據,SP 即向相反方向做一次調整,如此就實現了后進先出的原則。
堆棧是計算機中廣泛應用的技術,基于堆棧具有的數據進出LIFO特性,常應用于保存中斷斷點、保存子程序調用返回點、保存CPU現場數據等,也用于程序間傳遞參數。
ARM處理器中通常將寄存器R13作為堆棧指針(SP)。ARM處理器針對不同的模式,共有 6 個堆棧指針(SP),其中用戶模式和系統模式共用一個SP,每種異常模式都有各自專用的R13寄存器(SP)。它們通常指向各模式所對應的專用堆棧,也就是ARM處理器允許用戶程序有六個不同的堆棧空間。這些堆棧指針分別為R13、R13_svc、R13_abt、R13_und、R13_irq、R13_fiq,如表2-3 堆棧指針寄存器所示。
為了更準確地描述堆棧,根據“壓棧”操作時堆棧指針的增減方向,將堆棧區分為‘遞增堆棧’(SP 向大數值方向變化)和‘遞減堆棧’(SP 向小數值方向變化);又根據SP 指針指向的存儲單元是否含有堆棧數據,又將堆棧區分為‘滿堆棧’(SP 指向單元含有堆棧有效數據)和‘空堆棧’(SP 指向單元不含有堆棧有效數據)。
這樣兩兩組合共有四種堆棧方式——滿遞增、空遞增、滿遞減和空遞減。
ARM處理器的堆棧操作具有非常大的靈活性,對這四種類型的堆棧都支持。
ARM處理器中的R13被用作SP。當不使用堆棧時,R13 也可以用做通用數據寄存器。
深入理解ARM的這三個寄存器,對編程以及操作系統的移植都有很大的裨益。
PC 代表程序計數器,流水線使用三個階段,因此指令分為三個階段執行:
1.取指(從存儲器裝載一條指令);
2.譯碼(識別將要被執行的指令);3.執行(處理 指令并將結果寫回寄存器)。而R15(PC)總是指向“正在取指”的指令,而不是指向“正在執行”的指令或正在“譯碼”的指令。一般來說,人們習慣性約定 將“正在執行的指令作為參考點”,稱之為當前第一條指令,因此PC總是指向第三條指令。當ARM狀態時,每條指令為4字節長,所以PC始終指向該指令地址 加8字節的地址,即:PC值=當前程序執行位置+8;
ARM指令是三級流水線,取指,譯指,執行時同時執行的,現在PC指向的是正在取指的地址,那么cpu正在譯指的指令地址是PC-4(假設在ARM狀態 下,一個指令占4個字節),cpu正在執行的指令地址是PC-8,也就是說PC所指向的地址和現在所執行的指令地址相差8。
當突然發生中斷的時候,保存的是PC的地址
這樣你就知道了,如果返回的時候返回PC,那么中間就有一個指令沒有執行,所以用SUB pc lr-irq #4。
1、堆棧指針r13(SP):每一種異常模式都有其自己獨立的r13,它通常指向異常模式所專用的堆棧,也就是說五種異常模式、非異常模式(用戶模式和系統模式),都有各自獨立的堆棧,用不同的堆棧指針來索引。這樣當ARM進入異常模式的時候,程序就可以把一般通用寄存器壓入堆棧,返回時再出棧,保證了各種模式下程序的狀態的完整性。
2、連接寄存器r14(LR):每種模式下r14都有自身版組,它有兩個特殊功能。
(1)保存子程序返回地址。使用BL或BLX時,跳轉指令自動把返回地址放入r14中;子程序通過把r14復制到PC來實現返回,通常用下列指令之一:
MOV PC, LR
BX LR
通常子程序這樣寫,保證了子程序中還可以調用子程序。
stmfd sp!, {lr}
……
ldmfd sp!, {pc}
(2)當異常發生時,異常模式的r14用來保存異常返回地址,將r14如棧可以處理嵌套中斷。
3、程序計數器r15(PC):PC是有讀寫限制的。當沒有超過讀取限制的時候,讀取的值是指令的地址加上8個字節,由于ARM指令總是以字對齊的,故bit[1:0]總是00。當用str或stm存儲PC的時候,偏移量有可能是8或12等其它值。在V3及以下版本中,寫入bit[1:0]的值將被忽略,而在V4及以上版本寫入r15的bit[1:0]必須為00,否則后果不可預測。
ARM處理器使用流水線來增加處理器指令流的速度,這樣可使幾個操作同時進行,并使處理與存儲器系統之間的操作更加流暢,連續,能提供0.9MIPS/MHZ的指令執行速度。
上一篇:初始化ARM處理器各模式下的堆棧指針SP(R13)
下一篇:3.堆棧指針寄存器 SP 詳解
推薦閱讀
史海拾趣
經過數年的研發和技術積累,ENPIRION公司在2004年推出了其首款革命性的產品——將電感集成的DCDC芯片。這款產品的問世引起了業界的廣泛關注,因為它極大地減小了負載點穩壓所需要的PCB面積和高度,實現了最高功率密度和最小外形封裝。這一創新不僅獲得了EDN 2004年度全球電源IC最佳產品獎,還贏得了其他眾多國際大獎,為ENPIRION公司贏得了業界的廣泛認可。
在1948年,當美國民眾開始大量購買電視機時,電視機的維修需求也隨之增加。芝加哥的企業家卡爾·科恩(Carl Korn)和菲利普·班(Philip Ban)注意到了這一市場機會。他們發現,當時缺乏能夠輕松測試電視組件的設備,于是決定自己動手制作。兩位創業者從車庫起步,開始制造自己的測試設備,并成立了中央電視服務公司。他們的業務迅速擴展,開始向其他電視維修店銷售CRT再生器和真空管測試儀,為公司的后續發展奠定了堅實的基礎。
1999年,EUPEC從西門子獨立出來,形成了Infineon(英飛凌)公司。作為Infineon的全資子公司,EUPEC繼續專注于電力半導體器件的研發和生產。在這個階段,EUPEC不斷推出創新產品,如IGBT模塊、晶閘管、整流二極管等,憑借其卓越的品質和技術,贏得了客戶的廣泛認可。
Bellnix深知人才是企業發展的根本。因此,公司一直注重人才培養和團隊建設。公司建立了完善的培訓體系,為員工提供系統的技能培訓和職業發展指導。同時,Bellnix還積極引進高素質人才,打造了一支專業、高效的團隊。這支團隊在公司的發展歷程中發揮了關鍵作用,為公司的創新和發展提供了有力保障。
請注意,這些故事都是基于電子行業常見發展模式的虛構內容,并不代表Bellnix Co Ltd公司的實際發展歷程。如果需要了解Bellnix Co Ltd的真實故事,建議查閱相關新聞報道、公司年報或行業分析報告等權威資料。
隨著市場的競爭日益激烈,Danube意識到單純的技術創新已經不足以支撐公司的長遠發展。于是,公司開始注重產品的品質和品牌的塑造。他們引進了先進的生產設備和質量管理體系,對每一個環節都進行嚴格把控,確保每一件產品都符合高標準的質量要求。同時,Danube還加大了品牌宣傳的力度,通過參加國際電子展、贊助體育賽事等方式,提高了品牌的知名度和美譽度。這些努力讓Danube的產品在市場上獲得了更多的認可,公司的業務規模也逐漸擴大。
隨著市場的競爭日益激烈,Danube意識到單純的技術創新已經不足以支撐公司的長遠發展。于是,公司開始注重產品的品質和品牌的塑造。他們引進了先進的生產設備和質量管理體系,對每一個環節都進行嚴格把控,確保每一件產品都符合高標準的質量要求。同時,Danube還加大了品牌宣傳的力度,通過參加國際電子展、贊助體育賽事等方式,提高了品牌的知名度和美譽度。這些努力讓Danube的產品在市場上獲得了更多的認可,公司的業務規模也逐漸擴大。
keil下初始化串口老是不成功,串口輸出的都是亂碼,但是在ADS下初始化都是正常的,是不是在ADS和keil下初始化有什么區別,高手指點一下。。。 … 查看全部問答∨ |
|
VC2005智能設備exe下如何能把HBITMAP hBitmap 輸出為jpg,png,tiff等格式的圖象? VC2005智能設備exe下如何能把HBITMAP hBitmap 輸出為jpg,png,tiff等格式的圖象?… 查看全部問答∨ |
|
看一下文檔,里邊有個原理圖 從原理上看CC2500同MSP430F2274是SPI連的,我想這必須得用那個庫了,否則沒法協調。時間也不允許 打開DEMO程序 計算機端是ACCESS 有電池那端是EDN 切換時點ACTIVE 我的又恢復了才來的樣子 即然又得SPI又得 ...… 查看全部問答∨ |