zk_sima 发表于 2014-4-30 23:42:21

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:[email protected]

renshengsiji 发表于 2014-5-5 09:22:14

看了之后,受益匪浅!

sstevne 发表于 2014-6-15 15:47:17

楼主辛苦,接口讲的很清楚,谢谢

826940559 发表于 2014-8-5 15:02:56

学习中,楼主很猛奥,能留个Q么,方便今后交流,我的Q是826940559

huanjing2012 发表于 2014-9-18 09:07:49

这个有逆向工程的味道,真心不错

zbh0418 发表于 2015-1-5 16:45:44

大神,学习了~~~~~~~~~~~~~~~~~

18298347945 发表于 2015-7-3 21:08:21

不错不错。。好东东
~~

mutouren 发表于 2015-7-29 14:18:26

分析的好详细,非常感谢楼主,谢谢!

shmily1019 发表于 2015-11-27 23:24:28

谢谢楼主分享,学习下

wang0906 发表于 2016-3-31 18:32:13

大牛啊,膜拜,虽然看不太懂
页: [1]
查看完整版本: Flightgear接口系列_2_FGIO初始化过程