ouster激光雷达数据包丢包问题解决(Linux线程指定CPU,锁定CPU频率)

目录

  • 设备及运行环境
  • 问题描述
  • 问题解决
    • 网络速度问题
    • 线程绑定CPU核心
      • 查看线程/进程运行在哪个CPU核心
      • 设置线程/进程运行在指定CPU
    • CPU定频
  • 参考

设备及运行环境

激光雷达:ouster OS1-128
硬件平台:RK3399 4+64GB
操作系统:Ubuntu 18.04

问题描述

ouster 128线激光雷达在接入RK3399运行时,数据特别异常,时间戳不连续、回撤、重复,frame_id不连续,即使运行ouster官方例程也有同样问题。同样的程序在笔记本电脑上可以正常运行。如下图时间戳(左:RK3399,右:PC)

ouster激光雷达数据包丢包问题解决(Linux线程指定CPU,锁定CPU频率)_第1张图片下图frame_id不连续,有丢帧
ouster激光雷达数据包丢包问题解决(Linux线程指定CPU,锁定CPU频率)_第2张图片

问题解决

网络速度问题

通过wget下载局域网内文件,发现PC的下载速度为100MB/s,RK3399开发板下载速度只有10MB/s。使用命令ethtool eth0测试,PC为千兆网,开发板只识别为百兆网。通过烧写其他系统镜像验证确认为系统问题并非硬件问题。

此问题由供应商重新编译系统解决,不再赘述。

线程绑定CPU核心

重新烧录千兆网镜像后,wget命令速度提升到100MB/s,速度正常,但是ouster数据仍然丢包,且丢包数量时多时少。
这是因为RK3399采用双核Cortex-A72大核+四核Cortex-A53小核结构,大核频率最高1.8GHz,小核频率最高1.4GHz,CPU0-3为小核,CPU4-5为大核。直接运行程序会在不同的CPU核心上运行,无法达到最快速度。
将ouster雷达获取数据的线程绑定到大核,固定频率到1.8GHz后,问题解决

查看线程/进程运行在哪个CPU核心

方法1. taskset查看CPU亲和属性

taskset -ap [PID]

在这里插入图片描述得到的mask为二进制表示,上图10代表线程能够运行在CPU4,如mask=3f代表线程能够运行在CPU0-5

方法2. ps -eLF
在这里插入图片描述
第9列PSR对应的数字即为当前运行的CPU核心编号

方法3. top

top -p 

ouster激光雷达数据包丢包问题解决(Linux线程指定CPU,锁定CPU频率)_第3张图片
按下"F"键进入管理界面

ouster激光雷达数据包丢包问题解决(Linux线程指定CPU,锁定CPU频率)_第4张图片

使用上下键选择P = Last Used Cpu,并按下空格键,出现 “*”即可,按"Q"键退出,即可看到线程当前使用的CPU编号

ouster激光雷达数据包丢包问题解决(Linux线程指定CPU,锁定CPU频率)_第5张图片

设置线程/进程运行在指定CPU

方法1. taskset设置CPU亲和属性

taskset -ap 30 [PID]

设置线程可以在CPU4-5运行

方法2. C语言接口

// 进程绑定到CPU
#include 
int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);

// 线程绑定到CPU
#include 
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset);

// 参数
// pid:进程的id号,如果pid为0,则表示本进程
// cpusetsize:mask的大小
// mask:运行进程的CPU,可以通过以下函数操作mask
#define CPU_SET(cpu, cpusetp) //设置cpu
#define CPU_CLR(cpu, cpusetp) //删除cpu
#define CPU_ISSET(cpu, cpusetp) //判断cpu
#define CPU_ZERO(cpusetp) //初始化为0

CPU定频

绑定线程到CPU后,速度有明显提升,但是在程序刚开始运行时候还是存在丢包现象,可能是因为CPU自适应频率一开始频率较低,CPU负载提高后频率才提高。直接将CPU频率固定设置为最高频率后解决。

# 设置频率
sudo chmod 666 /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
sudo chmod 666 /sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed
sudo chmod 666 /sys/devices/system/cpu/cpufreq/policy4/scaling_governor
sudo chmod 666 /sys/devices/system/cpu/cpufreq/policy4/scaling_setspeed
sudo echo userspace > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
sudo echo userspace > /sys/devices/system/cpu/cpufreq/policy4/scaling_governor
sudo echo 1416000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed
sudo echo 1800000 > /sys/devices/system/cpu/cpufreq/policy4/scaling_setspeed

# 查看频率
cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq

据说CPU可以超频到2.2Ghz,需要修改dts文件,还未尝试
https://www.right.com.cn/forum/thread-4063361-1-1.html

参考

https://blog.csdn.net/ydyang1126/article/details/51140131

https://blog.csdn.net/jimmy0513/article/details/108800015

https://blog.csdn.net/weixin_34331102/article/details/85942479?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3.pc_relevant_default&utm_relevant_index=6

https://blog.csdn.net/ibless/article/details/82431101

https://blog.csdn.net/test1280/article/details/87993669?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7EHighlightScore-2.queryctrv2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7EHighlightScore-2.queryctrv2&utm_relevant_index=5

https://blog.csdn.net/tbadolph/article/details/101363120

https://www.cnblogs.com/dakewei/p/13522594.html

https://blog.csdn.net/wdqqbyt4321/article/details/110132397

https://blog.csdn.net/weiqifa0/article/details/85337993

https://www.right.com.cn/forum/thread-4063361-1-1.html

你可能感兴趣的:(linux)