OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 求助:vxworks调试串口时遇到一点奇怪的问题?

共2条 1/1 1 跳转至

求助:vxworks调试串口时遇到一点奇怪的问题?

菜鸟
2005-03-24 19:56:00    评分

设备上用到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]



关键词: 求助     vxworks     调试     串口     遇到     一点     怪的    

菜鸟
2005-03-26 06:46:00    评分
2楼
串口中断好像这样写效率不高,应该所有的串口使用一个中断函数,不同的是根据传递给中断函数的结构参数来执行响应的操作,串口之间的差异封装在一个串口数据结构中(地址,信号量,读写的回调函数等),同时vxworks提供一个tty设备相关的xxsio的一个数据结构,你只要执行相应的回调读写操作就可以了,信号量根本使用不到。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]