關于中斷時的堆棧溢出
堆棧的操作由CPU控制不可監控,溢出不報警,子程序調用(或中斷)超過8次嵌套時,最先壓到堆棧的13位地址被沖掉,子程序返回時將回不到調用前的PC,程序。
一般使用不會達到8次嵌套,但如果有5、6 次子程序嵌套,而中斷服務程序中有1、2次子程序調用便相當危險。調試時很難完全模擬所有實際情況,
一般的避免方法:
1、一般的子程序調用不要超過6次子程序嵌套,在開始編程前最好畫一下流程。
2、盡量避免在不可確定發生時刻的中斷(如串口接收、定時器)程序中加子程序調用。中斷服務程序中盡量用GOTO語句。
3、在6次子程序嵌套發生前屏蔽總中斷。
4、廠家提供的器件讀寫驅動例子一般喜歡用很多子程序,用之前最好改一下。
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編譯出來之所以大,與為避免堆棧溢出而作的繞彎處理不無關系
評論