383 Star 1.9K Fork 1K

GVPApolloAuto / apollo

 / 详情

CMake for CyberRT

待办的
创建于  
2022-06-26 22:14

CyberRT框架非常优秀,我想把它单独拎出来编译安装,作为一个第三方的框架使用,类似于Ros,可以更方便的编写CyberRT模块程序,因为对Bazel不太熟,就选择用最熟的CMake来完成这项工作。目前在虚拟机上已经编译通过,并且所有测试用例均已通过,但是单元测试scheduler_classic_test中
FOR_EACH(i, 0, 20) { cyber::SleepFor(std::chrono::milliseconds(i)); }
理论上来说应该只有200ms左右,但是实际上需要20S左右,这与期望严重不符,如果将其替换为this_thread::sleep_for 就恢复正常;不知道是我移植的问题,还是协程在虚拟机上的表现与物理机不一致造成的。
关于协程的函数栈切换时,目前CyberRT在x64平台上保留了大约7个寄存器,是否虚拟机上并非如此?

我又再次使用apollo官方镜像、在官方docker内编译了CyberRT,单元测试结果与我重新构建编译后的结果一致,是否就能定位是虚拟机的问题?

CMake工程脚本及相关补丁、脚本均已上传git,附上链接。。。

https://gitee.com/Yhangzzz/cmake_for_cyberrt

评论 (12)

yhangzzz 创建了任务

scheduler Async测试用例用时过高,问题已经定位,因为协程队列只有一个协程任务时,如果该协程也让出cpu,将没有其他协程能够唤醒它,processor将一直休眠到context_->Wait(),程序中实际上调用了条件变量wait_for休眠了1000ms。为什么apollo会将此处设置为1000ms呢,既然没人协程对象了,唤醒频繁点理论上也没啥问题,还能提高实时性。

我也理解不了这个默认1000ms的原因

应该是考虑到,实际上不可能只有一个协程任务,有多个协程时协程切换或者有新的任务发布时,都会触发协程Update,进而避免了上述问题。但是最好的做法应该在没有协程任务时,搜索协程队列最近唤醒时间,然后将此时间作为条件变量的超时时间,或者直接将条件变量唤醒时间改短点,1ms也没什么问题。

请问有遇到组件模式proc函数调用不到的情况吗,我cmake编译生成测试组件模式就是不行

目前没有,我这边测试都可以跑通,你是什么测试场景?同一进程还是同一系统不同进程,还是分布式跨机通信?cyber配置下使能标志,看一下log日志,应该可以看出来点东西。

common/timer 这两个样例组件都不行,proc就是死活触发不了

@yhangzzz 我在实体Ubuntu 1804上把apollo 7.0的cyber 单独领出来,自己做了一下cmake 适配,然后代码里面做了一下路径修改,编译通过后就运行他的样例,common_component_example 和timer_component_example ,发现两个proc 回调都触发不了,调试打印提示Detect forward jumps in time,然后我测试listener 和talker 样例,这两个都是可以的,运行ok ,你那边把 cyber 领出来时,有做什么特殊代码修改吗,额,对了,我在我的环境里,把你的代码拿过来试了一遍,也是同样的问题

同一系统内,不同进程,目前同一进程还没开始测试

common component example有两个接收通道,需要另外两个发送消息融合来触发它,你是不是没有运行另外两个发送进程,我确定我这边有触发的

timer那个没有测试,应该没问题,因为timer定时里边的单元测试可以跑

你可以看一下我的补丁,应该框架代码改动,只有单元测试代码有改动

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(4)
8428575 haha web 1666937495 5492591 xlm4056 1591226939
C++
1
https://gitee.com/ApolloAuto/apollo.git
git@gitee.com:ApolloAuto/apollo.git
ApolloAuto
apollo
apollo

搜索帮助