本帖最后由 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 |