最近这几天一直给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数据卡死的总结的更多相关文章

  1. matlab中读取txt数据文件(txt文本文档)

    matlab中读取txt数据文件(txt文本文档) 根据txt文档不同种类介绍不同的读取数据方法 一.纯数据文件(没有字母和中文,纯数字) 对于这种txt文档,从matalb中读取就简单多了 例如te ...

  2. 如何实现MySQL表数据随机读取?从mysql表中读取随机数据

    文章转自 http://blog.efbase.org/2006/10/16/244/如何实现MySQL表数据随机读取?从mysql表中读取随机数据?以前在群里讨论过这个问题,比较的有意思.mysql ...

  3. C# 操作地址 从内存中读取写入数据(初级)

    本示例以植物大战僵尸为例, 实现功能为 每1秒让阳光刷新为 9999.本示例使用的游戏版本为 [植物大战僵尸2010年度版], 使用的辅助查看内存地址的工具是  CE. 由于每次启动游戏, 游戏中阳光 ...

  4. C/C++程序从文本文件中读取(保存)数据

    :本文仅供初学者参阅,解惑 在C程序中: 与程序代码外的数据(文件)打交道,我们使用到流(stream)这个概念,实现进程的虚拟内存与文件之间的数据交换. ——文件流:C标准库提供了FILE(之所以命 ...

  5. matlab中读取txt数据文件(转)

    根据txt文档不同种类介绍不同的读取数据方法 一.纯数据文件(没有字母和中文,纯数字) 对于这种txt文档,从matalb中读取就简单多了 例如test.txt文件,内容为“17.901 -1.111 ...

  6. python中读取mongodb数据并保存为csv格式的文件

    import pandas as pd import matplotlib.pyplot as plt import pymongo %matplotlib inline # 连接mongodb数据库 ...

  7. 以ORM的思路来从Excel文件中读取JSON数据列表

    1.一个常见的问题就是如何读取excel. 这里面有几个分支的问题,一个是如何使用poi读取excel,网上例子很多,但是这只解决了第一步.如何将excel读取入一定的数据结构这是第二个问题,还有就是 ...

  8. c++从文件中读取一行数据并保存在数组中

    从txt文本中读取数据存入数组中 #include <iostream> #include <fstream> #include <string> #include ...

  9. R中读取EXCEL 数据的方法

    最近初学R语言,在R语言读入EXCEL数据格式文件的问题上遇到了困难,经过在网上搜索解决了这一问题,下面归纳几种方法,供大家分享: 第一:R中读取excel文件中的数据的路径: 假定在您的电脑有一个e ...

随机推荐

  1. Python的数据类型与数据结构

    Python的数据类型与数据结构 数据类型分为: 整数型 :数字的整数 浮点型: 数字带小数 字符串: 用 ‘’ 或者 “” 引用的任意文本 布尔型:只有 True 和 False 数据结构分为: 列 ...

  2. sed例子

    以care.log这个log文件为例, care.log: 05:44:31,816 DEBUG RawAggregationWorker:70 - LTS is working on Raw Dat ...

  3. Reset Password 重置密码 (CentOS 5,6,7 ; Juniper Networks: SRX100 )

    一些重置root 密码的文档分享(来自官网): CentOS 5,6,7 Juniper Networks :  SRX100 链接:https://share.weiyun.com/5BM4kwK ...

  4. nginx http跳https配置

    为了数据传输的安全性以及防止网页被恶意篡改,现在大多数网站都配置了https. 如何保证用户都是通过https进行访问呢? 如果有用到nginx,我们可以配置强制跳转. 在nginx配置中添加: se ...

  5. HDU4513 【mannacher算法】

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4513 Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在 ...

  6. poj1961(kmp算法next数组应用)

    题目链接:https://vjudge.net/problem/POJ-1961 题意:给定一个长为n的字符串(n<=1e6),对于下标i(2<=i<=n),如果子串s(1...i) ...

  7. 关于Android的资源id

    1 @+id/xx 这个表示向资源文件中添加一个新的id. @+id是在R文件中生成int xxx=value. 有两种情况 ①R文件中不存在xxx变量,则生成int xxx=value即为控件新建一 ...

  8. Android试题

    1. Binder:例子: https://blog.csdn.net/qq_33208587/article/details/82767720

  9. 剑指offer35:数组中的逆序对

    1 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%10 ...

  10. 怎样查看Redis的版本号

    Q: 怎样查看Redis版本 A: 下面两条命令都可以查看redis 版本: redis-server --version redis-server -v