点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-CSDN博客
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!
4.1 Xenomai如何初始化
在上一章节《3.6 第四行之__ipipe_init_proc()-CSDN博客》,描述了IPIPE初始化的最后一步__ipipe_init_proc。在它之后,就是Xenomai实时内核Cobalt的初始化,藏在了do_initcalls()中。
Xenoami的初始化入口函数是xenomai_init,通过device_initcall(xenomai_init)向do_initcalls()注册回调函数。在Linux启动过程中,完整的调用堆栈如下图左侧所示。Xenomai是一个非常复杂的实时内核,这里不展开对它的分析,而是把重点放在Xenomai和IPIPE相交的部分,特别是关于中断的部分。
如上图右侧所示,xenomai_init有两部分和IPIPE的接口相关。
第一部分:调用ipipe_register_head注册head domain “Xenomai”
第361行,传入的指针struct ipipe_domain *ipd实际指向cobalt_pipeline.domain,代表了head domain。传入的name是“Xenomai”。
include/xenomai/pipeline/pipeline.h
#define xnsched_primary_domain cobalt_pipeline.domain
include/xenomai/pipeline/machine.h
struct cobalt_pipeline {
struct ipipe_domain domain;
unsigned long clock_freq;
unsigned int escalate_virq;
#ifdef CONFIG_SMP
cpumask_t supported_cpus;
#endif
};
第362行,cobalt_pipeline.domain.name赋值为“Xenomai”.
第366行,调用init_head_stage初始化head domain。具体的过程,与《3.4.3 __ipipe_init_early之初始化root domain-CSDN博客》中对root domain的初始化基本一致,不再重复描述了。值得注意的是,init_stage->__ipipe_hook_critical_ipi->hook_internal_ipi为head domain的virtual interrupt编号1031同样也设置中断处理函数__ipipe_do_critical_sync。
第368行,ipipe_head_domain原先是等于ipipe_root_domain指针的,现在指向了真正的head domain xnsched_primary_domain即cobalt_pipeline.domain。
第368行,调用add_domain_proc增加/proc/ipipe/Xenomai,用于显示head domain的中断分配情况。参考《3.6 第四行之__ipipe_init_proc()-CSDN博客》。
第二部分:申请virtual interrupt 1036并注册handler
kernel/xenomai/pipeline/init.c: pipeline_init()
virq = ipipe_alloc_virq();
if (virq == 0)
goto fail_escalate;
cobalt_pipeline.escalate_virq = virq;
ipipe_request_irq(&xnsched_primary_domain,
cobalt_pipeline.escalate_virq,
(ipipe_irq_handler_t)__xnsched_run_handler,
NULL, NULL);
在pipeline_init中调用ipipe_alloc_virq()的到virq是多少?根据《3.5.2 __ipipe_init()之完成中断处理程序设置-CSDN博客》的分析,root domain的virtual interrupt编号1024~1035已经分配完毕了。而且,函数ipipe_alloc_virq()并没有区分root domain和head domain,是使用同一个位图变量来分配virtual interrupt编号。因此,此时此刻在pipeline_init中调用ipipe_alloc_virq()的到virq是1036。
随后,调用ipipe_request_irq为virtual interrupt编号1036分配中断处理程序__xnsched_run_handler。
分析完上述两大部分,来看一下# cat /proc/ipipe/Xenomai的输出,是否确实和分析一致?
其中中断编号1031和1036已经分析完毕了,但是中断编号3、1032、1033还没有分析到。接下来寻找一下它们是在哪里完成初始化的。
- 中断编号3 xnintr_core_clock_handler
- 中断编号1032 xnintr_core_clock_handler
- 中断编号1033 __xnsched_run_handler
点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-CSDN博客
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!
标签:__,初始化,domain,4.1,virq,pipeline,ipipe,init,Xenomai From: https://blog.csdn.net/aspirestro/article/details/142502978