代码之家  ›  专栏  ›  技术社区  ›  Light

从MPU6050+BMP180读取数据时树莓pi锁定

  •  0
  • Light  · 技术社区  · 9 年前

    我正在尝试为四旋翼机编写飞行控制程序,我的所有代码都可以在 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.1秒我就会得到最新的数据。这对于几个循环的正确结果非常有效,但在一个随机点上,程序卡住了,顶部显示它使用了2个内核。 删除其中之一 1) 中断处理 2) 或每个回路中BMP180的测量值 程序将完美运行,我测试它至少可以稳定运行半小时。 但将两者结合在一起,无论是10秒还是1分钟,它都会耗尽所有处理器的能量。

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

    提前感谢。

    1 回复  |  直到 9 年前
        1
  •  0
  •   Light    9 年前

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

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