apollo Xilinx Zynq 平台移植记录

  • 为了做自动驾驶,考察了ros2和apollo,最后还是选择了apollo,原因很简单,好移植。apollo用的是bazel编译系统,为了兼容已有工程,我用CMake构建,构建过程中遇到了一些坑,连基本的talker, listen例子也无法正常工作,也在git上反馈过,但是apollo的arm平台是Xavier,只能自己解决,趁项目告一段落特记录如下:
  1. fastcdr,protobuf序列化的问题,cyber里面调用protobuf序列化后的字符串会含有''结束字符,再经fastcdr序列化时,fastcdr直接转成c-string,导致最终大小不一致。以下underlay_message.cc文件里更新的代码。
void UnderlayMessage::serialize(eprosima::fastcdr::Cdr& scdr) const {
  scdr << m_timestamp;
  scdr << m_seq;
  std::vector<char> data_vector(m_data.size());
  data_vector.assign(m_data.begin(), m_data.end());
  scdr << data_vector;
  scdr << m_datatype;
}

void UnderlayMessage::deserialize(eprosima::fastcdr::Cdr& dcdr) {
  dcdr >> m_timestamp;
  dcdr >> m_seq;
  std::vector<char> data_vector;
  dcdr >> data_vector;
  m_data.assign(data_vector.begin(), data_vector.end());
  dcdr >> m_datatype;
}
  1. 协程优化问题,release模式或者-O2优化选项,有些语句会被优化调,如果改为debug模式,库的体积又太大,我的解决办法是对特定的函数
  static void Yield()__attribute__((optimize("-O0")));
  static void Yield(const RoutineState &state)__attribute__((optimize("-O0")));
  static void SetMainContext(const std::shared_ptr<RoutineContext> &context)__attribute__((optimize("-O0")));
  static CRoutine *GetCurrentRoutine()__attribute__((optimize("-O0")));
  static char **GetMainStack()__attribute__((optimize("-O0")));
  1. fastddr库的第三方memory库,需要确定NODE_SIZE的大小,x86可以自动确定,但是arm平台需要先编译nodesize_dbg工具,再在arm平台上执行生成container_node_sizes_impl.hpp,将其替换掉memory的build目录下src/container_node_sizes_impl.hpp文件,注意在源码的src/CMakeLists.txt里修改如下几行。避免container_node_sizes_impl.hpp被覆盖。
    message(WARNING "cannot generate container_node_sizes_impl.hpp, node size information will be unavailable")
    #file(WRITE  ${CMAKE_CURRENT_BINARY_DIR}/container_node_sizes_impl.hpp "#define FOONATHAN_MEMORY_NO_NODE_SIZE")
    #set(FOONATHAN_MEMORY_NO_NODE_SIZE 1 PARENT_SCOPE)
原文地址:https://www.cnblogs.com/chenzhengxi/p/14641289.html