主题:请教:打开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(),中断肯定被打开了。 |
|
单帖管理 | 引用 | 回复 |