資源描述:
《硬件堆棧和軟件堆?!酚蓵T上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、硬件堆棧和軟件堆棧在AVR中的理解?(2010-02-0118:43:03)首先是從理論上的東西。。網(wǎng)上轉(zhuǎn)載來的,后面是看AVR代碼時得出的一些東西。硬件堆棧:或許也可以稱作系統(tǒng)堆棧,是位于片內(nèi)RAM區(qū)。有人說,只要能使用PUSH,POP指令的單片機(jī),都可以說含有硬件堆棧。這樣的說法我個人覺得不是很全面。通過指令進(jìn)行壓棧和出棧操作只是系統(tǒng)堆棧中的一種操做。系統(tǒng)堆棧還可以被隱含調(diào)用。例如,當(dāng)調(diào)用子程序時,系統(tǒng)會主動把返回地址壓入堆棧,并不需要用戶通過指令操作。通常,棧底設(shè)在內(nèi)存的高端,也就是把內(nèi)存的最高一段空間劃
2、作棧區(qū)。這些都是向下生長棧。棧指針可能是專用的寄存器,也可能借用一通用寄存器。也有單片機(jī)是在數(shù)據(jù)區(qū)里劃一塊作棧區(qū),可能是向上生長,也可能是向下生長。硬件堆棧:是通過寄存器SPH,SPL做為索引指針的地址,是調(diào)用了CALL,RCALL等函數(shù)調(diào)用指令后硬件自動填充的堆棧!軟件堆棧:是編譯器為了處理一些參數(shù)傳遞而做的堆棧,會由編譯器自動產(chǎn)生和處理,可以通過相應(yīng)的編譯選項對其進(jìn)行編輯。簡單一點(diǎn)說,硬件堆棧主要做為地址堆棧用,而軟件堆棧主要會被分配成數(shù)據(jù)堆棧!---摘自《AVR單片機(jī)C語言開發(fā)入門指導(dǎo)》-?P169---
3、????ICCAVR?使用兩個堆棧:一個用于子程序調(diào)用和中斷操作的硬件堆棧,一個用于傳遞參數(shù)、臨時變量和局部變量的軟件堆棧。可以使用堆棧檢測函數(shù)檢測兩個堆棧是否溢出。單片機(jī)在執(zhí)行調(diào)用子程序的指令時,一般會把返回地址自動存入堆棧,而沒有被單片機(jī)自動入棧但是也需要保存的內(nèi)容比如狀態(tài)寄存器、通用寄存器等,就得通過PUSH等指令把它們?nèi)藶榈乇4娴蕉褩V?。自動入棧和“人為入棧”可能使用的是一個堆棧指針。有的單片機(jī)可以分開,比如AVR,可以通過“ST-Y,R0”這樣的指令把R0存入軟件堆棧區(qū)(Y是由R28和R29兩個寄存器
4、的值組成的16位指針),有的單片機(jī)缺少這樣的指令,就會把軟件堆棧和硬件堆棧放在一個??臻g,都使用SP,比如51.?看其棧頂指針是否和CPU具有特殊的關(guān)聯(lián),有關(guān)聯(lián)者(如SP)“硬”,而無關(guān)聯(lián)者“軟”。如果沒有硬堆棧,你可以選定一個寄存器作堆棧指針,通過軟件實現(xiàn)堆棧操作。移植μC/OS-II也不一定要硬堆棧。ARM就很難說它的堆棧是軟的還是硬的。32位的ARM指令中沒有PUSH、POP指令。ARM習(xí)慣上用R13作堆棧指針(SP),但用別的寄存器作堆棧指針也未常不可。ARM習(xí)慣上用LDM/STM(多寄存器加載/存儲指
5、令)來操作堆棧,壓多少,按什么順序都能選擇。應(yīng)該說ARM是軟硬結(jié)合的堆棧。C代碼(AVR-GCC編譯,優(yōu)化等級-00):#includeintadd(inta,intb){????intc;????c=a+b;???????returnc;}intmain(void){????inta=2,b=3,c=0;c=add(a,b);//c=sub(a,b);}匯編代碼:(省略一些boot代碼)。。。。。。。00000054<__ctors_end>:??54:????1124??????????
6、?eor????r1,r1??56:????1fbe???????????out????0x3f,r1????;63?????58:????cfe5???????????ldi????r28,0x5F????;95?????????//此處Y指針和SP都指到了SRAM最高端??5a:????d4e0???????????ldi????r29,0x04????;4??5c:????debf???????????out????0x3e,r29????;62??5e:????cdbf???????????out???
7、?0x3d,r28????;61。。。0000008e:#includeintadd(inta,intb){??8e:????cf93???????????push????r28??90:????df93???????????push????r29???????????????????//保存了Y指針,此時SP已經(jīng)-2,這里再減2??92:????cdb7???????????in????r28,0x3d????;61???????//重新定位Y指針跟SP一樣。??94:????d
8、eb7???????????in????r29,0x3e????;62??96:????2697???????????sbiw????r28,0x06????;6??????//減掉6,即向下開了6字節(jié)的區(qū)域,存放3變量??98:????0fb6???????????in????r0,0x3f????;63??9a:????f894???????????cli??9c:????debf