linux串口数据丢失--中断绑定CPU优化

问题现象

机器在户外测试时, 出现 轮速记 丢失的现象

  • 小概率出现 50Hz丢失1~2帧
  • 极低概率出现 0.1~0.3秒内没有底盘数据
    RK3588s开发版
    串口示意
    此问题导致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增加负载.
-->结果: 数据未丢失

验证3: 怀疑串口线过长

1.怀疑串口线过长, 硬件改线改短.  --无优化效果
2.更改串口通信的波特率bps. --无优化效果

验证4: 怀疑MCU没有发送数据

发送定位,感知信息给MCU做导航处理, 怀疑处理不及时导致丢包.

  1. 验证方法: MCU上报数据协议添加: 时间戳, 序列号.
    <1 通过序列号调试发现, 确实丢失报文, 丢失的序列号, 时间戳与数量对的上.
  2. 硬件信号上的确认
    <1 逻辑分析仪器, 捕捉信号分析. --未进行
    <2 PC接入串口, 看是否有数据丢失. --未进行

小结

  1. 给开发板CPU加负载, 测试没有复现问题
    1. 排除硬件接线问题. -->验证2(回环测试) + 验证3(串口线改短)排除.
    2. 怀疑MCU处理速度慢, 来不及上报数据.
      需要进行
      1.逻辑逻辑分析仪 捕捉信号, 解析判断
      2.PC串口接RX, 尝试解析串口数据, 从第3方外设确认是否丢包

中断绑定CPU优化方法

柳暗花明的提示点1: 压力测试方法
1. 同事进行拷机测试, 尝试把SOC的温度, 提高到95度, 进行7x24小时老化, 稳定性测试.
2. 得知只进行CPU压力测试, 无法把SOC温度提到最高, 给了我一个cpu+npu+gpu的压力测试工具, 极限压榨SOC.

使用压力测试工具
–> 测试结果: 串口帧率从50Hz降到30Hz.

默认压力测试
50Hz30Hz

柳暗花明的提示点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核心
50Hz30Hz45Hz

神器的发现点

调试时, top查看负载时, 发现 0.3 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
50Hz30Hz45Hz46.5

方案对比测试

通过上面分析验证测试, 找到如下的优化方案

  1. 增加程序的优先级
  2. 进程绑定CPU核
  3. irq 中断绑定CPU核
    增加一个对比测试
  4. 进程绑定CPU + 中断绑定CPU核

开发有多个外设, 选取两个外设做压力测试.
ttyS0 底盘串口, ttyS3 IMU串口, 测试结果如下
在这里插入图片描述

测试结论:
中断irq绑定CPU >= 进程绑定CPU >= 中断绑定CPU+进程绑定CPU

总结

  1. 怀疑串口数据丢失, 应该使用 逻辑分析仪, 第三方串口工具接入RX 验证数据是否丢失.
  2. 高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实例代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL练题笔记-子查询-部门工资前三高的所有员工

这个系列的最后一个&#xff0c;也是所有的50题的第一个困难题&#xff0c;看着就有点吓人啧啧啧。 一、题目相关内容 1&#xff09;相关的表和题目 2&#xff09;帮助理解题目的示例&#xff0c;提供返回结果的格式 二、自己初步的理解 将每个部门分组&#xff0c;然后用ra…

搬运机器人行业分析:中国市场销量已达到6.3万台左右

近年来&#xff0c;随着我国人口红利的逐渐消失&#xff0c;企业用工成本不断上涨&#xff0c;各种工业机器人获得了广泛的应用。焊接、装配、切割、分拣、搬运等机器人的出现&#xff0c;不仅通过“机器换人”解放了企业和行业的生产力&#xff0c;更推动了产业发展由劳动密集…

Flink 有状态流式处理

传统批次处理方法 【1】持续收取数据&#xff08;kafka等&#xff09;&#xff0c;以window时间作为划分&#xff0c;划分一个一个的批次档案&#xff08;按照时间或者大小等&#xff09;&#xff1b; 【2】周期性执行批次运算&#xff08;Spark/Stom等&#xff09;&#xff1b…

MongoDB表的主键可以重复?!MongoDB的坑

MongoDB表的主键可以重复&#xff1f;&#xff01; 眼见为实&#xff1f; 碰到一个奇怪的现象&#xff0c; MongoDB的一个表居然有两个一样的_id值&#xff01; 再次提交时&#xff0c;是会报主键冲突的。那上图&#xff0c;为什么会有两个一样的_id呢&#xff1f; 将它们的…

C++刷题 -- 哈希表

C刷题 – 哈希表 文章目录 C刷题 -- 哈希表1.两数之和2.四数相加II3.三数之和&#xff08;重点&#xff09; 当我们需要查询一个元素是否出现过&#xff0c;或者一个元素是否在集合里的时候&#xff0c;就要第一时间想到哈希法; 1.两数之和 https://leetcode.cn/problems/two…

深入源码解析ArrayList:探秘Java动态数组的机制与性能

文章目录 一、 简介ArrayList1.1 介绍ArrayList的基本概念和作用1.2 与数组的区别和优势 二、 内部实现2.1 数据结构&#xff1a;动态数组2.2 添加元素&#xff1a;add()方法的实现原理2.3 扩容机制&#xff1a;ensureCapacity()方法的实现原理 三、 常见操作分析3.1 获取元素&…

0基础学习VR全景平台篇第127篇:什么是VR全景/720全景漫游?

“全景”作为一种表现宽阔视野的手法&#xff0c;在很久之前就得到了普遍的认同。北宋年间&#xff0c;由张择端绘制的《清明上河图》就是一幅著名的全景画。摄影术出现后&#xff0c;全景摄影也随之而生。 到今天&#xff0c;全景拍摄不再被专业摄影师所独享&#xff0c;广大…

C#的线程技术及操作(Thread类)

目录 一、线程基础 1.单线程 2.多线程 &#xff08;1&#xff09;多线程的缺点 &#xff08;2&#xff09;多线程的缺点 二、线程操作之Thread类 1. Thread类的相关方法和属性 &#xff08;1&#xff09;示例源码 &#xff08;2&#xff09;生成效果 2.创建线程Star…

代码随想录算法训练营 | day50 动态规划 123.买卖股票的最佳时机Ⅲ,188.买卖股票的最佳时机Ⅳ

刷题 123.买卖股票的最佳时机Ⅲ 题目链接 | 文章讲解 | 视频讲解 题目&#xff1a;给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意&#xff1a;你不能同时参与多笔…

获取CAD图元名及图元信息(circle为例,用于选择集,对应dxf组码)

在CAD编程中往往需要用选择集&#xff0c;我们往往不知道相应图元对应的名称具体名字。比如我想选择所有的圆&#xff0c;ftype0,fdata应该是什么呢&#xff1f;是circle&#xff0c;acdbcircle&#xff0c;还是acadcircle? circle是一个对象&#xff0c;circle的vba类名为Ac…

SAP 散装物料简介

散装物料(Bulk Material),也叫做间接物料(Indirect Material),是一般企业在库存管理时常见的一种物料形式。散装物料专指那些价值小、消耗量大、消耗率高的物料件。这些物料组件同样服务于企业的生产活动,并且在企业的工作中心中被生产活动直接消耗(如螺丝钉、润滑油、…

海底数据中心:数据存储未来发展的新方向

随着信息技术的快速发展&#xff0c;数据需求量呈指数级增长&#xff0c;数据中心作为数据处理和存储的重要基础设施&#xff0c;其地位和作用愈发凸显。然而&#xff0c;传统的数据中心由于能耗大、碳排放高、土地占用等问题&#xff0c;已经难以满足可持续发展的需求。在此背…

Swin UNetR:把 UNet 和 Swin Transformer 结合

Swin UNetR&#xff1a;把 UNet 和 Swin Transformer 结合 网络结构使用指南 前置知识&#xff1a;Swin Transformer&#xff1a;将卷积网络和 Transformer 结合 Swin UNetR 结合 Swin Transformer 的上下文建模能力和 U-Net 的像素级别预测能力&#xff0c;提高语义分割任务的…

初始数据库 - 了解数据库

centos 7 版本当中安装 mysql 安装与卸载中&#xff0c;⽤⼾全部切换成为root&#xff0c;⼀旦 安装&#xff0c;普通⽤⼾是可以使用的。 卸载不需要的环境 首先&#xff0c;在安装之前&#xff0c;要先确定你当前系统当中是否已经有了mysql 的环境&#xff0c;如果你不想卸…

maui下sqlite演示增删改查

数据操作类 有分页 todoitemDatabase.cs&#xff1a; using SQLite; using TodoSQLite.Models;namespace TodoSQLite.Data {public class TodoItemDatabase{SQLiteAsyncConnection Database;public TodoItemDatabase(){}// 初始化数据库连接和表async Task Init(){if (Databa…

PPT插件-好用的插件-字距快速设置-大珩助手

字距快速设置 包含两端对齐、段首缩进、取消缩进、字间距、行间距、段后距 段首缩进 每次缩进两个字符&#xff0c;可对选中的文字、选中的多个文本对象两个层级操作 取消缩进 将缩进取消&#xff0c;可对选中的文字、选中的多个文本对象两个层级操作 字间距 预设了常用…

【GlobalMapper精品教程】065:连接SQL Server空间数据库并加载数据

Global Mapper是一个地图创建和编辑工具,无法像ArcGIS一样,基于SQL Server等大型关系型数据库。它本身也并不直接连接数据库。但是,Global Mapper可以与其他软件集成,以从数据库中获取数据并在地图上显示。本文讲述Global Mapper连接SLQ Server数据库的方法。 一、创建数据…

深入理解 Goroutines 和 Go Scheduler

本文将重点帮助您了解 Golang 中的 goroutines。Go 调度程序如何工作以在 Go 中实现最佳并发性能。我会尽力用简单的语言解释,这样你就可以理解了。 我们将介绍什么是操作系统中的线程和进程,什么是并发,为什么实现并发很难,以及 goroutines 如何帮助我们实现并发。然后,…

AtCoder ABC周赛2023 12/10 (Sun) D题题解

目录 原题截图&#xff1a; 题目大意&#xff1a; 主要思路&#xff1a; 注&#xff1a; 代码&#xff1a; 原题截图&#xff1a; 题目大意&#xff1a; 给定两个 的矩阵 和 。 你每次可以交换矩阵 的相邻两行中的所有元素或是交换两列中的所有元素。 请问要使 变换至…

JVM虚拟机系统性学习-垃圾回收器Serial、ParNew、Parallel Scavenge和Parallel Old

垃圾回收器 有 8 种垃圾回收器&#xff0c;分别用于不同分代的垃圾回收&#xff1a; 新生代回收器&#xff1a;Serial、ParNew、Parallel Scavenge老年代回收器&#xff1a;Serial Old、Parallel Old、CMS整堆回收器&#xff1a;G1、ZGC Serial&#xff1a;串行回收 Serial是…