嵌入式实时操作系统中断延时

时间:2023-02-13 19:53:03

由于外部事件的发生常常是以一个中断申请信号的形式来通知处理器,然后才运行中断服务程序中来处理该事件,所以中断延时是影响系统实时性的一个重要因素。那么都有哪些问题影响中断延时呢? 

      一般情况下,都认为处理器是随时可以响应中断申请的。其实并非如此,首先在处理器关闭中断时不能响应中断申请;另外处理器在正在执行一条指令时也不能响应中断申请。因此,当某个事件向处理器发出中断请求时,处理器可能正在执行另外一个中断服务程序。如果为了保证操作的原子性,正在被执行的中断服务程序关闭了中断,那么处理器在这期间就不会响应具有更高优先级别的中断请求。通常,具有高优先级别的中断请求往往对应着更紧急的实时任务,那么上面的情况就意味着紧急事情要等不太紧急的事情做完才能做,这对于紧急事情来说就是一个延时,低级中断服务程序关闭中断时间越长,这段延时也就越长,对紧急任务的及时处理就越不利。所以在为实时系统设计软件尤其是设计操作系统的中断服务程序时,必须对关中断的时间进行精心的控制,尽量减少中断嵌套时对高优先级别中断的延时。例如,在Linux系统中,为了减少因中断服务程序关中断而引起的高优先级别中断的延时,把中断服务程序分成了前后两部分,把必须在关中断状态进行的任务放在前半部分并使其尽可能短,而把大多数工作放在了中断开放的后半部分。

  有时,调度器引起的调度延时也会反映到中断延时中,因为中断的服务有时是用一个进程来完成的。也就是说,在中断服务程序中通过发送消息的方法激活一个进程,并在这个被激活的进程中完成中断所应提供的服务。既然是要激活一个进程,调度器就要进行调度,于是调度器在调度时的延时也就自然反映到这次中断延时中了。

  这种调度的延时比较复杂,它由两部分组成:一部分是调度器在调度工作时所必须耗费的时间;一部分是调度器等待调度所需要的时间。在概念上,第一部分引起的延时比较清楚,麻烦的是第二部分的延时。因为在操作系统中,在中断过程中是不允许进程调度的,也就是说,从中断处理器执行的优先级别的角度来看,中断的优先权是大于所有进程的,所以调度器只能等待所有中断服务都结束之后才能进行进程调度。如果中断嵌套的层次很多,那么这个延时的长度就很可观了。

  显然,由上述调度延时引起的中断服务延时的大小取决于系统的负荷,而且这种延时的可预测性极差。其实,如果对这种工作方式不谨慎规划,还会出现另外一些更复杂情况而大大增加中断延时,这也正是设计实时系统的难点之一。

  除了上述造成中断延时的因素之外,还有一个可能的因素就是DMA。有些计算机系统为了增加内存数据块的传送速度,使用了直接数据传送控制器DMA。其实,DMA请求也是一种中断,只不过它向处理器请求的是总线的控制权,而不是处理器罢了。所以,在DMA控制期间,由于处理器要把总线控制权让给DMA而失去总线控制权,尽管处理器还可以做一些不使用总线的工作,但肯定不会马上响应来自总线的外部中断请求,因此也会造成较大的中断延时。

  正因为DMA有提高系统工作速度的一面,也有造成中断延时过长而降低中断响应速度一面,所以在实时系统中是否以及如何使用DMA技术,在设计系统时要慎重考虑。一般在实时性要求较高的硬实时系统中不要使用DMA。

  另外,实时计算机系统最好采用RISC指令系统有两个原因:一是RISC指令系统的指令执行时间要比CISC系统指令短得多,所以指令执行时间所引起的中断延时也会小得多;二是 在CISC指令系统中,指令的执行时间极为不均匀,短的指令只需要几个时钟脉冲,长的指令 却需要几十个脉冲才能执行完成,这就给一段程序模块执行时间的预测带来了困难,使之难于 满足实时系统执行时间可预测的要求。