一个非常奇怪的keil c51串口中断问题!
一个非常奇怪的keil c51串口中断问题!
比如我的程序如下:
uchar b[10];
#define a4 0x03
void fun1(void) interrupt 4
{
fun2(2);
}
fun2(uchar a2)
{
while(a2--)
{
....
}
fun3(a4);
}
void fun3(uchar a3)//这个函数无论有没有设置重入函数 都有下面那个问题
{
b[0]=1;
a3+=b[0];
b[1]=a3;
}
问题:在keil仿真调试过程中 我关掉串口中断 在主程序运行fun3(4) 结果是对的b[0]=1
b[1]=4 但是我开了串口中断 并且进入了串口中断后 问题就有了 在fun1进入fun2的时候 参数传不进去 调试结果是a2=0x00 但是while循环又确实4次 并且又进入fun3的时候在fun3观看变量 a3=0,b[0]=1,b[1]=0;
调试一晚上 仍然极不明白 求助!!
[解决办法]
哦,刚才没把问题看全。现在的问题是参数不能传递哦。
你可以试试把函数改一下,
fun3: uchar FrameEncap_R(uchar FrameType)
改成
fun3: uchar FrameEncap_R(uchar FlagFrame),
看到底是怎么回事。
不知道你是用什么调试的?如果用的是仿真机,建议只用软件来调,就是不连单片机,只在电脑上调。
你也可以看看它的汇编代码,作一下参考。
还要考虑一下是不是有些东西是不是被优化掉了?
问题应该不会太大。
[解决办法]
如果在中断函数中调用了其他函数,则被调用函数所使用的寄存器组必须与中断函数相同!!!
你的中断函数是用using 1组的,可能你的被调函数用了0组吧。
去掉using 1试试?或设为相同?
我的习惯是中断函数以及其所调用的函数中用全局变量传递参数,尽量不使用到寄存器组(不使用局部变量),否则寄存器组会推、入栈浪费时间,而且可减少如楼主一样出错后要狂调试的隐患。