对于在tinyOS中读取MPU6050数据卡死的总结
最近这几天一直给tinyOS挂载外设,从最简单的LED、KEY,再到串口,这些都没什么大问题,无非就是先初始化tinyOS,再初始化硬件外设,接着启动tinyOS,然后tinyOS去寻找优先级最高的任务并运行。
但是我把MPU6050按照这步骤,发现MPU6050初始化和DMP初始化没什么问题,可就是死活读不出数据。一般在MPU6050裸机程序里,如果读不出数据,mpu_dmp_get_data()这个函数会有一个返回值,可以根据这个返回值定位MPU6050在获取数据时代码的什么位置出现了错误。可是我的这个错误就比较牛逼了,竟然没有返回值。
不管怎么说,迎难而上!
开启单步调试模式!
在一步一步的调试下,发现问题了,由于移植的是正点原子的代码,代码卡死在了这个地方。
mpu_dmp_get_data() -->
dmp_read_fifo() -->
mpu_read_fifo_stream() -->
mpu_reset_fifo()

看到了吧,这里有个50ms的延时,对于实时操作系统来说,50ms的延时就好像是一万年,所以果断把这句代码删掉。我之后也对比过其他stm32厂商的MPU6050初始化代码,都没有这个50ms的延时,可见这是正点原子加进去的。
OK,去掉了这个50毫秒的延时,再来试一下程序,好了,这下有返回值了,但是没有数据出来。
看来还是有问题,继续单步调试,发现问题还是定位到mpu_reset_fifo()这个函数上,但是这个函数是MPU6050官方厂家InvenSense公司写的,没有问题啊,官方写的能有什么问题呢。
没办法,继续排查问题,这下只能查每个函数到底是干嘛的了。
去查了下MPU6050数据手册。发现FIFO这个东西是用来保存MPU6050姿态的数据,然后再去读FIFO,把姿态数据读出来,但是为什么代码要去复位FIFO呢?肯定是FIFO的数据存满并且溢出了。可是为什么会溢出呢?说明没有及时去读数据,导致数据越堆越多,就溢出了。就好比你不停的向水壶里灌水,灌进去又不去使用这个水,所以只能越灌越多最后导致溢出。
这下问题的根本原因找到了,可以去修改代码了。根本的解决方案就是MPU6050以及DMP初始化之后立马去读FIFO里面的数据。
先来说说没修改前的代码,代码在tinyOS初始化以及硬件初始化后,会有个1秒钟来测试MCU全速能运行多少代码,这是为了方便后面测量MCU使用量。
MPU6050出错就是因为这个1秒钟,所以把MPU6050的初始化以及DMP的初始化放在这个测试MCU的1秒钟之后,但是这个解决方案效果并不是很好,因为MPU6050初始化里有100毫秒的延时。
经过几番修改,最好的解决方案是利用软件定时器。在tinyOS初始化、硬件设备初始化以及启动tinyOS之后,在启动MCU全速运行1秒钟之前,开启这个软件定时器。在这个软件定时器里面扫描mpu_dmp_get_data()这个函数,这下问题就彻底解决了。
数据通过串口输出如下:

对于在tinyOS中读取MPU6050数据卡死的总结的更多相关文章
- matlab中读取txt数据文件(txt文本文档)
matlab中读取txt数据文件(txt文本文档) 根据txt文档不同种类介绍不同的读取数据方法 一.纯数据文件(没有字母和中文,纯数字) 对于这种txt文档,从matalb中读取就简单多了 例如te ...
- 如何实现MySQL表数据随机读取?从mysql表中读取随机数据
文章转自 http://blog.efbase.org/2006/10/16/244/如何实现MySQL表数据随机读取?从mysql表中读取随机数据?以前在群里讨论过这个问题,比较的有意思.mysql ...
- C# 操作地址 从内存中读取写入数据(初级)
本示例以植物大战僵尸为例, 实现功能为 每1秒让阳光刷新为 9999.本示例使用的游戏版本为 [植物大战僵尸2010年度版], 使用的辅助查看内存地址的工具是 CE. 由于每次启动游戏, 游戏中阳光 ...
- C/C++程序从文本文件中读取(保存)数据
:本文仅供初学者参阅,解惑 在C程序中: 与程序代码外的数据(文件)打交道,我们使用到流(stream)这个概念,实现进程的虚拟内存与文件之间的数据交换. ——文件流:C标准库提供了FILE(之所以命 ...
- matlab中读取txt数据文件(转)
根据txt文档不同种类介绍不同的读取数据方法 一.纯数据文件(没有字母和中文,纯数字) 对于这种txt文档,从matalb中读取就简单多了 例如test.txt文件,内容为“17.901 -1.111 ...
- python中读取mongodb数据并保存为csv格式的文件
import pandas as pd import matplotlib.pyplot as plt import pymongo %matplotlib inline # 连接mongodb数据库 ...
- 以ORM的思路来从Excel文件中读取JSON数据列表
1.一个常见的问题就是如何读取excel. 这里面有几个分支的问题,一个是如何使用poi读取excel,网上例子很多,但是这只解决了第一步.如何将excel读取入一定的数据结构这是第二个问题,还有就是 ...
- c++从文件中读取一行数据并保存在数组中
从txt文本中读取数据存入数组中 #include <iostream> #include <fstream> #include <string> #include ...
- R中读取EXCEL 数据的方法
最近初学R语言,在R语言读入EXCEL数据格式文件的问题上遇到了困难,经过在网上搜索解决了这一问题,下面归纳几种方法,供大家分享: 第一:R中读取excel文件中的数据的路径: 假定在您的电脑有一个e ...
随机推荐
- CockroachDB学习笔记——[译]在CockroachDB中如何让在线模式更改成为可能
原文链接:https://www.cockroachlabs.com/blog/how-online-schema-changes-are-possible-in-cockroachdb/ 原作者: ...
- hello/hi的简单的网络聊天程序
hello/hi的简单的网络聊天程序 0 Linux Socket API Berkeley套接字接口,一个应用程序接口(API),使用一个Internet套接字的概念,使主机间或者一台计算机上的进程 ...
- kubernetes版本apiversion简单说明
在使用yaml文件部署Deployment项目时,出现过 error: error validating "xx-Deployment.yaml": error validatin ...
- 【计算机】DMA原理2
DMA (直接存储器访问) DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载.否则,C ...
- POJ 3229:The Best Travel Design
Description Dou Nai ), and the end of the travel route hours on traveling every day. Input There are ...
- js中的var a = new A;与var a = new A()的区别
JavaScript 中的new关键字与C#,JAVA中的概念完全不一样. 例:var a=new A(); 让我们来看看在JavaScript中的new发生了什么? var a={};//建立 ...
- 使用kubeadm进行单master(single master)和高可用(HA)kubernetes集群部署
kubeadm部署k8s 使用kubeadm进行k8s的部署主要分为以下几个步骤: 环境预装: 主要安装docker.kubeadm等相关工具. 集群部署: 集群部署分为single master(单 ...
- mysql的binlog安全删除的一种方法
指定过期天数(expire_logs_days) ---适用于单机版mysql! 该参数为全局可动态调整参数,默认值为0,即关闭,取值范围0-99. 1.3.1 参数的查看: mysql> ...
- 使用window.open 实现弹框和居中对齐
// 打开页面方法 window.open(url, '_blank', centerStyle('600', '400')+',toolbar=no,menubar=no,resizeable=no ...
- javascript获取当前用户访问的宽带IP地址
javascript获取当前用户访问的宽带IP地址 <script src="http://pv.sohu.com/cityjson?ie=utf-8"></sc ...