点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-CSDN博客
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!
4.4 timer中断从Xenomai流向Linux
4.4.1 timer中断的3个逻辑中断号
以timer中断为例,来说明在引入了IPIPE Patch后,从Xenomai到Linux的中断处理流程。在之前的章节《4.2.1 通过DTS传递物理中断号给Linux》和《4.2.4 根据DTS完成timer初始化》,已经系统的讨论了timer的初始化,先简单总结一下。
DTS中timer节点定义的4个物理中断号,都转换成Linux virq存到数组arch_timer_ppi中。以我用的QEMU virt为例,arch_timer_of_init调用arch_timer_select_ppi()选择了ARCH_TIMER_VIRT_PPI,它的hwirq 等于27,它的virq等于3,存在arch_timer_ppi[ARCH_TIMER_VIRT_PPI]。

把IPIPE引入的Head域和Root域也加进来一起考虑,它们的XIRQ用与virq的相同的数值,来完成映射。如下图所示,展示了timer中断ARCH_TIMER_VIRT_PPI(hwirq 27)对应的3个逻辑中断号:
- Linux virq: 3
- Head domain XIRQ: 3
- Root domain XIRQ: 3

对应上述3个逻辑中断号,分别注册了三个中断处理程序:
- Linux virq 3: 中断处理程序arch_timer_handler_virt
在timer驱动初始化过程中,arch_timer_register会调用API request_percpu_irq,注册中断处理程序arch_timer_handler_virt。根据《4.3 Linux的中断处理流程》,arch_timer_handler_virt实际上是注册到irqaction->handler。

- Root domain XIRQ 3: 中断处理程序__ipipe_do_IRQ
参考《3.5.2__ipipe_init()之完成中断处理程序设置》,调用了ipipe_request_irq,设置ipipe_root_domain.irqs[3].handler设置为__ipipe_do_IRQ。


- Head domain XIRQ 3: 中断处理程序xnintr_core_clock_handler
参考《4.1 Xenomai如何初始化》,调用了ipipe_request_irq,设置ipipe_head_domain.irqs[3].handler设置为xnintr_core_clock_handler。

接下来讨论timer中断在中断处理程序之间的流动。
点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-CSDN博客
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!
4769

被折叠的 条评论
为什么被折叠?



