Raspberry pi从MPU6050+BMP180读取数据时死机
Raspberry pi lockup when reading data from MPU6050+BMP180
我正在尝试为四轴飞行器编写一个飞行控制程序,我的所有代码都可以在 https://github.com/sgsdxzy/adc
上找到
我的10DOF传感器板是GY87,由3个I2C器件组成:MPU6050、HMC5883L和BMP180(与BMP085相同API)。我使用 i2cdevlib 和 pigpio 从传感器获取数据。
MPU6050可以使用I2C从机,我把HMC5883L设置为从机。我成功拿到了DMP运行ning。 MPU6050 可以在 DMP 数据准备就绪时产生中断并将数据发送到 fifo。我将中断连接到 gpio,并使用 pigpio 的 gpioSetAlertFunc() 来监视它的状态。如果产生中断,我的程序将读取 fifo 并获取 DMP 数据,然后将它们写入一些(线程安全的)全局变量。仅此一项效果很好。
BMP180是一个相对简单的设备,你设置一些寄存器来改变模式并等待一段时间,然后读取其他寄存器得到结果。仅此一项也很有效。
然而,当我将两者结合时,发生了运行dom系统锁定:我设置了中断处理程序,然后进入一个循环:每0.1s我设置BMP180测量并获取它的数据,然后打印屏幕上的所有全局变量; MPU6050 每秒只产生 100 个中断,我的程序及时处理了它们,所以每 0.1s 我得到最新的数据。这对于几个循环的正确结果非常有效,但随后在 运行dom 点程序卡住,并且顶部显示它正在使用 2 个内核。
删除
1)中断处理
2) 或每次循环中 BMP180 的测量
该程序将 运行 完美无缺,我测试它可以 运行 稳定至少半小时。
但是将两者结合起来,它总是会在 10 秒或 1 分钟后耗尽所有处理器能力。
我就是不明白为什么,谁能指出哪里出了问题?或者至少教我如何调试导致锁定的原因(使用哪个工具,因为锁定发生在 运行dom 点并且程序太多,使用 gdb 逐步 运行 程序-步骤不是一个选项)
提前致谢。
好吧,我发现 i2cdevlib 不是线程安全的,导致了问题。
由于 i2cdevlib 的 api 与 pigpio 相去甚远,将所有这些代码移植到纯 pigpio 并非易事。目前我将使用 pthread mutex 来让一个线程同时访问 i2c。
我正在尝试为四轴飞行器编写一个飞行控制程序,我的所有代码都可以在 https://github.com/sgsdxzy/adc
上找到我的10DOF传感器板是GY87,由3个I2C器件组成:MPU6050、HMC5883L和BMP180(与BMP085相同API)。我使用 i2cdevlib 和 pigpio 从传感器获取数据。
MPU6050可以使用I2C从机,我把HMC5883L设置为从机。我成功拿到了DMP运行ning。 MPU6050 可以在 DMP 数据准备就绪时产生中断并将数据发送到 fifo。我将中断连接到 gpio,并使用 pigpio 的 gpioSetAlertFunc() 来监视它的状态。如果产生中断,我的程序将读取 fifo 并获取 DMP 数据,然后将它们写入一些(线程安全的)全局变量。仅此一项效果很好。 BMP180是一个相对简单的设备,你设置一些寄存器来改变模式并等待一段时间,然后读取其他寄存器得到结果。仅此一项也很有效。
然而,当我将两者结合时,发生了运行dom系统锁定:我设置了中断处理程序,然后进入一个循环:每0.1s我设置BMP180测量并获取它的数据,然后打印屏幕上的所有全局变量; MPU6050 每秒只产生 100 个中断,我的程序及时处理了它们,所以每 0.1s 我得到最新的数据。这对于几个循环的正确结果非常有效,但随后在 运行dom 点程序卡住,并且顶部显示它正在使用 2 个内核。 删除 1)中断处理 2) 或每次循环中 BMP180 的测量 该程序将 运行 完美无缺,我测试它可以 运行 稳定至少半小时。 但是将两者结合起来,它总是会在 10 秒或 1 分钟后耗尽所有处理器能力。
我就是不明白为什么,谁能指出哪里出了问题?或者至少教我如何调试导致锁定的原因(使用哪个工具,因为锁定发生在 运行dom 点并且程序太多,使用 gdb 逐步 运行 程序-步骤不是一个选项)
提前致谢。
好吧,我发现 i2cdevlib 不是线程安全的,导致了问题。
由于 i2cdevlib 的 api 与 pigpio 相去甚远,将所有这些代码移植到纯 pigpio 并非易事。目前我将使用 pthread mutex 来让一个线程同时访问 i2c。