Apollo:CyberRT源码概览 |
您所在的位置:网站首页 › apollo是什么意思 › Apollo:CyberRT源码概览 |
分析
在cyber.h 里面有一个CreateNode方法,里面返回了Node的引用 在Node中有一些关键的成员变量: 有一系列相关的Reader以及相应的NodeChannelImpl 和 NodeServiceImpl。![]() 通过注释我们可以直到: Reader通过订阅Channel获取消息。 Reader和Channel相关联的,由Reader的成员变量ChannelManager进行管理Reader会和一种Topology网络发生关系,可以加入也可以退出(通过成员函数JoinTheTopology()和LeaveTheTopology()) 收到消息时会触发传递到Reader的回调callback也可以监听Blocker中的缓存信息 ChannelImpl
Component 的基类是 ComponentBase 我们接下来看 Component 相关的头文件。 ![]() 看名字就知道它是一个定时器组件。 Timer 的内部又有两个关键成员变量类型 TimingWheel 和 TimerTask,顾名思义是定时器时间轮换和定时器任务相关的类。 问题是谁触发 TimerTask 呢? 我们很容易想到调度器,而 CyberRT 代码中也正好有一个 scheduler。 问题是 scheduler 又是谁触发的呢? scheduler在一个线团中去找线头是件很难的事情,所以,需要借助于猜测。 我猜测整个 cyberRT 的起源是 init.c 这个文件。 所以,我们终于可以去阅读 scheduler 相应的代码了。 这是一个工程类,根据策略不同有SchedulerClassic和SchedulerChoreography两种实现。这里选择 SchedulerClassic 看看它内部长什么样子。 看它的头文件可以发现一些关键要素: 采用协程调度内部会创建 Processor,并会定期触发通知信息有一些 ClassicTask,可能代表常规的任务但聊聊约约我察觉到代码路径离我的目标越来越远,我其实关注的是如何找到 Node 和 Component 的源头,它们是如何被周期触发 proc 方法的。 于是我跳出代码森林,重视审视整个代码目录,然后发现了 mainboard。\ mainboardmainboard 是 cyberRT 的入口,init 方法都在这里触发。Module 也在这里启动。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |