设备上用到4个串口,可是串口3在工作一段时间后,发中断便再也来不了了。通过windview查看,发现是由于中断嵌套所致。即串口3(中断7)中断服务程序尚未退出时,如果串口2(中断3)将其中断抢占,则串口3之后还会中断一次,然后串口3的中断(中断7)便消失了。任凭我怎么开发中断都无济于事。
我查看中断服务程序,发现在中断服务程序之中我已调用intLock()锁中断,原则上讲是不会出现中断抢占的现象。我又仔细分析windview发现不仅有高优先级中断抢占低优先级中断的情况,竟然还有低优先级中断抢占高优先级中断的情况,难道是硬件有问题?百思不得其解,希望高手指点。
说明:不存在其他设备与串口3用同一中断的情况,而且我也按照《vxWorks程序开发实践》上pc104实例中关于增加串口的部分修改了相关文件。
附串口3中断服务程序:
static void asy_int3(...) /*串口3中断服务程序*/ { unsigned char flg; int lock;
lock = intLock(); while (1) { flg = sysInByte(port_base[2] + IIR); /*读中断识别寄存器*/ flg &= 0x7; if (flg & 1) { break; } switch (flg) { case 2 : /*发中断*/ sysOutByte(port_base[2] + TRBUF, com_hd[2].head[com_hd[2].snd_idx]); com_hd[2].snd_idx++; com_hd[2].snd_idx &= COM_BUF_MASK; if (((com_hd[2].sav_idx - com_hd[2].snd_idx + 1) & COM_BUF_MASK) == 60) { semGive(sem_TComId[2]); } if (com_hd[2].snd_idx == com_hd[2].sav_idx) /*发送完毕,关闭发中断,释放信号量*/ { off_send(2); semGive(sem_TComId[2]); } break;
case 4 : /*收中断*/ com_hd[2].rece[com_hd[2].rcv_idx] = sysInByte(port_base[2] + TRBUF); com_hd[2].rcv_idx++; com_hd[2].rcv_idx &= COM_BUF_MASK; semGive(sem_RComId[2]); /*每收一个字节释放一次信号量*/ break; default : break; } } sysOutByte(0x20, 0x20); intUnlock(lock); }
[align=right][color=#000066][此贴子已经被作者于2005-3-24 22:32:23编辑过][/color][/align]