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

Raspberry pi lockup when reading data from MPU6050+BMP180

本文关键字:数据 锁定 读取 MPU6050+BMP180      更新时间:2023-10-16

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

上找到

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

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

然而,当我把两者结合起来时,发生了一个随机的系统锁定:我设置中断处理程序,然后进入一个循环:每0.1s我设置BMP180来测量并获得它的数据,然后在屏幕上打印所有全局变量;MPU6050每秒只产生100个中断,我的程序及时处理它们,所以每0.1s我就得到最新的数据。这在几个循环中工作得很好,结果正确,但随后在一个随机点,程序卡住了,top显示它使用了2个内核。要么删除1)中断处理2)或各回路BMP180的测量值程序可以完美地运行,我测试过它可以稳定运行至少半个小时。但如果同时使用两种方法,它总是会在10秒或1分钟后卡住,耗尽所有处理器的电量。

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

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

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