gpt4 book ai didi

c++ - 树莓派从MPU6050+BMP180读取数据时死机

转载 作者:太空宇宙 更新时间:2023-11-04 03:34:04 26 4
gpt4 key购买 nike

我正在尝试为四轴飞行器编写一个飞行控制程序,我的所有代码都可以在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逐步运行程序不是一个选择)

提前致谢。

最佳答案

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

由于 i2cdevlib 的 api 与 Pigpio 相差甚远,因此将所有这些代码移植到纯 Pigpio 并不简单。目前,我将使用 pthread 互斥体来只让一个线程同时访问 i2c。

关于c++ - 树莓派从MPU6050+BMP180读取数据时死机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32256751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com