【发布时间】:2015-08-27 18:18:58
【问题描述】:
我正在尝试为四轴飞行器编写飞行控制程序,我的所有代码都可以在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.1s 我得到最新的数据。这对于几个循环的正确结果非常有效,但随后程序在随机点卡住,并且顶部显示它正在使用 2 个内核。 删除任何一个 1) 中断处理 2) 或每个循环中 BMP180 的测量值 该程序将完美运行,我测试它可以稳定运行至少半小时。 但是将两者结合起来,它总是会在 10 秒或 1 分钟后耗尽所有处理器能力。
我只是不明白为什么,有人可以指出什么问题吗?或者至少教我如何调试导致锁定的原因(使用哪个工具,因为锁定发生在随机点并且程序太多,使用 gdb 逐步运行程序不是一种选择)
提前致谢。
【问题讨论】:
标签: c++ linux multithreading i2c raspberry-pi2