微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 关于中断时的堆栈溢出

关于中断时的堆栈溢出

时间:11-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编译出来之所以大,与为避免堆栈溢出而作的绕弯处理不无关系

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top