主题:请教:打开TMR1的ISR,串口接收数据会丢失!!!

  共有31615人关注过本帖    
quartzcq
1楼


请教:打开TMR1的ISR,串口接收数据会丢失!!!  发帖心情 Post By:2007-7-26 17:27:00   [只看该作者]

一个棘手问题,请教!!!
我是用的ETR186。当TMR1 ISR执行代码时候(TMR1 设置20毫秒一次,内容是我们自己的简易键盘的驱动,主要是一些GPIO操作),同时串口也发生中断(串口每1秒钟会接收到10BYTE左右的一个数据包,串口在接收到这个数据包的同时,取当前RTC时间,然后存入串口的BUFFER供上层调用),现在在测试过程中发现串口数据会丢失!!!!如果关闭TMR1 ISR的键盘检测代码,就一切正常。
请问,有可能是什么问题???谢谢。

  单帖管理 | 引用 | 回复 回到顶部
x10
2楼


  发帖心情 Post By:2007-7-26 17:47:00   [只看该作者]

TMR1 ISR中断级别高于串口中断级别,可能导致串口数据丢失。建议TMR1 ISR只设置键盘扫描标志,由主循环根据标志进行扫描键盘。

  单帖管理 | 引用 | 回复 回到顶部
quartzcq
3楼


  发帖心情 Post By:2007-7-27 8:35:00   [只看该作者]

1、“建议TMR1 ISR只设置键盘扫描标志,由主循环根据标志进行扫描键盘。”
您的意思是否是,TMR1 ISR只侦测是否有KEY按下,至于是哪个KEY,留到上层应用程序主循环时候判断?

2、另外,请问下PC TIMER内部计时器(VECTOR 0X1C)的优先级是否低于ETR186的所有串口?如果是优先级高低引起的,我也可以移到0X1C里面做。

  单帖管理 | 引用 | 回复 回到顶部
x10
4楼


  发帖心情 Post By:2007-7-27 9:27:00   [只看该作者]

1.我的意思是定时中断只是设置一个键扫描标志KeyScanFlag=1;主循环检查该标志,若设置则扫描键盘并清标志。
2.INT 0x1C具有最高优先级别。

  单帖管理 | 引用 | 回复 回到顶部
quartzcq
5楼


  发帖心情 Post By:2007-7-27 10:19:00   [只看该作者]

我还是觉得很奇怪,因为串口有硬件FIFO,数据首先是放到FIFO中,然后每放一个BYTE产生一次中断,中断会保存到操作系统的中断STACK里面,然后应用程序调用STACK里面的中断请求来相应对映的服务。即使此时TMR1正在执行,恰好串口产生了一个中断,但这个中断也是保存到操作系统的中断STACK里面,只要中断STACK的出栈速率大于进栈的速率,就不应该会丢失呀!!!不知道我的理解是否正确。

  单帖管理 | 引用 | 回复 回到顶部
x10
6楼


  发帖心情 Post By:2007-7-27 12:13:00   [只看该作者]

有可能在高级别ISR太长,导致系统的中断控制器丢失低级别的中断请求。可以在进入TMR1 ISR就enable()同时发EOI来测试一下。

  单帖管理 | 引用 | 回复 回到顶部
quartzcq
7楼


  发帖心情 Post By:2007-7-27 12:36:00   [只看该作者]

我测试过,如果只是打开TMR1,里面不做任何其他动作(或者做几行简单的加减乘除等代码),长时间测试后,串口数据也不会丢失。而一旦加上这个3*2的键盘驱动,就会丢失。
另外,系统一般都能够提供关闭中断和打开中断的功能,TURBOC里面是ENABLE和DISABLE这两个函数。我认为,按照原理来讲,如果在串口中断时候,加入DISABLE,然后结束时候ENABLE,这样就不会在串口中断执行时候被TMR1或者其他高优先级ISR抢占造成丢失。但我这样测试了一下,也没用。
不知道ETR186的开关中断是不是由这2个函数完成???或者,TMR1是个例外,即使DISABLE了,TMR1也可以响应(PC机应该是如果DISABLE了后,除了NMI的,其他都不响应)?

  单帖管理 | 引用 | 回复 回到顶部
quartzcq
8楼


  发帖心情 Post By:2007-7-27 12:37:00   [只看该作者]

补一下,上面我说“如果只是打开TMR1,里面不做任何其他动作(或者做几行简单的加减乘除等代码)”是在tmr1 isr enable()和EOI之间的。

  单帖管理 | 引用 | 回复 回到顶部
x10
9楼


  发帖心情 Post By:2007-7-27 14:06:00   [只看该作者]

ETR186与PC是兼容的,当然可以使用enable()和disable()来操作CPU的中断使能开关。DOS系统很多地方都可能有enable(),所以如果要确保在一段代码中关闭中断,就需要:
disable();
//your code... make sure no enable() instructtion
enable();

如果有系统调用,如printf(),中断肯定被打开了。


  单帖管理 | 引用 | 回复 回到顶部

返回首页

请教:打开TMR1的ISR,串口接收数据会丢失!!!

用户名:
            验证码: 验证码,看不清楚?请点击刷新验证码
内容: