美文网首页
百度 Apollo 8.0 Cyber 源代码分析(一)

百度 Apollo 8.0 Cyber 源代码分析(一)

作者: RonZheng2010 | 来源:发表于2024-11-24 10:25 被阅读0次

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 源代码分析(五)

相关文章

网友评论

      本文标题:百度 Apollo 8.0 Cyber 源代码分析(一)

      本文链接:https://www.haomeiwen.com/subject/rkuzjjtx.html