Apollo:CyberRT源码概览

您所在的位置:网站首页 apollo是什么意思 Apollo:CyberRT源码概览

Apollo:CyberRT源码概览

#Apollo:CyberRT源码概览| 来源: 网络整理| 查看: 265

分析

在cyber.h 里面有一个CreateNode方法,里面返回了Node的引用 在这里插入图片描述

Node

在Node中有一些关键的成员变量:

有一系列相关的Reader以及相应的NodeChannelImpl 和 NodeServiceImpl。 在这里插入图片描述 Reader

在这里插入图片描述

通过注释我们可以直到:

Reader通过订阅Channel获取消息。 Reader和Channel相关联的,由Reader的成员变量ChannelManager进行管理Reader会和一种Topology网络发生关系,可以加入也可以退出(通过成员函数JoinTheTopology()和LeaveTheTopology()) 收到消息时会触发传递到Reader的回调callback也可以监听Blocker中的缓存信息 ChannelImpl

在这里插入图片描述 Channel是Node之间通信的桥梁,用来给Reader和Write之间建立通信

TopologyManager

在这里插入图片描述

CyberRT中的元素之间的关系由Topology呈现Topology相当于一个有向图dagNode是DAG中的顶点Channel是Write流向Reader的边Service是Server流向Client的边Topology是由TopologyManager生成的TopologyManager内有三个子Mannager:NodeManager、ChannelManager、ServiceManager NodeManager用来查找Node是否在Topology中ChannelManager用来查找Channel是否在Topology中,以及对应的Writer 和 ReaderServiceManager用来查找 Service 是否在 Topology 当中,以及对应的 Server 和 Client TopologyManager依靠fast-rtps通信,可以监听元素加入和离开Topology网络可以自己注册ChangeFunc来监听Topology网络的变化

在这里插入图片描述

Component

Component 的基类是 ComponentBase 在这里插入图片描述 从相应的头文件可以看到一些信息提示:

Component 可以通过一些 .proto 配置class loader 可能会加载它内置 Reader有相应的 Node通过 Scheduler 进行调度

我们接下来看 Component 相关的头文件。 在这里插入图片描述 通过注释我们可以看到:

一个Component最多可以支撑4个Channel进行消息处理Component继承自ComponentBase,开发者可以自行定义Component,只要继承Component并复写它的 Init() 和 Proc()Init 和 Proc 的调用是由CyberRT Frame 驱动的,不要主动去调用他们 在这里插入图片描述 Initialize 有protocol文件进行配置 Proc是Component的逻辑处理单元,包含 4 个参数,分别代表 4 个 channel 的消息。 TimerComponent

看名字就知道它是一个定时器组件。 在这里插入图片描述 在这里插入图片描述 TimerComponent 同样继承自 ComponentBase,不过内部有一个定时器 Timer。 在这里插入图片描述

Timer 的内部又有两个关键成员变量类型 TimingWheel 和 TimerTask,顾名思义是定时器时间轮换和定时器任务相关的类。

问题是谁触发 TimerTask 呢?

我们很容易想到调度器,而 CyberRT 代码中也正好有一个 scheduler。

问题是 scheduler 又是谁触发的呢?

scheduler

在一个线团中去找线头是件很难的事情,所以,需要借助于猜测。

我猜测整个 cyberRT 的起源是 init.c 这个文件。 在这里插入图片描述 出现了 scheduler 的身影,但这里是设置 log 相关的线程。 所以,我将目光移到 SysMo 上。 在这里插入图片描述 SysMo创建的时候会建立一个线程,里面执行一个while循环,然后每次调用scheduler的CheckSchedStatus方法

所以,我们终于可以去阅读 scheduler 相应的代码了。

在这里插入图片描述

这是一个工程类,根据策略不同有SchedulerClassic和SchedulerChoreography两种实现。这里选择 SchedulerClassic 看看它内部长什么样子。

看它的头文件可以发现一些关键要素:

采用协程调度内部会创建 Processor,并会定期触发通知信息有一些 ClassicTask,可能代表常规的任务

但聊聊约约我察觉到代码路径离我的目标越来越远,我其实关注的是如何找到 Node 和 Component 的源头,它们是如何被周期触发 proc 方法的。

于是我跳出代码森林,重视审视整个代码目录,然后发现了 mainboard。\

mainboard

mainboard 是 cyberRT 的入口,init 方法都在这里触发。Module 也在这里启动。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3