关于中断时的堆栈溢出
时间: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编译出来之所以大,与为避免堆栈溢出而作的绕弯处理不无关系
堆栈的操作由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编译出来之所以大,与为避免堆栈溢出而作的绕弯处理不无关系
中断堆栈溢 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)