新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 關(guān)于中斷時的堆棧溢出

關(guān)于中斷時的堆棧溢出

作者: 時間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
pic16f876堆棧只有8級,每發(fā)生一次子程序調(diào)用(或中斷),將當(dāng)前13位地址壓到堆棧,PC=子程序起始地址低8位+PCLATH(或04H),子程序返回時將13位地址從堆棧中彈出=PC。
堆棧的操作由CPU控制不可監(jiān)控,溢出不報警,子程序調(diào)用(或中斷)超過8次嵌套時,最先壓到堆棧的13位地址被沖掉,子程序返回時將回不到調(diào)用前的PC,程序。
一般使用不會達(dá)到8次嵌套,但如果有5、6 次子程序嵌套,而中斷服務(wù)程序中有1、2次子程序調(diào)用便相當(dāng)危險。調(diào)試時很難完全模擬所有實(shí)際情況,
一般的避免方法:
1、一般的子程序調(diào)用不要超過6次子程序嵌套,在開始編程前最好畫一下流程。
2、盡量避免在不可確定發(fā)生時刻的中斷(如串口接收、定時器)程序中加子程序調(diào)用。中斷服務(wù)程序中盡量用GOTO語句。
3、在6次子程序嵌套發(fā)生前屏蔽總中斷。
4、廠家提供的器件讀寫驅(qū)動例子一般喜歡用很多子程序,用之前最好改一下。
5、可以將CALL改用GOTO,比如:
AAA .......
REYURN
.......
BBB CALLAAA
可以改為:
AAA......
MOVFW PCLATH_TEMP
MOVWF PCLATH
MOVFW PC_RETURN
MOVWF PCL
......
BBB
MOVFW HIGHCCC
MOVWF PCLATH_TEMP
MOVFW HIGHAAA
MOVWF PCLATH
MOVLW CCC
MOVWFPC_RETURN
GOTO AAA
CCC NOP
................
6、如果嫌麻煩,可以用C編程,C編譯出來之所以大,與為避免堆棧溢出而作的繞彎處理不無關(guān)系


關(guān)鍵詞: 中斷堆棧溢

評論


技術(shù)專區(qū)

關(guān)閉