Gsensor加速度传感器数据异常及概率性卡死

关注 点赞 收藏 不错过精彩内容

图片

大家好,我是硬核王同学

今天给大家分享下,经过三个多月解决的Gsensor加速度传感器数据异常及概率性卡死的问题。

数据异常

故事的开始是来自一位客户的投诉,说机器放在桌面上不去动它,语音就会播报“触发碰撞”。

拿到log后,发现某时间段内gsensor数据出现异常,突然增大了3倍左右。

图片

我们就怀疑可能是高温导致的,所以拿同样的机器去做高温测试,但并没有发现异常。

这种问题就很麻烦了,没有办法复现,很难定位到真正的问题点。

这个问题就暂时被搁置了几天,正好后来有一位同事,拿测试的机器做开关机实验时,发现突然异常播报“触发碰撞”,马上把log抓下来看,也是同样的问题,数据出现异常,突然增大了3倍。

这就很奇怪,极有可能是一个概率性问题,无法从现有的log定位到问题点。

所以我们立马排查Gsensor附近的代码,发现有很多问题,比如通过IIC读取Gsnesor数据没有出错处理、没有IIC内部出错的打印、部分打印只能打到串口上等等。

再次进行开关机测试,还是有概率发生数据出现异常,并且增大了3倍!

这时不得不怀疑,是不是Gsensor传感器的某个寄存器的值发生了改变,不然为什么数据会突然增大3倍?

所以又增加了针对Gsensor传感器寄存器的打印,再次复测。

果然,排查到问题点!负责测量加速度计量程范围的寄存器的值突然发生改变!从0x02变成0x40!

图片

图片

并且是在开机的某一个时间段内经常复现,后来看代码才知道,是某个同事添加了部分代码,导致Gsensor初始化了两遍!

优化代码后复测,果然没有类似的情况发生了

但你以为事情结束了?没那么简单。

传感器卡死

再经过多次复测后,又出现个大bug,这次连读取的Gsensor数据居然都没了?

图片

这个bug异常严重,直接会导致我们的碰撞上报功能无法使用!

不过还好我之前留了一手,把各种出错的log都加到代码里了,一看log,居然是IIC读失败?

图片

这个问题也是概率性的,而且概率极低,既然发现了这个问题,我们先添加个出错处理,让机器重启,看看会不会恢复。

但再次测试后,只有1台机器重启恢复,剩下3台机器都没有恢复。

这就很难办,如果无法恢复,机器是无法正常使用的!

后来还是经验丰富的领导分析,是我们的gsensor传感器在重启时没有下电导致的概率性卡死,只有在关机时,才会将芯片的电源完全关闭。

后来测试,果然关机后就可以解决这样的问题。

但出错的原因还是没有排查出来呀!

所以我们又来来回回又做了两个月的测试,期间不仅去掉各种线程、不同的碰撞算法、读取IIC的频率等等。

最终发现,会上传碰撞视频和数据的斑马算法比普通碰撞算法更容易触发IIC读失败!

针对这一点查看log,我们又发现是在上传碰撞视频时更容易触发IIC读失败!

图片

所以,我们把代码改为在上传视频时,停止读取Gsensor传感器。

测试下来果然是这里的问题,只要在这时间段内停止读取IIC,IIC读失败的概率就大大降低!

但这个问题也很奇怪,为什么上传视频时,就会导致IIC读失败呢?难道是在上传时,CPU使用不够了吗?

带着这个疑问,计算了一下CPU的空闲率,大概在48%,很明显是够用的。

为什么呢?

这时还是经验丰富的领导分析,很有可能是优先级的问题。

  1. 在IIC通信失败的问题上,在相同优先级的任务中,视频上传过程会额外占用约15%的CPU资源。

  2. 鉴于我们的系统基于实时操作系统(RTOS),它对线程的时间分配管理有严格的规定。这可能导致分配给IIC通信的时间片不足,进而引起通信时序错误,最终导致数据读取失败。

在实时操作系统(RTOS)中,CPU资源的分配和管理是通过时间片和优先级来实现的。时间片是操作系统分配给每个任务的一段CPU使用时间。RTOS系统会根据任务的优先级和时间片来动态分配CPU资源,以确保所有任务都能在规定的时间内得到处理。

当系统中有多个任务运行在同一优先级时,RTOS会尝试平等地分配时间片给这些任务。然而,如果某个任务(如视频上传)占用了较多的CPU资源,那么留给其他任务(如IIC通信)的时间片就会减少。这可能导致IIC通信任务无法在有限的时间内完成数据传输,从而引发通信时序错误。

在RTOS系统中,每个线程的时间片和栈空间大小都是预先分配好的,以确保系统的实时性和稳定性。如果某个线程的时间片不足以支持其正常运行,就可能导致任务执行不完整或超时,进而影响整个系统的稳定性和性能。

最后,我们将IIC读取Gsensor传感器的线程优先级提高,复测再也没有IIC读失败了!这个问题终于完美地解决了!

作 者 :硬核王同学

------ END ------

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

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

相关文章

【CSS】“flex: 1“有什么用?

flex 属性的组成 flex 属性是一个复合属性,包含以下三个子属性: flex-grow:决定元素在容器中剩余空间的分配比例。默认值为 0,表示元素不会扩展。当设置为正数时,元素会按照设定比例扩展。flex-shrink:决…

【STM32】基于SPI协议读写SD,详解!

文章目录 0 前言1 SD卡的种类和简介1.1 SD卡的种类1.2 SD卡的整体结构1.3 SD卡运行机制——指令和响应2 SD卡的通信总线2.1 SDIO2.2 SPI3 硬件连接4 代码实践【重点】4.1 HAL库移植4.2 标准库移植4.3 遇到的问题和解决方案5 扩展阅读0 前言 因为项目需要,使用stm32读写sd卡,这…

软件测试面试题(800道)【附带答案】持续更新...

(2024版)面经 详细笔记部分展示: 测试基础(102页) Linux基础(38页) MySQL(63页) web测试(21页) API测试(46页) APP测试&…

带你掌握springboot集成SpringSecurity安全框架

前言: Spring Security 是 Spring 家族中的一个框架,提供了一套 Web 应用安全性的完整解决方案。一般来说,系统的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。 认证…

【2024最新】基于springboot+vue的闲一品交易平台lw+ppt

作者:计算机搬砖家 开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:Java精选实战项…

修改yolo格式的labels类别、删除yolo格式的labels类别

1、项目中,数据集的类别顺序有时会改变,例如a项目类别1是b项目的类别3,,需要用a项目的数据集,只需要改类别就行,就不需要重新标注了,例如a项目的classes是 b项目的classes是 a项目的数据可以用…

Java项目实战II基于微信小程序的个人行政复议在线预约系统微信小程序(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 基于微信小…

Kubernetes在容器编排中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Kubernetes在容器编排中的应用 Kubernetes在容器编排中的应用 Kubernetes在容器编排中的应用 引言 Kubernetes 概述 定义与原理 …

D67【python 接口自动化学习】- python基础之数据库

day67 Python操作MySQL基础使用 学习日期:20241113 学习目标:MySQL数据库-- 136 Python操作MySQL基础使用 学习笔记: pymysql 创建MySQL的数据库链接 执行sql语句 总结 Python中使用第三方库:pymysql来操作MySQL,…

GitLab基于Drone搭建持续集成(CI/CD)

本文介绍了如何为 Gitee 安装 Drone 服务器。服务器打包为在 DockerHub 上分发的最小 Docker 映像。 1. 准备工作 创建OAuth应用 创建 GitLab OAuth 应用。Consumer Key 和 Consumer Secret 用于授权访问极狐GitLab 资源。 ps:授权回调 URL 必须与以下格式和路径匹配&…

python实战(八)——情感识别(多分类)

一、任务目标 本文使用的是来自Kaggle的一个情感识别数据集,这个数据集的总数据量是5934条,标签为anger、fear、joy三种情感的其中一种,很明显是一个多分类任务。这里,我们将使用微调技巧进行深度学习建模,同时我们会比…

【学习笔记】数据结构(七)

图 文章目录 图7.1 图的定义和术语7.2 图的存储结构7.2.1 数组表示法 - 邻接矩阵(Adjacency Matrix)7.2.2 邻接表 -(链式)表示法(Adjacency List)7.2.3 十字链表(Orthogonal List)7.2.4 邻接多重表(Adjacent MultiList) 7.3 图的遍…

scrapy爬取中信证券销售金融产品信息

import scrapyclass CsProductSpider(scrapy.Spider):name "cs_product"allowed_domains ["www.cs.ecitic.com"]start_urls ["http://www.cs.ecitic.com/newsite/cpzx/jrcpxxgs/zgcp/index.html"]def parse(self, response):# 提取数据的逻辑…

power bi中的related函数解析

在Power BI中,RELATED函数是一种用于检索相关表中数据的函数。它用于在一个表中检索与当前行相关联的另一个表中的数据。 销售成本 [销售数量]*related(商品表[进价])

Ollama的安装以及大模型下载教程

简介 Ollama是一个开源的大型语言模型服务工具,它帮助用户快速在本地运行大模型。通过简单的安装指令,用户可以执行一条命令就在本地运行开源大型语言模型, Ollama极大地简化了在Docker容器内部署和管理LLM的过程,使得用户能够快…

算法演练----24点游戏

给定4个整数,数字范围在1~13之间任意使用-*/(),构造出一个表达式,使得最终结果为24, 方法一 算法分析:加括号和取出重复表达式 # 导入精确除法模块,使得在Python2中除法运算的行为更…

YUM 的使用

YUM 是一个用于 Fedora 和 Red Hat 以及 CentOS 操作系统的前端软件包管理器,它可以自动处理依赖关系并一次性安装所有必需的软件包。 镜像站点选择 1. 备份原有的镜像源配置文件 系统默认的 yum 镜像源配置文件存储在 /etc/yum.repos.d/ 目录下,可以…

第三十六章 Vue之路由重定向/404页面设置/路径模式设置

目录 一、路由重定向 1.1. 使用方式 1.2. 完整代码 1.2.1. main.js 1.2.2. App.vue 1.2.3. index.js 1.2.4. Search.vue 1.2.5. Home.vue 1.3. 运行效果 二、设定404错误页面 2.1. 使用方式 2.2. 完整代码 2.2.1. index.js 2.2.2. NotFound.vue 2.2.3. 运行效…

鸿蒙进阶篇-属性动画-animateTo转场动画

大家好啊,这里是鸿蒙开天组,今天我们来学习属性动画-animateTo&转场动画,咱们先来学习属性动画-animateTo 属性动画-animateTo 属性动画 animation是作为属性使用,而animateTo显示动画是一个系统的内置函数,可以…

[CKS] K8S ServiceAccount Set Up

最近准备花一周的时间准备CKS考试,在准备考试中发现有一个题目关于Rolebinding的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[CKS] K8S Netwo…