This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux:I2C 在重负载下崩溃、Linux 3.14.57-ti-r78

Guru**** 2541030 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/580026/linux-i2c-crashes-under-heavy-load-linux-3-14-57-ti-r78

工具/软件:Linux

大家好、我在进行高频 I2C 读取时遇到了 AM335X SoC (BeagleBone Black)的问题。 我使用内核为3.14.57-ti-r78的 Ubuntu Linux。 我尝试使用内置内核驱动程序在 i2c-1总线上连接 MPU6050加速计/陀螺仪来读取数据(使用中断)。 我已经使它运行得非常好、但当我将采样频率设置得足够高时、我开始得到以下误差:

3 月7日13:28:16 DL-EM01内核:[ 362.893943] OMAP-i2c 4802a000.i2c:SDA 卡在低电平、在 SCL 上驱动9个脉冲
3 月7日13:28:19 DL-EM01内核:[365.784033] OMAP_i2c 4802a000.i2c:SDA 卡在低电平、在 SCL 上驱动9个脉冲
3月 7日13:28:21 DL-EM01内核:[368.651978] OMAP_i2c 4802a000.i2c:控制器超时
3 月7日13:28:23 DL-EM01内核:[369.674012] OMAP_i2c 4802a000.i2c:SDA 卡在低电平、在 SCL 上驱动9个脉冲
3 月7日13:28:26 DL-EM01内核:[372.554164] OMAP_i2c 4802a000.i2c:SDA 卡在低电平、在 SCL 上驱动9个脉冲
BeagleBone 通常会冻结。 我尝试将 I2C 总线设置为400kHz、并确保总线上有相当长的空闲时间、因此似乎频率中断导致了这个问题?
我尝试使用 cpufreq-set -f 1GHz 强制频率,但这似乎使情况更糟。 奇怪的是、强制频率达到300MHz 的效果更好、尽管崩溃仍在几个小时内发生。
请提供任何帮助
谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Eric:

    我对内核版本(内核3.14.57-ti-r78)不是很熟悉。 从日志中我看到您遇到了 I2C 总线规范第3.1.16节"总线清零"中指定的行为(cache.nxp.com/.../UM10204.pdf)

    您能否与最新的 TISDK (内核4.4.3.2)中的驱动程序交叉检查 i2c 驱动程序:
    www.ti.com/.../PROCESSOR-SDK-AM335X
    或者使用最新的主线 i2c-omap.c 驱动程序(来自 kernel.org)?)

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、为了有趣、我尝试在 i2c-omap.c 中从主线内核修补到我的版本、现在我在 dmesg 中获得了这一点:

    [174.950636] OMAP-i2c 4802a000.i2c:仲裁丢失
    [175.965322]无法在虚拟地址0000003c 处处理内核 NULL 指针解除引用
    [175.965416] PgD = c0004000
    [175.965446][0000003c]* PgD=00000000
    [175.965500]内部错误:Oops:17 [#1]抢占 SMP ARM
    [175.965531]链接的模块:USB_f_industriu_serial usb_f_ecM g_multiusb_f_mass storage usb_f_nDIS u_ether libcomposix xfrm_user xfrm4_tunnel m4 ipcomp xfrm_ipcomp 支持4 AH4 af_key xfrm_algo 80iptinc
    (笑声)

    我猜它会尝试(并且失败)在恢复例程中获取指针、导致崩溃、这可能是与旧内核不兼容的结构类型。

    但为什么它首先需要恢复呢? 是什么会导致它像这样崩溃。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我修复了内核恐慌、恢复现在可以正常工作。 它似乎在500Hz 采样率下保持稳定、将继续执行测试...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您更新该主题。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    没问题! 不过、我仍然遇到崩溃的情况。 恢复比以前更好,但并非总是如此,最终会出现问题。 与之前差不多的错误消息一样-有时它会恢复、我可以继续从 MPU6050读取数据、有时它会恢复、MPU6050停止工作、并且很少系统完全崩溃。

    我认为 BeagleBone Black 根本无法处理如此多的硬件中断。 我想我现在一直在从用户空间偷去 MPU6050了。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我想了一个想法:如果我允许数据在读取前累加到 MPU6050的 FIFO 中、以便减少 ISR 中完成的工作量、该怎么办。 因此、现在我让它每40个中断执行一次读取、这大大降低了 CPU 负载、并且我可以清晰地看到示波器上的读取间隔、中间有一个很长的暂停时间(读取大约每秒14次)。

    我都很兴奋、但有时我仍然会收到一条«仲裁丢失»消息、其中 I2C 模块的 ISR 会消耗100% CPU 并导致系统挂起。 我注意到驱动程序`s 代码'i2c-omap.c'中的这条注释:

    /*
    *再次访问:我们应该中止信号传输、但总线会继续传输
    *仲裁中、我们目前无法从仲裁中恢复。
    *

    我仍然不知道导致仲裁丢失的原因是什么...可能是 MPU6050本身有错误? 如果它可以从它中恢复,这不会是一个大问题,但它看起来我是 SOL 在这里:(

    这似乎是一个信号完整性问题、因为我也从 MPU6050中获得了偶尔的 NACK、但我已经完全隔离了总线上的 MPU6050、仍然得到了误差...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因此、我稍微深入研究一下 I2C-OMAP 驱动程序代码、并意识到当它在超时执行 OMAP-i2c_reset 函数时、它只报告仲裁丢失时的错误。 因此、当仲裁丢失时、我将调用复位函数、它似乎落在了脚上。 它现在已经运行了5天、我没有一次崩溃、我仍然可以读取 I2C 数据。 不过、这是日志中的一个方的地狱、尤其是因为我添加了自己的调试消息:

    3月21日09:46:29 DL-EM01内核:[499343.068071] OMAP_i2c 4802a000.i2c:仲裁丢失
    3月21日09:46:29 DL-EM01内核:[499343.068149]总线恢复已完成!
    3月21日09:46:29 DL-EM01内核:[499343.187437]总线一直处于忙状态、正在恢复
    3月21日09:46:29 DL-EM01内核:[499343.187484]总线恢复完成!
    3月21日09:46:29 DL-EM01内核:[499343.187504]数据接收期间出错! -11DID 未从 FIFO 读取预期字节数、正在刷新
    3月21日09:46:29 DL-EM01内核:[499343.307432]总线一直处于忙状态、正在恢复
    3月21日09:46:29 DL-EM01内核:[499343.307462]总线恢复已完成!
    3月21日09:46:29 DL-EM01内核:[499343.407467] OMAP_i2c 4802a000.i2c:控制器超时
    3月21日09:46:29 DL-EM01内核:[499343.407518] inV-mpu6050 1-0069:Int_enable 失败-110
    3月21日09:46:40 DL-EM01内核:[499354.349696] OMAP_i2c 4802a000。i2c:仲裁丢失
    3月21日09:46:40 DL-EM01内核:[499354.349773]总线恢复完成!
    3月21日09:46:40 DL-EM01内核:[499354.349789]数据接收期间出错! -11DID 未从 FIFO 读取预期字节数、正在刷新
    3月21日09:46:41 DL-EM01内核:[499354.627969] MPU6050 FIFO 重置成功!
    3月21日09:47:14 DL-EM01内核:[499387.968782]在地址传输期间出错-121,重试....
    3月21日09:48:04 DL-EM01内核:[499437.710552] OMAP_i2c 4802a000.i2c:仲裁丢失
    3月21日09:48:04 DL-EM01内核:[499437.710719]总线恢复完成!
    3月21日09:48:04 DL-EM01内核:[499437.710735]数据接收期间出错! -11DID 未从 FIFO 读取预期字节数、正在刷新
    3月21日09:48:04 DL-EM01内核:[499437.987913] MPU6050 FIFO 重置成功!
    3月21日09:49:25 DL-EM01内核:[499519.319412]数据接收期间出错! -121Did 未从 FIFO 读取预期的字节数、正在刷写
    3月21日09:49:26 DL-EM01内核:[499519.577962] MPU6050 FIFO 重置成功!
    3月21日09:49:34 DL-EM01内核:[499528.20955]数据接收期间出错! -121Did 未从 FIFO 读取预期的字节数、正在刷写
    3月21日09:49:35 DL-EM01内核:[499528.467959] MPU6050 FIFO 重置成功!
    3月21日09:49:53 DL-EM01内核:[499547.261610]数据接收期间出错! -121Did 未从 FIFO 读取预期的字节数、正在刷写
    3月21日09:49:54 DL-EM01内核:[499547.517967] MPU6050 FIFO 重置成功!
    3月21日09:50:08 DL-EM01 avAHI-daemon [594]:接收到主机192.168.1.81的响应,接口'eth0.0'上的源端口62466无效
    3月21日09:50:20 DL-EM01内核:[499574.001976]在地址传输期间出现错误-121,正在重试....
    3月21日09:50:46 DL-EM01内核:[499600.236504]数据接收期间出错! -121Did 未从 FIFO 读取预期的字节数、正在刷写
    3月21日09:50:47 DL-EM01内核:[499600.487982] MPU6050 FIFO 重置成功!

    我真的很想知道所有这些错误的来源- I2C 总线本身似乎存在信号问题、但我尝试将 MPU6050直接连接到 BBB、但它没有帮助。 是否有 AM335x 专家想进入?

    谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Eric、

    我想通知您、我们可能会遇到相同的问题。

    我们有一个4.4骨 RT 内核。 在 i2c1器件上、我们连接了3个 i2c 从器件。 当我们进入地面 sda 或 SCL 时、我们随机地得到内核冻结、有时会解析、有时不会解析。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Eric。

    在测试期间、您是否尝试在 I2C-2总线上复制相同的行为?
    我们遇到类似的问题、但仅在 I2C-1总线上。

    此致。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我认为我们只在 I2C-1总线上进行了测试、I2C-2的引脚用于 IIRC。

    -Eric