【问题标题】:Raspberry pi lockup when reading data from MPU6050+BMP180MPU6050+BMP180读取数据时树莓派死机
【发布时间】:2015-08-27 18:18:58
【问题描述】:

我正在尝试为四轴飞行器编写飞行控制程序,我的所有代码都可以在https://github.com/sgsdxzy/adc上找到

我的 10DOF 传感器板是 GY87,它由 3 个 I2C 设备组成:MPU6050、HMC5883L 和 BMP180(与 BMP085 相同的 API)。我使用 i2cdevlib 和 pigpio 从传感器获取数据。

MPU6050可以使用I2C从机,我将HMC5883L设置为从机。我成功地让 DMP 运行。 MPU6050 可以在 DMP 数据准备好时产生中断并将数据发送到 fifo。我将中断连接到一个 gpio,并使用 pigpio 的 gpioSetAlertFunc() 来监视它的状态。如果产生中断,我的程序将读取 fifo 并获取 DMP 数据,然后将它们写入一些(线程安全的)全局变量。仅此一项就运作良好。 BMP180 是一个比较简单的设备,你设置一些寄存器来改变模式并等待一段时间,然后读取其他寄存器得到结果。仅此一项也很有效。

但是,当我将两者结合起来时,发生了一个随机的系统锁定:我设置了中断处理程序,然后进入一个循环:每 0.1 秒我设置 BMP180 测量并获取它的数据,然后在屏幕上打印所有全局变量; MPU6050 每秒只产生 100 个中断,我的程序及时处理它们,所以每 0.1s 我得到最新的数据。这对于几个循环的正确结果非常有效,但随后程序在随机点卡住,并且顶部显示它正在使用 2 个内核。 删除任何一个 1) 中断处理 2) 或每个循环中 BMP180 的测量值 该程序将完美运行,我测试它可以稳定运行至少半小时。 但是将两者结合起来,它总是会在 10 秒或 1 分钟后耗尽所有处理器能力。

我只是不明白为什么,有人可以指出什么问题吗?或者至少教我如何调试导致锁定的原因(使用哪个工具,因为锁定发生在随机点并且程序太多,使用 gdb 逐步运行程序不是一种选择)

提前致谢。

【问题讨论】:

    标签: c++ linux multithreading i2c raspberry-pi2


    【解决方案1】:

    好吧,我发现 i2cdevlib 不是线程安全的,导致了这个问题。

    由于 i2cdevlib 的 api 与 pigpio 相距甚远,将所有这些代码移植到纯 pigpio 并非易事。目前我将使用 pthread 互斥锁,让只有一个线程同时访问 i2c。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多