树莓派从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。当DMP数据准备好时,MPU6050可以产生中断,并将数据发送到fifo。我将中断连接到gpio,并使用pigpio的gpioSetAlertFunc()来监视它的状态。如果产生中断,我的程序将读取fifo并获得DMP数据,然后将它们写入一些(线程安全的)全局变量。仅这一点就运行良好。BMP180是一个相对简单的设备,您可以设置一些寄存器来改变模式并等待一段时间,然后读取其他寄存器以获得结果。
然而,当我把两者结合起来时,发生了一个随机的系统锁定:我设置中断处理程序,然后进入一个循环:每0.1s我设置BMP180来测量并获得它的数据,然后在屏幕上打印所有全局变量;MPU6050每秒只产生100个中断,我的程序及时处理它们,所以每0.1s我就得到最新的数据。这在几个循环中工作得很好,结果正确,但随后在一个随机点,程序卡住了,top显示它使用了2个内核。要么删除1)中断处理2)或各回路BMP180的测量值程序可以完美地运行,我测试过它可以稳定运行至少半个小时。但如果同时使用两种方法,它总是会在10秒或1分钟后卡住,耗尽所有处理器的电量。
我就是不明白为什么,谁能指出哪里不对吗?或者至少教我如何调试导致锁定的原因(使用哪个工具,因为锁定发生在随机点并且有太多的过程,使用gdb逐步运行程序不是一个选项)
好吧,我发现i2cdevlib不是线程安全的,所以导致了这个问题。
由于i2cdevlib的api与pigpio相去甚远,因此将所有这些代码移植到纯pigpio中并非易事。目前,我将做一个pthread互斥,让只有一个线程访问i2c在同一时间。
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- C++ 11 中的锁定是否保证访问数据的新鲜度?
- 锁定的互斥锁是否保护condition_variable和数据?
- 我可以将部分数据用作锁定吗?
- 通知线程是否始终需要在修改期间锁定共享数据
- 试图更新和插入时,数据核心会被锁定
- 锁定免费的C++数据结构,不可能
- 在并发数据结构中,什么级别的锁定粒度是好的
- 在组合数据时不可能是恒定正确的,并且它是锁定的?
- 测试与C 原始数据类型上同步锁定的需求
- 互斥锁 / 什么是被锁定的互斥锁数据
- 我应该在多线程编程中始终锁定全局数据吗?为什么
- 为什么开发人员在多线程代码的读/写过程中锁定字长数据
- 是否可以使用互斥锁来锁定数据结构中的一个元素?
- 使用原子锁定自由的单生产者多消费者数据结构
- 树莓派从MPU6050+BMP180读取数据时锁定
- 在Linux上锁定对单个进程内数据访问的最快方法
- 如何锁定由属于两个不同类的两个线程修改的数据结构
- 是否有必要锁定STL容器以读取其数据?