发信人
: Rambo (蓝保)
信 区: Free_NJUPT
标 题: eCos中断模型(1)ISR和DSR
发信站: 紫金飞鸿 (Tue Dec 7 20:11:46 1999)
ISR和DSR
中断处理是实时操作系统一个重要部分。及时地处理中断源是很重要的,但一些必
须被
视为原子操作(不能被中断)的动作对保证及时性带来了十分严重的影响。因为执行
这些
动作时,都要disable中断。为了最大限度地减少这种动作,确保最可能少的中断延
迟,
eCos使用了一种分割式中断处理机制,在这种机制中,中断处理被分为两部分。第
一部
分是大家都知道的中断服务例程(ISR),第一部分是延迟服务例程(DSR)。明显地,
这种
分割允许中断被enabled的情形下运行DSRs,因此在处理较低优先级的中断时,允许
别的
潜在的更高优先级的中断发生和处理。
为了使这种中断模型能够工作起来,ISR应当快速运行。如果中断引起的服务量少,
ISR
可以单独处理这个中断而不需要DSR。当然,如果中断服务比较复杂,DSR就派上了
用场
。将会在稍后合适的时间执行这个DSR,在这个时候允许进行线程调度。推迟到这个
时候
运行DSRs使得kernel可以使用简单的同步方式。
此外,这种受控的调用方式—当允许进行线程调度的时侯--意味着DSR可以和内核打
交道
,比如向内核发出信号:一个异步操作结束了。
为了可以在中断被enabled的情形下运行DSRs,对应于特定中断源(或硬件)的ISR必
须作
出安排保证这个中断不会再次发生,直到DSR结束。在有的情况下,硬件完成这个动
作:
一旦一个中断被递送出去,别的中断将不会发生,除非中断被重新enabled。但是,
一般
情况下,是ISR来强迫这个行为的发生。ISR将会屏蔽掉这个中断源,防止了再次产
生中
断。只有当DSR执行结束时,这个DSR将会unmask这个中断,这样如果新的中断再次
发生
了,允许递送这个中断。
另外,如果每次中断时ISR要做的动作很少,比如传递内存上的一个字节到一个IO设
备上
,每一次“传递”结束时,它可能只需要与系统的其它部分打交道。在这种情况下
,多
次执行了ISR后,等到处理完这个缓冲区,这个ISR才真的需要请求执行它的DSR。
如果中断源是爆发性的,在执行一个被请求的DSR之前,可能产生了多个中断并且多
次调
用了这个ISR,这是正常的;内核记录下被posted的DSR的个数。在这种情况下,这
个DS
R将会最终被调用,其中一个参数告诉它有多少个ISR请求执行这个DSR。编码时必须
小心
处理这种情形,因为一次对DSR的调用需要完成好几次DSR的任务。
正如上面所说,这个DSR将会在稍后的时间得到执行。与系统的状态有关,它可能会
在更
迟的时间得到执行。执行一定的内核操作时,在某些时期内线程调度被禁止,这使
得不
能执行DSR。eCos内核有意识地尽可能地限制了这些时期,尽管它们依然存在。另外
,同
时用户线程有能力挂起调度,因此影响了可能的DSR执行延迟。如果不能足够快地执
行一
个DSR,这个中断源可能overrun。这应当视为系统失败。
信 区: Free_NJUPT
标 题: eCos中断模型(1)ISR和DSR
发信站: 紫金飞鸿 (Tue Dec 7 20:11:46 1999)
ISR和DSR
中断处理是实时操作系统一个重要部分。及时地处理中断源是很重要的,但一些必
须被
视为原子操作(不能被中断)的动作对保证及时性带来了十分严重的影响。因为执行
这些
动作时,都要disable中断。为了最大限度地减少这种动作,确保最可能少的中断延
迟,
eCos使用了一种分割式中断处理机制,在这种机制中,中断处理被分为两部分。第
一部
分是大家都知道的中断服务例程(ISR),第一部分是延迟服务例程(DSR)。明显地,
这种
分割允许中断被enabled的情形下运行DSRs,因此在处理较低优先级的中断时,允许
别的
潜在的更高优先级的中断发生和处理。
为了使这种中断模型能够工作起来,ISR应当快速运行。如果中断引起的服务量少,
ISR
可以单独处理这个中断而不需要DSR。当然,如果中断服务比较复杂,DSR就派上了
用场
。将会在稍后合适的时间执行这个DSR,在这个时候允许进行线程调度。推迟到这个
时候
运行DSRs使得kernel可以使用简单的同步方式。
此外,这种受控的调用方式—当允许进行线程调度的时侯--意味着DSR可以和内核打
交道
,比如向内核发出信号:一个异步操作结束了。
为了可以在中断被enabled的情形下运行DSRs,对应于特定中断源(或硬件)的ISR必
须作
出安排保证这个中断不会再次发生,直到DSR结束。在有的情况下,硬件完成这个动
作:
一旦一个中断被递送出去,别的中断将不会发生,除非中断被重新enabled。但是,
一般
情况下,是ISR来强迫这个行为的发生。ISR将会屏蔽掉这个中断源,防止了再次产
生中
断。只有当DSR执行结束时,这个DSR将会unmask这个中断,这样如果新的中断再次
发生
了,允许递送这个中断。
另外,如果每次中断时ISR要做的动作很少,比如传递内存上的一个字节到一个IO设
备上
,每一次“传递”结束时,它可能只需要与系统的其它部分打交道。在这种情况下
,多
次执行了ISR后,等到处理完这个缓冲区,这个ISR才真的需要请求执行它的DSR。
如果中断源是爆发性的,在执行一个被请求的DSR之前,可能产生了多个中断并且多
次调
用了这个ISR,这是正常的;内核记录下被posted的DSR的个数。在这种情况下,这
个DS
R将会最终被调用,其中一个参数告诉它有多少个ISR请求执行这个DSR。编码时必须
小心
处理这种情形,因为一次对DSR的调用需要完成好几次DSR的任务。
正如上面所说,这个DSR将会在稍后的时间得到执行。与系统的状态有关,它可能会
在更
迟的时间得到执行。执行一定的内核操作时,在某些时期内线程调度被禁止,这使
得不
能执行DSR。eCos内核有意识地尽可能地限制了这些时期,尽管它们依然存在。另外
,同
时用户线程有能力挂起调度,因此影响了可能的DSR执行延迟。如果不能足够快地执
行一
个DSR,这个中断源可能overrun。这应当视为系统失败。