从MPU6050 + BMP180读取数据时,Raspberry pi锁定

时间:2015-08-27 18:18:58

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

我正在尝试为四轴飞行器编写飞行控制程序,我的所有代码都可以在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.1秒我设置BMP180来测量并获取它的数据,然后在屏幕上打印所有全局变量; MPU6050每秒只产生100个中断,我的程序及时处理它们,所以每0.1秒我得到最新的数据。这对于几个循环的正确结果非常有效,但随后在一个随机点上程序卡住了,而顶部显示它正在使用2个核心。 删除 1)中断处理 2)或每个循环中BMP180的量度 程序将完美运行,我测试它可以稳定运行至少半小时。 但是,结合两个它将总是在10秒或1分钟之后耗尽所有处理器功率。

我只是无法理解为什么,有人能指出什么是错的吗?或者至少教我如何调试导致锁定的原因(使用哪个工具,因为锁定发生在随机点并且程序太多,使用gdb逐步运行程序不是一个选项)< / p>

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

由于i2cdevlib的api远离pigpio,将所有这些代码移植到纯粹的pigpio并不是一件容易的事。目前我将使用pthread互斥锁,只允许一个线程同时访问i2c。