×
嵌入式 > 嵌入式开发 > 详情

关于中断时的堆栈溢出

发布时间:2020-08-13 发布时间:
|
pic16f876堆栈只有8级,每发生一次子程序调用(或中断),将当前13位地址压到堆栈,PC=子程序起始地址低8位+PCLATH(或04H),子程序返回时将13位地址从堆栈中弹出=PC。
堆栈的操作由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编译出来之所以大,与为避免堆栈溢出而作的绕弯处理不无关系


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Recogni:将高端AI芯片推向自动驾驶边缘