1 cyber组件加载 - mainboard
1.1 ClassLoaderManager
SharedLibrary负责加载二进制动态库和符号。
- 成员path_ 是库路径
- 成员handle_是打开文件的句柄
- LoadLibrary() 打开库文件
- CreateClassObj()根据指定的符号名,加载函数/类,得到其指针。
ClassLoader基于SharedLibrary()加载类实例。
ClassLoaderManager创建并管理ClassLoader实例。
- 成员libpath_loader_map_ 是从组件名到ClassLoader实例的映射。
1.2 ModuleController
Modulecontroller负责根据apollo模块的dag配置文件,加载指定的组件。ComponentBase定义组件的接口。
- 成员class_loader_manager_ 是ClassLoaderManager实例。
- 成员cmponent_list_ 是加载的组件列表。一个dag文件中可以指定多个库的多个组件。
- 成员函数Init()会调用LoadAll()加载配置文件中指定的所有库和组件。
1.3 mainboard模块的 main()
cyber的组件模块一般以如下的形式加载。这个命令启动mainboard模块,并加载组件。
- -d选项指定dag文件,其中指定要加载的库和组件
- -p 选项指定的文件中,包括进程的cpu调度配置选项。
mainboard -d modules/camera/dag/camera_publish.dag -p camera_sched_classic
ModuleArgument负责解析以上的命令行。
- 成员dag_conf_list_ 是指定的dag文件名,可以有多个。
- 成员process_group是进程的调度配置选项
- 成员函数ParseArgument()调用GetOptions()解析命令行,除设置以上成员外,也保存到GlobalDatah实例中。
在mainboard模块的main()中,
- 构造ModuleArgument实例,解析命令行
- 调用Init(),
- 创建GlobalData的全局实例。在GlobalData的构造函数中,调用InitHostInfo(),从环境变量CYBER_IP读入本地主机的IP地址。这个地址用于多个cyber主机之间的通信;调用InitConfig(),从配置文件 /apollo/cyber/cyber.pb.conf 读入本地主机的配置选项。
- 根据cpu调度配置文件,创建Scheduler实例,以便支持后面创建的协程。
- 以ModuleArgument实例为参数,定义ModuleController的本地实例controller,并且初始化。这里加载组件。
相关链接
百度 Apollo 8.0 Cyber 源代码分析(一)
百度 Apollo 8.0 Cyber 源代码分析(二)
百度 Apollo 8.0 Cyber 源代码分析(三)
百度 Apollo 8.0 Cyber 源代码分析(四)
百度 Apollo 8.0 Cyber 源代码分析(五)
网友评论