FlightGear飞行模拟器

标题: Flightgear接口系列_2_FGIO初始化过程 [打印本页]

作者: zk_sima    时间: 2014-4-30 23:42
标题: Flightgear接口系列_2_FGIO初始化过程
本帖最后由 zk_sima 于 2014-4-30 23:44 编辑

今天来继续更新,接着上一节Flightgear接口系列_1_参数解析


今天继续fg接口代码的分析,主要内容是 FGIO初始化过程
FGIO初始化过程
Flightgear的所有IO是通过FGIO对象进行管理的,FGIO对象是SGSubsystem子类,在flightgear中是通过FGGlobals::subsystem_mgr来管理,并在初始阶段调用每个subsystem 的init来对所有的subsystem进行初始化。具体过程如下:
Flightgear在fgMainInit中经过基本的初始化后,进入了主循环过程fgOSMainLoop,在fgOSMainLoop中会循环调用fgIdleFunction,fgIdleFunction中存在一个计数器,在计数器到7时(即进入了第七次循环)会调用全局函数fgCreateSubsystems,在该函数过程中flightgear会创建所有的subsytem包括FGIO(globals->add_subsystem("io", new FGIO )),并加入到全局变量globals 的subsystem_mgr中,该变量用于统一管理所有的subsystem;当fgIdleFunction运行到第九次循环时会调用globals->get_subsystem_mgr()->incrementalInit(),在incrementalInit中会调用subsystem的初始化函数init,此时fgIdleFunction中的计数器并不会增加,所以每次循环都会进入该过程,直到初始化完所有的subsystem才会增加计数器并进入下一个过程。
在FGIO::init中,会依次遍历FGGlobals::channel_options_list(即之前提到的CHANNEL类型的参数)中的每个参数字符串,并调用FGIO::add_channel,在add_channel中flightgear调用FGIO::parse_port_config,为每一个参数生成一个FGProtocol对象,并加入到FGIO支持的协议列表中。
在此之后,fgIdleFunction进入后面的循环过程,并注册循环函数为:fgMainLoop,在fgMainLoop中每次循环都会调用globals->get_subsystem_mgr()->update(sim_dt),在update中会根据时间戳依次调用子系统subsystem的update函数。
在子系统FGIO的update中,系统会根据时间戳,依次调用每个支持的协议的处理函数:FGProtocol::process。每个协议的process会进行详细的数据IO通信。
综上所述,在后续的详细分析中,我们主要关注于:FGIO::parse_port_config和FGProtocol::process,其中FGIO::parse_port_config包含了FGProtocol生成的过程,FGProtocol::process包含了FGProtocol的处理过程。


email:zk.sima@gmail.com
作者: renshengsiji    时间: 2014-5-5 09:22
看了之后,受益匪浅!
作者: sstevne    时间: 2014-6-15 15:47
楼主辛苦,接口讲的很清楚,谢谢
作者: 826940559    时间: 2014-8-5 15:02
学习中,楼主很猛奥,能留个Q么,方便今后交流,我的Q是826940559
作者: huanjing2012    时间: 2014-9-18 09:07
这个有逆向工程的味道,真心不错
作者: zbh0418    时间: 2015-1-5 16:45
大神,学习了~~~~~~~~~~~~~~~~~
作者: 18298347945    时间: 2015-7-3 21:08
不错不错。。好东东
~~
作者: mutouren    时间: 2015-7-29 14:18
分析的好详细,非常感谢楼主,谢谢!
作者: shmily1019    时间: 2015-11-27 23:24
谢谢楼主分享,学习下
作者: wang0906    时间: 2016-3-31 18:32
大牛啊,膜拜,虽然看不太懂




欢迎光临 FlightGear飞行模拟器 (https://www.flightgear.org.cn/) Powered by Discuz! X3.2