全部博文(13)
分类: LINUX
2011-12-02 11:16:53
在标准的Linux-2.6,既使非常紧急的实时任务(进程)在运行时,若这时发生中断,是会抢占当前任务的,只有在中断处理函数执行完成后,实时任务才可以继续执行。由于中断处理函数执行时间的不可预测和中断发生的随机性,这使实时任务的延迟不可预测。这都是由于中断处理的优先级永远高于实时任务造成的。为了解决这个问题,在MontaVista把中断处理在内核线程中执行,这样所有的任务包括中断处理,都得到有效的管理。
同时,由于MontaVista把中断线程化处理,以此为基础,其中断延迟、抢占延迟也得到了很好的保证。大大提高了实时程序对外事件的反应时间。
MontaVista的中断模型如下所示:
MontaVista的中断模型大体上与标准Linux的一样。只是在MontaVista,每个irq_desc_t成员都多一个thread成员。中断完成初始化后,每个irq_desc_t对象分别指向一个内核线程,我们可以称此为中断处理线程,该线程的主体函数是do_irqd。当中断发生后,由大多外部中断向量指向的公共中断服务函数asm_do_IRQ ()就找到该中断号对应的irq_desc_t对象。然后唤醒该irq_desc_t的thread成员(irq_desc[n].thread)指向的中断处理线程。在该线程负责处理irq_desc_t的action指针指向的所有中断处理函数。在MontaVista ARM架构下,所有的这些中断处理线程的调度方式为FIFO,优先级值在50递增。但是其优先级值不会大于74。也是说,由于各个中断号对应的中断处理线程的优先级是不一样,中断被分了优先级。
在MontaVista的CONFIG_PREEMPT_HARDIRQS宏开启的情况下,所有的中断处理函数都在内核线程中执行,包括时钟中断。