4.1 Xenomai如何初始化

点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-优快云博客

原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!

4.1 Xenomai如何初始化

        在上一章节《3.6 第四行之__ipipe_init_proc()-优快云博客》,描述了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-优快云博客》中对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()-优快云博客》。

       第二部分:申请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()之完成中断处理程序设置-优快云博客》的分析,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系列文章大纲-优快云博客

原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值