Chinaunix首页 | 论坛 | 博客
  • 博客访问: 107760
  • 博文数量: 13
  • 博客积分: 316
  • 博客等级: 二等列兵
  • 技术积分: 292
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-02 10:39
文章存档

2022年(1)

2018年(1)

2012年(1)

2011年(10)

分类: LINUX

2011-12-02 11:16:53

   在标准的Linux内核中,中断处理函数具有最高的优先级。中断处理函数在运行期间是绝对不允许任何进程包括实时进程所抢占,反而中断处理函数可以抢占任何进程包括实时进程。这样会对降低了实时进程响应延迟性能。
   参考MontaVista,在MontaVista中作了实时性方面很好的改进。

在标准的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_tthread成员(irq_desc[n].thread)指向的中断处理线程。在该线程负责处理irq_desc_taction指针指向的所有中断处理函数。在MontaVista ARM架构下,所有的这些中断处理线程的调度方式为FIFO,优先级值在50递增。但是其优先级值不会大于74。也是说,由于各个中断号对应的中断处理线程的优先级是不一样,中断被分了优先级。

MontaVistaCONFIG_PREEMPT_HARDIRQS宏开启的情况下,所有的中断处理函数都在内核线程中执行,包括时钟中断。

阅读(2624) | 评论(0) | 转发(0) |
0

上一篇:Linux实时性分析

下一篇:实时系统分析

给主人留下些什么吧!~~