單片機的堆棧_第1頁
單片機的堆棧_第2頁
單片機的堆棧_第3頁
單片機的堆棧_第4頁
單片機的堆棧_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

/堆棧是一種數(shù)據(jù)結(jié)構(gòu)。一直以為堆棧是一個寄存器,慚愧!教科書定義:所謂堆棧,就是只允許在其一端進行數(shù)據(jù)插入和數(shù)據(jù)刪除的線性表.51單片機的單片機的堆棧是在內(nèi)部RAM中開辟的.這句話表明了堆棧的位置。那么堆棧到底有什么作用?堆棧主要是為子程序調(diào)用和中斷操作而設(shè)立的,因此對應(yīng)有兩項功能:保護斷點和保護現(xiàn)場。單片機的程序歸根結(jié)底是個死循環(huán),反復(fù)在執(zhí)行Main函數(shù)(主程序),你可以只寫一個函數(shù)Main,那么你這個函數(shù)隨著功能的增多而變得異常大,而且非常不具備可讀,這個時候就需要子函數(shù)(子程序)了。主函數(shù)在調(diào)用完子函數(shù)后會返回到主函數(shù)中,這樣就可以調(diào)用其它函數(shù)并且繼續(xù)這個死循環(huán).在計算機去執(zhí)行子函數(shù)或者中斷服務(wù)函數(shù),如何確保程序能夠正確地返回到主函數(shù)中并且繼續(xù)正確執(zhí)行后面的內(nèi)容?因為在執(zhí)行子函數(shù)或者中斷服務(wù)函數(shù)時,很有可能會破壞寄存器單元的內(nèi)容,但這些寄存器單元在子函數(shù)必須要用到?這個問題看起來比較難解決了。這個時候就要用到斷點保護和現(xiàn)場保護了。保護斷點:在調(diào)用子程序和堆棧時,將返回地址(執(zhí)行完子程序或者中斷后要執(zhí)行的下一個指令的的地址(PC寄存器值))送入堆棧,程序返回時,這個值自動彈回PC。這種方式是自動使用堆棧的,程序中一般無需理會。在這個過程中,地址送入堆棧時,堆棧指針SP+2,因為51的尋址范圍是64KB,再查看RAM中堆棧單元就可以發(fā)現(xiàn)這個時候已經(jīng)變成了PC的值,在返回的時候SP-2,但是堆棧中的內(nèi)容在下一次堆棧操作之前不會發(fā)生變化。來看下面的仿真圖:程序初始化將SP設(shè)置為0x07,這個時候RAM中全部被清零。單步運行。

這個時候SP的值已經(jīng)變?yōu)?x30,但是內(nèi)容依舊沒有改變。運行到斷點。運行到斷點PC的值沒什么變化,在執(zhí)行完Lcall之后,發(fā)現(xiàn)RAM中30單元起了變化,0013,PC也+2,而0013就是sjmpst1的地址。以上是用Protues仿真的結(jié)果。在用KEIL做軟仿的時候發(fā)現(xiàn)SP會變化,但是對應(yīng)的內(nèi)容卻沒有變化,這個是不是KEIL的一個BUG呢?保護斷點是比較簡單的,編程者一般不用理會?,F(xiàn)場保護就和編程扯上關(guān)系了。現(xiàn)場保護:在轉(zhuǎn)中斷服務(wù)程序或者子程序之前,要把單片機中個有關(guān)單元的內(nèi)容保存起來,這就是所謂的現(xiàn)場保護。有保護當(dāng)然就有恢復(fù)。現(xiàn)場恢復(fù):返回主程序之后恢復(fù)寄存器的內(nèi)容到調(diào)用之前的狀態(tài)。這里就首先要牽涉一個using的用法了。寫過中斷服務(wù)函數(shù)的人都知道,中斷服務(wù)函數(shù)一般都是這種形式的voidisr(void)interruptx(usingx)//usingx是可選的{}教單片機的老師當(dāng)時說你搞不清using的含義,寫中斷服務(wù)程序不用用它就萬事大吉了。這個說法不能說是沒有道理的。很長一段時間我寫中斷服務(wù)程序也是不管這個,直到有一次中斷RAM溢出,才感到這個using用好了還是有點用處的。

“8051是一個基于累加器的單片機,具有8個通用寄存器,每個寄存器都是一個單字節(jié)的寄存器。這8個寄存器通用寄存器可以認(rèn)為是一組寄存器或者一個通用寄存器組.8051提供四組可用的寄存器組。當(dāng)使用中斷時,多組寄存器切換將帶來許多方便。典型8051C程序不需要選擇或者切換寄存器組,默認(rèn)使用寄存器組0。寄存器組1·2·3在中斷服務(wù)程序中使用。”引自北航版《單片機的C語言應(yīng)用程序設(shè)計》來看具體的程序.不實用using,默認(rèn)使用寄存器組0voidTimer0(void)interrupt1

{?TH0=TH0_VAL;

TL0=TL0_VAL;?time_1ms_counter++;?if(0==(time_1ms_counter%10))?{?ScanCardFlag=1;?LCMDisplayAndScanKey();//顯示時間?}?if(64==time_1ms_counter)

time_1ms_counter=1;

}

}對應(yīng)的匯編語言程序Timer0:

C:0x9D70C0E0PUSHACC(0xE0)

C:0x9D72C0F0PUSHB(0xF0)?C:0x9D74C083PUSHDPH(0x83)?C:0x9D76C082PUSHDPL(0x82)

C:0x9D78C0D0PUSHPSW(0xD0)C:0x9D7A75D000MOVPSW(0xD0),#os_buf(0x00);選擇寄存器組0?C:0x9D7DC000PUSHos_buf(0x00)?C:0x9D7FC001PUSH0x01

C:0x9D81C002PUSH0x02

C:0x9D83C003PUSH0x03?C:0x9D85C004PUSH0x04?C:0x9D87C005PUSH0x05?C:0x9D89C006PUSH0x06?C:0x9D8BC007PUSH0x07

C:0x9D8D758CB7MOVTH0(0x8C),#IPH0(0xB7)?C:0x9D90758AFFMOVTL0(0x8A),#0xFF

C:0x9D9390007EMOVDPTR,#time_1ms_counter(0x007E)

C:0x9D96E0MOVXA,@DPTR?C:0x9D9704INCA?C:0x9D98F0MOVX@DPTR,A

C:0x9D99E0MOVXA,@DPTR?C:0x9D9A75F00AMOVB(0xF0),#0x0A

C:0x9D9D84DIVAB?C:0x9D9EE5F0MOVA,B(0xF0)

C:0x9DA07005JNZC:9DA7?C:0x9DA2D208SETBScanCardFlag(0x21。0)

C:0x9DA412905CLCALLLCMDisplayAndScanKey(C:905C)

C:0x9DA790007EMOVDPTR,#time_1ms_counter(0x007E)

C:0x9DAAE0MOVXA,@DPTR

C:0x9DABB44003CJNEA,#0x40,C:9DB1?C:0x9DAE7401MOVA,#0x01

C:0x9DB0F0MOVX@DPTR,A

C:0x9DB1D007POP0x07?C:0x9DB3D006POP0x06?C:0x9DB5D005POP0x05

C:0x9DB7D004POP0x04

C:0x9DB9D003POP0x03?C:0x9DBBD002POP0x02

C:0x9DBDD001POP0x01

C:0x9DBFD000POPos_buf(0x00)

C:0x9DC1D0D0POPPSW(0xD0)

C:0x9DC3D082POPDPL(0x82)?C:0x9DC5D083POPDPH(0x83)

C:0x9DC7D0F0POPB(0xF0)

C:0x9DC9D0E0POPACC(0xE0)

C:0x9DCB32RETI使用using1voidTimer0(void)interrupt1using1?{?TH0=TH0_VAL;?TL0=TL0_VAL;

time_1ms_counter++;?if(0==(time_1ms_counter%10))?{

ScanCardFlag=1;?LCMDisplayAndScanKey();//顯示時間

}?if(64==time_1ms_counter)

{?time_1ms_counter=1;?}?}對應(yīng)的匯編語言程序Timer0:?C:0xA131C0E0PUSHACC(0xE0)?C:0xA133C0F0PUSHB(0xF0)?C:0xA135C083PUSHDPH(0x83)?C:0xA137C082PUSHDPL(0x82)

C:0xA139C0D0PUSHPSW(0xD0)?C:0xA13B75D008MOVPSW(0xD0),#0x08;選擇寄存器組1

C:0xA13E758CB7MOVTH0(0x8C),#IPH0(0xB7)?C:0xA141758AFFMOVTL0(0x8A),#0xFF?C:0xA14490007EMOVDPTR,#time_1ms_counter(0x007E)?C:0xA147E0MOVXA,@DPTR

C:0xA14804INCA

C:0xA149F0MOVX@DPTR,A

C:0xA14AE0MOVXA,@DPTR

C:0xA14B75F00AMOVB(0xF0),#0x0A

C:0xA14E84DIVAB

C:0xA14FE5F0MOVA,B(0xF0)

C:0xA1517005JNZC:A158

C:0xA153D208SETBScanCardFlag(0x21.0)?C:0xA15512905CLCALLLCMDisplayAndScanKey(C:905C)

C:0xA15890007EMOVDPTR,#time_1ms_counter(0x007E)?C:0xA15BE0MOVXA,@DPTR?C:0xA15CB44003CJNEA,#0x40,C:A162?C:0xA15F7401MOVA,#0x01

C:0xA161F0MOVX@DPTR,A?C:0xA162D0D0POPPSW(0xD0)

C:0xA164D082POPDPL(0x82)

C:0xA166D083POPDPH(0x8

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論