我正在尝试为四旋翼机编写飞行控制程序,我的所有代码都可以在
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逐步运行程序不是一个选项)
提前感谢。