0.环境:arm CPU 带有IIC控制器作为slave端,带有调试串口。

1.bug表现:IIC slave 在系统启动后概率挂死,导致master无法detect到slave。

猜测1:认为IIC device程序有问题

检查1:查看程序发现有可能溢出的部分,使用IIC 工具刷过量数据到slave,未出问题。

猜测2:认为IIC device寄存器进入异常状态未能恢复

检查2:检查正常IIC寄存器和异常状态IIC寄存器,未能发现问题。

猜测3:时钟分频问题

检查3:询问同事,答固定分频。

猜测4:看波形分析

检查4:波形未量到,测量波形导致通信异常,部分设备破坏,放弃该方法。

2.发现新情况:系统启动过程中如果调试串口有数据输入,问题会概率出现。如果串口没有输入则多次测试不会出现问题。

猜测1:串口中断导致IIC初始化时被打断产生问题。

检查1:删除调试串口设备树节点,发现IIC启动100%出现问题 T-T。

猜测2: 100%复现的问题和之前的概率出现的问题相同

检查2:检查寄存器,检查设备detect 表现,认为是相同问题。

3.删除调试串口,IIC受影响的原因?

删除串口设备树节点,IIC device 必出问题。

猜测1:怀疑调试串口外部硬件电平高低导致IIC外设受影响

检查1:检查原理图,未发现影响的可能性。

猜测2:怀疑串口初始化部分处理了部分IIC设备依赖的初始化(导致不初始化串口IIC不能正常工作)。

检查2:查看串口初始化代码未能发现有值得注意的初始化。

猜测3:怀疑串口初始化影响公共寄存器间接影响IIC。

检查3:发现公共寄存器IIC div分频部分和正常工作的分频不一样,改回后问题解决。

4.公共寄存器怎么被修改的?

删除串口设备后公共寄存器值不正常,串口收到数据后公共寄存器值不正常。

猜测1:调试串口或IIC代码异常导致寄存器值被修改。

检查1:增加打印,发现问题原因在于IIC初始化过程中分频寄存器设置失败。但是同样方法在IIC device端初始化时设置该寄存器是成功的。

5.公共寄存器为什么不能写入?

猜测1: 特定配置下IIC 分频寄存器为只读

检查1:芯片设计方核实不存在这样的设计。

检查1:在写入分频寄存器前增加打印,dump所有公共寄存器。和正常公共寄存器做比较,未发现问题。写入IIC分频器成功。

猜测2:增加打印信息后写入成功为必现,去掉打印会写入不成功。

检查2:证实猜测。

猜测3:写入成功和读取公共寄存器相关

检查3:减少dump范围,小范围dump写入失败,大范围dump写入成功。

猜测4:写入成功和写入时间相关

检查4:dump的寄存器次数不变dump相同寄存器。证实写入成功与写入时间相关。

6.为什么不能写入和时间相关?

思考:可能和时钟初始化相关,但是公共寄存器的时钟初始化状态dump是正常的。

猜测1:dump过程中时钟初始化完成(证据:增加dump后写入正常)。

检查1:减少dump范围,发现公共寄存器的mpll稳定寄存器未稳定。

猜测2:时钟相关初始化未完成导致写入失败。

检查2:根据时钟依赖,在写入前增加等待,同时去掉打印,写入成功。

去掉串口设备导致问题100%复现,原因是串口不用初始化导致IIC 时钟分频更早初始化,写入IIC分频寄存器失败。

总结:

1.解决问题过程中,曾经怀疑过时钟分频问题但是未检查寄存器,导致问题解决时间拉长。

2.最开始未能考虑问题和时间相关的情况,如果直接思考该可能性,预计提高解决问题速度。

IIC挂死问题解决过程的更多相关文章

  1. NFS Server宕机后,NFS Client主机上df命令挂死

    方法1: 使用root用户:Oracle@NDMCDB05:~> su -Password: NDMCDB05:~ # cat /etc/mtab /dev/sda2 / reiserfs rw ...

  2. 应用程序出现挂死,.NET Runtime at IP 791F7E06 (79140000) with exit code 80131506.

    工具出现挂死问题 1.问题描述 工具出现挂死问题,巡检IIS发现以下异常日志 现网系统日志: 事件类型:    错误 事件来源:    .NET Runtime 描述: Application: Di ...

  3. 关于用strace工具定位vrrpd进程有时会挂死的bug

    只做工作总结备忘之用. 正在烧镜像,稍总结一下进来改bug遇到的问题. 一个项目里要用到L3 switch的nat,vrrp功能,但实地测试中偶然出现write file挂死的情况,但不是必现.交付在 ...

  4. I2C 挂死,SDA一直为低问题分析【转】

    转自:https://blog.csdn.net/winitz/article/details/72460775 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...

  5. MySQL 连接为什么挂死了?

    摘要:本次分享的是一次关于 MySQL 高可用问题的定位过程,其中曲折颇多但问题本身却比较有些代表性,遂将其记录以供参考. 一.背景 近期由测试反馈的问题有点多,其中关于系统可靠性测试提出的问题令人感 ...

  6. MySQL 连接为什么挂死了

    声明:本文为博主原创文章,由于已授权部分平台发表该文章(知乎.云社区),可能造成发布时间方面的困扰. 一.背景 近期由测试反馈的问题有点多,其中关于系统可靠性测试提出的问题令人感到头疼,一来这类问题有 ...

  7. 用strace处理程序异常挂死情况

    1. 环境: ubuntu 系统 + strace + vim 2.编写挂死程序:(参考博客) #include <stdio.h> #include <sys/types.h> ...

  8. 记录sqoop同步失败问题解决过程,过程真的是很崎岖。(1月6日解决)

    记录sqoop同步失败问题解决过程,过程真的是很崎岖.事发原因:最近突然出现sqoop export to mysql时频繁出错.看了下日志是卡在某条数据过不去了,看异常.看sqoop生成的mr并未发 ...

  9. java多线程解决应用挂死的问题

    这两天为了定位JBOSS老是挂死的问题,学习了一下JAVA多线程方面的知识,在此总结一下 1.在Java程序中,JVM负责线程的调度.线程调度是指按照特定的机制为多个线程分配CPU的使用权. 调度的模 ...

随机推荐

  1. 第12章、乐活人生的ABCDE

    目录 第12章.乐活人生的ABCDE 什么时候该乐观 让自己乐观的ABC 确认ABC 你的ABC记录 反驳和转移注意 转移注意 反驳 保持距离 学习与自己争辩 证据 其他可能性 暗示 用处 你的反驳记 ...

  2. NetworkX系列教程(5)-查看graph的信息

    小书匠Graph图论 有时候graph建好后,我们并不清除该graph内节点的,边的信息,这就需要调用函数去查看了. 目录: 6.查看Graph的信息 6.1查看graph内节点,边的 6.2查看gr ...

  3. spring boot 对某个接口进行次数限制,防刷。简易版。demo。

    一般的项目 如果没有做防刷 容易被人爆接口 或者就是说没有做token防刷过滤. 容易被人用正常的token刷接口.有些token非一次性. 用户登录之后生成token会有一个过期时间,但一般没有做频 ...

  4. Centos 7 安装 Haproxy

    [环境] Centos 7.2 Web1:192.168.136.170 web2:192.168.136.166 Haproxy:192.168.136.173 [web服务器1.2] 安装Ngin ...

  5. 阿里云服务器linux系统上 安装node环境

    今天将阿里云服务器重windows系统重置成了linux系统, 点击上面的实例名称,进入到 点击  更换系统盘   选择linux 的centos版本(操作前需要  停止实例) 弄好后,启动实例 下面 ...

  6. 在本机上用IO流实现复制粘贴功能

    /** * 复制文件夹 * @param sourcePath * @param targetPath * @throws IOException */ public void copyFolder( ...

  7. AT2306 Rearranging

    有一个显然的,就是不互质的数的相对位置是不会改变的,那么我们把它们放到一个连通块里面去,然后我交换就是交换两个里面最小的对吧.直接连起来然后跑\(TopSort\)就行了. #include<s ...

  8. 爬虫界的福利--touchRobot,机器模拟触碰滑动库(已开源)

    此插件能干什么? 一句话概括:通过程序主动触发移动端滑动.拖拽.触碰等操作 插件有什么用呢? 可以用于爬虫,也可以用于自动化测试以及程序演示 插件演示地址 (从网上扒了一个canvas绘图的demo, ...

  9. C语言中的指针笔记

    C语言指针 得到变量的地址 可以使用&运算符找到变量保存在内存中的位置 int x = 1; printf("x的内存地址是"%p\n",&x) %p格式 ...

  10. linux 安装nginx -查看 linux的环境变量

    我发现在linux上面安装linux很简单 在CentOS release 6.5 上面先看一下操作系统的版本: lsb_release -a 直接执行 yum install nginx 系统自动的 ...