硬件设备发生中断时,ISR会禁止同级和低级中断,然后根据IRQ返回关联的SysIntr,内核根据ISR返回的SysIntr唤醒相应的IST(SysIntr与IST创建的Event关联),IST处理中断之后调用InterruptDone解除中断禁止。
那是不是说在硬件发起中断后马上就被禁止中断了,直到IST处理完成之后中断才能在次被响应?这样的话不是会丢很多中断阿,因为相应的IST被调度到要还需要时间啊,是ms级的吧,情况恶劣的话可能10几ms后IST被调度,这段时间不是都不能相应中断了阿,
而且“ISR中尽量做少量的事情,大部分事情放到IST中处理”的原则也没有意义了阿,
21 个解决方案
#1
还请各位高手给小弟指点迷津阿。。。
#2
如果不立即禁止,那么你的线程都没有处理完,又产生一个相同的中断,有何用呢?
#3
谢谢googleman,
那如果我是想让尽快地扑捉中断,ISR中只是把外设的数据取出来放到缓冲中,然后开启中断,IST读取缓冲、处理数据就不用太着急,IST读取缓冲、处理数据的过程中中断还可以发生,把数据放到缓冲区,
这样我不是可以比IST中处理完成再打开中断要少丢很多中断阿?
那如果我是想让尽快地扑捉中断,ISR中只是把外设的数据取出来放到缓冲中,然后开启中断,IST读取缓冲、处理数据就不用太着急,IST读取缓冲、处理数据的过程中中断还可以发生,把数据放到缓冲区,
这样我不是可以比IST中处理完成再打开中断要少丢很多中断阿?
#4
把中断处理服务程序尽量整的短一点
#5
可以把InterruptDone位置提前,就放在waitforsingleobject之后是可行的。有些驱动就是这么做的,但是有些驱动为了保证不会破坏,就烦在IST之后。
#6
放在IST的最后
#7
可问题是其实数据处理并不浪费时间,我是觉得等待IST被调度会浪费时间,
我可不可以在ISR处理结束后就使能中断阿,比如ISR最后InterruptDone
#8
你这样做并不合理,万一,就在此时产生一个中断,你的线程就永远得不到执行,这个中断产生也没有意义了。
#9
你的中断服务线程被轮寻一次默认是100毫秒,这一点就在很大程度上限制了实时响应中断吧。如果自己写中断处理的话,首先要设计一个合理的线程优先级以及轮寻时间(这里要考虑会不会影响到其他线程)。
#10
我有试过做一个串口实时读取的驱动,可惜最后不太理想,总是丢桢,最后还是通过改变传输协议。令一次传输的数据量大一些,另外加一些校验什么的,传输时间控制在200毫秒一次,经过测试基本不会丢桢。
#11
這篇文章應可給大家一點啟發, 其原文出處 http://msdn.microsoft.com/en-us/library/aa929162.aspx
The sample installable interrupt service routine (ISR) allows you to capture data from the serial port at a higher rate than with a regular serial port driver. This ISR, which is also referred to as ISR16550.dll, is in %_WINCEROOT%\Public\Common\Oak\Drivers\Serial\ISR16550. Any serial driver that links with the SER16550 serial library located in %_WINCEROOT%\Public\Common\Oak\Drivers\Serial\SER16550 can use this installable ISR.
ISR16550.dll minimizes the time to signal the interrupt service thread (IST). This allows faster data transfer because there is a penalty for the system to schedule the IST. ISR16550.dll buffers data from the hardware to receive first-in, first-out (FIFO) data and fills up hardware transmit FIFO data from the software buffer without IST involvement. The IST is signaled only when the receiving buffer reaches its threshold and the transmitting buffer is empty. The IST is also signaled when the incoming data stream times out, which is same condition as hardware FIFO. This allows less frequent signals to the IST and SER16550 or the driver using the installable ISR can handle high throughput.
Paul, Chao @ Techware
The sample installable interrupt service routine (ISR) allows you to capture data from the serial port at a higher rate than with a regular serial port driver. This ISR, which is also referred to as ISR16550.dll, is in %_WINCEROOT%\Public\Common\Oak\Drivers\Serial\ISR16550. Any serial driver that links with the SER16550 serial library located in %_WINCEROOT%\Public\Common\Oak\Drivers\Serial\SER16550 can use this installable ISR.
ISR16550.dll minimizes the time to signal the interrupt service thread (IST). This allows faster data transfer because there is a penalty for the system to schedule the IST. ISR16550.dll buffers data from the hardware to receive first-in, first-out (FIFO) data and fills up hardware transmit FIFO data from the software buffer without IST involvement. The IST is signaled only when the receiving buffer reaches its threshold and the transmitting buffer is empty. The IST is also signaled when the incoming data stream times out, which is same condition as hardware FIFO. This allows less frequent signals to the IST and SER16550 or the driver using the installable ISR can handle high throughput.
Paul, Chao @ Techware
#12
CBEMA 是说1ms还是100ms
如果真是100ms之内都不能相应中断,那CE的实时性也太差了阿,就算是1ms也不能容忍吧,有什么办法让我的ISR已结束马上运行我的IST呢。
我就是想让我的中断相应快点,
中断里就是取数,同时记录中断事件(原因),IST读取缓冲数据和中断事件(原因),可能IST开始运行的时候缓冲里已经有好多数据和相应的事件记录了,我的想法是IST不用着急,这时还允许中断响应,让他存数,IST就慢慢读,
我的想法没法实现么?
如果真是100ms之内都不能相应中断,那CE的实时性也太差了阿,就算是1ms也不能容忍吧,有什么办法让我的ISR已结束马上运行我的IST呢。
我就是想让我的中断相应快点,
中断里就是取数,同时记录中断事件(原因),IST读取缓冲数据和中断事件(原因),可能IST开始运行的时候缓冲里已经有好多数据和相应的事件记录了,我的想法是IST不用着急,这时还允许中断响应,让他存数,IST就慢慢读,
我的想法没法实现么?
#13
paul_chao 正解!读它的代码去!
#14
在多线程操作中每个线程可以持续100ms,这是一个默认值,在你开启了一个线程的时候,如果没有重新定义这个值,它就会默认这样执行的。
不是说是100ms,就不能改了,你可以依据自己的需要调出一个值来。
这是一个线程得到执行的时间,也就是得知中断以后,启动此线程,此线程默认得到的时间片是100ms,你可以自己改。
不是说是100ms,就不能改了,你可以依据自己的需要调出一个值来。
这是一个线程得到执行的时间,也就是得知中断以后,启动此线程,此线程默认得到的时间片是100ms,你可以自己改。
#15
的确如此,如果一个线程执行超过100ms 还不放弃,那真是不得了了。
那是串口的。
#16
但是我关心的不是我的IST可以执行多久,而是我的IST多久才会被执行,以及我的中断响应的频率,就是说我想让ISR返回后到相应的IST执行有最短的时间,因为我怕这段时间里外设又有中断请求,而这时由于中断已被禁止而不能响应中断。
ISR返回后到相应的IST执行有多久呢?
#17
但是看他的方法好像确实能解决我的问题,由于我怕丢掉中断,而使ISR在记录积累了一定数量的中断事件后在通知IST,这样可以保证在这段时间里中断被关闭的时间够短,不知道我的理解对不对,
#18
我说的这种方法中断是200ms才触发一次。比如你之前是传一桢,现在可以传十一桢。
这样做就是实时性可能相对差点,不过总比丢桢强吧。wince是一个多进程的操作系统,要它实时性特别高的为一个中断服务,可能性比较小,要么你就别用操作系统,那样肯定快。
这样做就是实时性可能相对差点,不过总比丢桢强吧。wince是一个多进程的操作系统,要它实时性特别高的为一个中断服务,可能性比较小,要么你就别用操作系统,那样肯定快。
#19
uping
#20
从ISR到IST的时间基本很难缩短吧。
楼主考虑的方法倒是可以试一下,但如果中断过快,
系统就干不了别的,跟死机差不多了。
楼主考虑的方法倒是可以试一下,但如果中断过快,
系统就干不了别的,跟死机差不多了。
#21
这里在讨论这个呢
#1
还请各位高手给小弟指点迷津阿。。。
#2
如果不立即禁止,那么你的线程都没有处理完,又产生一个相同的中断,有何用呢?
#3
谢谢googleman,
那如果我是想让尽快地扑捉中断,ISR中只是把外设的数据取出来放到缓冲中,然后开启中断,IST读取缓冲、处理数据就不用太着急,IST读取缓冲、处理数据的过程中中断还可以发生,把数据放到缓冲区,
这样我不是可以比IST中处理完成再打开中断要少丢很多中断阿?
那如果我是想让尽快地扑捉中断,ISR中只是把外设的数据取出来放到缓冲中,然后开启中断,IST读取缓冲、处理数据就不用太着急,IST读取缓冲、处理数据的过程中中断还可以发生,把数据放到缓冲区,
这样我不是可以比IST中处理完成再打开中断要少丢很多中断阿?
#4
把中断处理服务程序尽量整的短一点
#5
可以把InterruptDone位置提前,就放在waitforsingleobject之后是可行的。有些驱动就是这么做的,但是有些驱动为了保证不会破坏,就烦在IST之后。
#6
放在IST的最后
#7
可问题是其实数据处理并不浪费时间,我是觉得等待IST被调度会浪费时间,
我可不可以在ISR处理结束后就使能中断阿,比如ISR最后InterruptDone
#8
你这样做并不合理,万一,就在此时产生一个中断,你的线程就永远得不到执行,这个中断产生也没有意义了。
#9
你的中断服务线程被轮寻一次默认是100毫秒,这一点就在很大程度上限制了实时响应中断吧。如果自己写中断处理的话,首先要设计一个合理的线程优先级以及轮寻时间(这里要考虑会不会影响到其他线程)。
#10
我有试过做一个串口实时读取的驱动,可惜最后不太理想,总是丢桢,最后还是通过改变传输协议。令一次传输的数据量大一些,另外加一些校验什么的,传输时间控制在200毫秒一次,经过测试基本不会丢桢。
#11
這篇文章應可給大家一點啟發, 其原文出處 http://msdn.microsoft.com/en-us/library/aa929162.aspx
The sample installable interrupt service routine (ISR) allows you to capture data from the serial port at a higher rate than with a regular serial port driver. This ISR, which is also referred to as ISR16550.dll, is in %_WINCEROOT%\Public\Common\Oak\Drivers\Serial\ISR16550. Any serial driver that links with the SER16550 serial library located in %_WINCEROOT%\Public\Common\Oak\Drivers\Serial\SER16550 can use this installable ISR.
ISR16550.dll minimizes the time to signal the interrupt service thread (IST). This allows faster data transfer because there is a penalty for the system to schedule the IST. ISR16550.dll buffers data from the hardware to receive first-in, first-out (FIFO) data and fills up hardware transmit FIFO data from the software buffer without IST involvement. The IST is signaled only when the receiving buffer reaches its threshold and the transmitting buffer is empty. The IST is also signaled when the incoming data stream times out, which is same condition as hardware FIFO. This allows less frequent signals to the IST and SER16550 or the driver using the installable ISR can handle high throughput.
Paul, Chao @ Techware
The sample installable interrupt service routine (ISR) allows you to capture data from the serial port at a higher rate than with a regular serial port driver. This ISR, which is also referred to as ISR16550.dll, is in %_WINCEROOT%\Public\Common\Oak\Drivers\Serial\ISR16550. Any serial driver that links with the SER16550 serial library located in %_WINCEROOT%\Public\Common\Oak\Drivers\Serial\SER16550 can use this installable ISR.
ISR16550.dll minimizes the time to signal the interrupt service thread (IST). This allows faster data transfer because there is a penalty for the system to schedule the IST. ISR16550.dll buffers data from the hardware to receive first-in, first-out (FIFO) data and fills up hardware transmit FIFO data from the software buffer without IST involvement. The IST is signaled only when the receiving buffer reaches its threshold and the transmitting buffer is empty. The IST is also signaled when the incoming data stream times out, which is same condition as hardware FIFO. This allows less frequent signals to the IST and SER16550 or the driver using the installable ISR can handle high throughput.
Paul, Chao @ Techware
#12
CBEMA 是说1ms还是100ms
如果真是100ms之内都不能相应中断,那CE的实时性也太差了阿,就算是1ms也不能容忍吧,有什么办法让我的ISR已结束马上运行我的IST呢。
我就是想让我的中断相应快点,
中断里就是取数,同时记录中断事件(原因),IST读取缓冲数据和中断事件(原因),可能IST开始运行的时候缓冲里已经有好多数据和相应的事件记录了,我的想法是IST不用着急,这时还允许中断响应,让他存数,IST就慢慢读,
我的想法没法实现么?
如果真是100ms之内都不能相应中断,那CE的实时性也太差了阿,就算是1ms也不能容忍吧,有什么办法让我的ISR已结束马上运行我的IST呢。
我就是想让我的中断相应快点,
中断里就是取数,同时记录中断事件(原因),IST读取缓冲数据和中断事件(原因),可能IST开始运行的时候缓冲里已经有好多数据和相应的事件记录了,我的想法是IST不用着急,这时还允许中断响应,让他存数,IST就慢慢读,
我的想法没法实现么?
#13
paul_chao 正解!读它的代码去!
#14
在多线程操作中每个线程可以持续100ms,这是一个默认值,在你开启了一个线程的时候,如果没有重新定义这个值,它就会默认这样执行的。
不是说是100ms,就不能改了,你可以依据自己的需要调出一个值来。
这是一个线程得到执行的时间,也就是得知中断以后,启动此线程,此线程默认得到的时间片是100ms,你可以自己改。
不是说是100ms,就不能改了,你可以依据自己的需要调出一个值来。
这是一个线程得到执行的时间,也就是得知中断以后,启动此线程,此线程默认得到的时间片是100ms,你可以自己改。
#15
的确如此,如果一个线程执行超过100ms 还不放弃,那真是不得了了。
那是串口的。
#16
但是我关心的不是我的IST可以执行多久,而是我的IST多久才会被执行,以及我的中断响应的频率,就是说我想让ISR返回后到相应的IST执行有最短的时间,因为我怕这段时间里外设又有中断请求,而这时由于中断已被禁止而不能响应中断。
ISR返回后到相应的IST执行有多久呢?
#17
但是看他的方法好像确实能解决我的问题,由于我怕丢掉中断,而使ISR在记录积累了一定数量的中断事件后在通知IST,这样可以保证在这段时间里中断被关闭的时间够短,不知道我的理解对不对,
#18
我说的这种方法中断是200ms才触发一次。比如你之前是传一桢,现在可以传十一桢。
这样做就是实时性可能相对差点,不过总比丢桢强吧。wince是一个多进程的操作系统,要它实时性特别高的为一个中断服务,可能性比较小,要么你就别用操作系统,那样肯定快。
这样做就是实时性可能相对差点,不过总比丢桢强吧。wince是一个多进程的操作系统,要它实时性特别高的为一个中断服务,可能性比较小,要么你就别用操作系统,那样肯定快。
#19
uping
#20
从ISR到IST的时间基本很难缩短吧。
楼主考虑的方法倒是可以试一下,但如果中断过快,
系统就干不了别的,跟死机差不多了。
楼主考虑的方法倒是可以试一下,但如果中断过快,
系统就干不了别的,跟死机差不多了。
#21
这里在讨论这个呢