C51填坑记:中断处理导致主程序函数参数改变

1.现象

平台:keil c51,中颖SH79F7019A

现象:在增加了一个中断处理逻辑后,发现主程序异常,断点调试发现某个函数的参数被改变了,程序使用了错误的数据导致逻辑出错。

2.排查

初步分析,可能原因如下:

1.参数寄存器(R0-R7)的值,被中断函数改变。

2.堆栈溢出。

2.1参数寄存器

首先排查参数寄存器(中断里面调用了函数,有参数传递)。通过仿真器观察中断函数汇编代码,发现在进入中断之前是对R0-R7进行了压栈操作的。进一步将中断有关的函数全部用“using”关键字知道不同的寄存器组,发现问题没有得到改善。到此可以排除参数寄存器原因。

2.2堆栈溢出

排除寄存器之后,进一步想到可能是堆栈溢出,导致数据错乱。由于51单片机栈空间是有限的(只能使用片内RAM,编译器将片内变量分配好之后,将剩余空间作为栈空间使用,参考:https://wenku.baidu.com/view/7659066ffbd6195f312b3169a45177232e60e472.html)。如果函数调用层数过多,加之中断本身需要保护现场,可能导致栈溢出。

于是将断点设置在最底层的函数,观察堆栈寄存器“SP”的值。结果发现被没有发生溢出。因此可以排除。

2.3回到原点

排除了上面的原因之后,只能回到最开始出异常的地方继续跟踪调试。发现该函数参数并不是直接通过寄存器传递,而是保存内存里面(图1),后续使用的时候,去里面读取。

你可能感兴趣的:(C51,C51,Data,Overlay,中断,参数异常改变)