linux串口数据丢失--中断绑定CPU优化
问题现象
机器在户外测试时, 出现轮速记丢包的现象
- 小概率出现 50Hz丢失1~2帧
- 极小概率出现 0.1~0.3秒内没有底盘数据
问题导致slam定位会漂, 需要优化处理此问题.
验证与测试
问题1: 底盘串口 一个数据帧(head–data–crc) 被分片2~3报文
解决方法: 检测到head之后, 解析data_len, 读取剩余的字节
问题2: 极小概率, 帧head 不在头部, 即buf[0], buf[1]不是head
解决方法: 内存搜索head, 若匹配到
1.使用memmove移到buf[0]
2.使用p_head 指向buf中的head
验证1: 压力测试
开发板运行stress --cpu 6 , 模拟cpu高负载场景
-->结果: 未出现数据丢失
验证2: 回环测试
1. PC模拟串口数据, 给开发板发串口数据.
2. 开发板运行stress --cpu 6, 给cpu增加负载.
-->结果: 数据未丢失
怀疑1: 串口线过长
1.硬件改线. --无优化效果
2.更改串口通信的波特率bps. --无优化效果
怀疑2: 没有发送数据
发送定位,感知信息给MCU, MCU做导航处理, 处理不及时导致丢包.
1. MCU上报数据协议添加: 时间戳, 序列号.
–> 通过序列号调试发现, 确实丢失报文, 丢失的序列号, 丢失时间戳, 与数量 对的上.
2. 硬件信号上的确认
—> 1. 逻辑分析仪器, 捕捉信号分析. --未进行
2.PC接入串口, 看是否有数据丢失. --未进行
小结
- 给CPU加负载, 测试没有复现问题
- 硬件接线问题排除. -->验证2(回环测试) + 怀疑1(串口线过长)排除.
- 怀疑MCU处理速度慢, 来不及上报数据.
–>没有进行1.逻辑逻辑分析仪 捕捉信号, 解析判断
2.PC串口接RX, 尝试解析串口数据, 从第3方外设确认是否丢包
无法确认是否MCU有没有发送报文.
绑定中断, 绑定CPU 优化方法
柳暗花明的提示点1: 压力测试方法
1. 同事进行拷机测试, 尝试把SOC的温度, 提高到95度, 进行7x24小时老化, 稳定性测试.
2. 得知只是CPU压力测试, 无法把SOC温度提到最高, 给了我一个cpu+npu+gpu的压力测试工具, 极限压榨SOC.
使用压力测试工具, 串口帧率从50Hz降到30Hz.
默认 | 压力测试 |
---|---|
50Hz | 30Hz |
柳暗花明的提示点2: 绑定CPU核
1. 同事负责深度相机数据上报, 说绑定CPU核, 可以稳定帧率
绑定CPU亲和性API
#define _GNU_SOURCE
#include <sched.h>
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(3, &mask);
if (sched_setaffinity(0, sizeof(cpu_set_t), &mask) == -1){
return 0;
}
测试:
压力测试工具 + 绑定CPU核
测试结果如图
默认 | 压力测试 | 压力测试+绑定CPU核心 |
---|---|---|
50Hz | 30Hz | 45Hz |
调试时, top查看负载时, 发现 0.5 si
hi 表示硬件中断
si 表示软件中断
查看中断使用情况
cat /proc/interrupts
可以看到, irq中断默认在cpu0上触发.
尝试 将 irq中断绑定到指定的cpu核心上.
串口设备为ttyS0, 查看ttyS0的中断号
cat /proc/interrupts| grep tty
ttyS0的中断号为28, 绑定中断号28到cpu2
sudo echo 0x4 > /proc/irq/28/smp_affinity
确认修改是否成功
cat /proc/irq/28/smp_affinity
04
运行程序, 查看中断触发情况
cat /proc/interrupts| grep -E "tty|CPU"
可以看到, 中断号irq28在cpu2上触发
测试结果
默认 | 压力测试 | 压力测试+绑定CPU核心 | 压力测试+irq中断绑定CPU |
---|---|---|---|
50Hz | 30Hz | 45Hz | 46.5 |
方案对比测试
通过上面分析验证测试, 找到两种优化方案
- 进程绑定CPU核
- irq 中断绑定CPU核
增加一个对比测试 - 进程绑定CPU + 中断绑定CPU核
ttyS0 底盘串口, ttyS3 IMU串口, 测试结果如下
测试结论:
中断irq绑定CPU >= 进程绑定CPU >= 中断绑定CPU+进程绑定CPU
总结
- 怀疑串口数据丢失, 应该使用 逻辑分析仪, 第三方串口工具接受RX 验证数据是否丢失.
- 高CPU负载不能复现问题, 可以从io负载, irq中断 使用等情况分析.
参考链接
中断分配:
https://developer.aliyun.com/article/64868
https://blog.csdn.net/ysdaniel/article/details/8779084
修改程序优先级: nice, setpriority
https://www.cnblogs.com/zhangxuan/p/6427533.html
进程绑定到CPU核上, 亲和性绑定
https://blog.csdn.net/Z_Stand/article/details/107883684
绑定CPU实例代码
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!