關(guān)于中斷時的堆棧溢出
堆棧的操作由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)系
評論