当前位置: 代码迷 >> 单片机 >> 一个非常奇怪的keil c51串口中断有关问题
  详细解决方案

一个非常奇怪的keil c51串口中断有关问题

热度:40   发布时间:2016-04-28 16:16:00.0
一个非常奇怪的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试试?或设为相同?

我的习惯是中断函数以及其所调用的函数中用全局变量传递参数,尽量不使用到寄存器组(不使用局部变量),否则寄存器组会推、入栈浪费时间,而且可减少如楼主一样出错后要狂调试的隐患。
  相关解决方案