首页 > 系统相关 >4.1 Xenomai如何初始化

4.1 Xenomai如何初始化

时间:2024-09-25 09:23:27浏览次数:3  
标签:__ 初始化 domain 4.1 virq pipeline ipipe init Xenomai

点击查看系列文章 =》 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

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (354)-- 算法导论24.1 6题
    六、假定G=(V,E)为一带权重的有向图,并且图中存在一个权重为负值的环路。给出一个有效的算法来列出所有属于该环路上的结点。请证明算法的正确性。如果要写代码,请用go语言。文心一言:对于存在权重为负的环路的有向图,我们可以使用Bellman-Ford算法的一个变种来检测并列出该环路上的所......
  • 信息学奥赛复赛复习02-CSP-J2019-02-结构体、无构造函数、有构造函数、初始化列表构造
    PDF文档公众号回复关键字:2024092412019CSP-J题目2公交换乘[题目描述]著名旅游城市B市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案在搭乘一次地铁后可以获得一张优惠票,有效期为45分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过......
  • 4. VM是如何初始化的-create_vm()
    前言在3.初窥全貌-main方法执行全流程-CSDN博客,我们了解了一个Java类的main函数在执行java命令到最终被执行的全路径,但是那里面最重要的三步1.创建vm;2.加载main类;3.执行main方法;我们并没有展开学习,这一章,我们从创建VM开始学习,这是整个系列里最重的函数。流程很多,但......
  • mysql8.4:搭建主从复制(mysql 8.4.1)
    一,主库上:修改配置文件1,配置文件:/etc/my.cnf中,增加:server-id=1说明:无需指明logbin的值,因为它的默认值就是打开的,SHOWVARIABLESLIKE'log_bin';返回:说明:主库的server-id要和从库的server-id区分开,一般主库用1,其他各从库用2及以后的数字二,主库上:创建备份账号1,......
  • 5.2 C# 数组声明与初始化全解
    文章目录5.2.1C#数组声明5.2.1C#数组声明1.声明数组的语法格式2.声明一维数组的语法格式格式1:声明但不初始化格式2:声明并初始化方式1:使用`new`关键字方式2:省略`new`关键字总结5.2.2C#数组的初始化5.2.2C#数组的初始化1.声明并初始化数组1.1使用`new......
  • 文心一言 VS 讯飞星火 VS chatgpt (350)-- 算法导论24.1 1题
    一、在图24-4上运行Bellman-Ford算法,使用结点作为源结点。在每一遍松弛过程中,以图中相同的次序对每条边进行松弛,给出每遍松弛操作后的值和值。然后,把边的权重改为,再次运行该算法,这次使用作为源结点。如果要写代码,请用go语言。文心一言:首先,我们根据题目要求,手动通过Bellman-Ford算......
  • 如何使用位置参数从 ROS 的 Geometry_msgs 初始化 Pose?
    在文档中,它说我可以使用“完整的字段值集,按.msg顺序”进行初始化。这是什么意思?我如何用Python和C++实现它?谢谢!使用位置参数初始化ROSGeometry_msgs的Pose是对的,ROSGeometry_msgs的Pose消息类型可以通过“完整的字段值集,按.msg顺序”进行初始......
  • 报表控件DevExpress Reports v24.1 —— 拥有可调整布局选项
    DevExpressReports提供了一个可调整的布局选项,允许您以最合适的方式安排、塑造和组织数据。其中一个这样的数据塑造选项是分组,可以在表报告的详细信息带内将数据安排在嵌套的多字段组中。在v24.1版本周期中引入了几个函数,它们允许您获取不同组元素的索引,这些新功能包括:CurrentR......
  • 昇思MindSpore进阶教程-参数初始化
    大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。技术上主攻前端开发、鸿蒙开发和AI算法研究。努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧使用内置参数初始化MindSpore提供了多种网络参数初始化的方式,并在部分算子中封装了参数初始化的功......
  • arm各个集成开发环境+rvds4.1
    ARM之各集成开发环境(IDE)说明(Keil、RVDS、ADS、DS-5、MDK)-xiaoheikkkk-博客园(cnblogs.com)  最近,ARM官网进行了较大的改版,原来很多老工具可以免费下载(付费使用),但是改版后需要有购买凭证才可以下载!部分旧工具(补丁)的具体下载地址为https://silver.arm.com,最新的工具在官网......