最近这几天一直给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. Linux使用mount挂载Windows共享文件夹

    https://blog.csdn.net/tojohnonly/article/details/71374984 https://github.com/tojohnonly 现实中会有这样的场景 , ...

  2. iOS-项目重构(浅谈)

    如何重构 首先,要对程序的一般架构烂熟于心,尤其是MVC,这是基本.还有就是分离存储和网络请求的逻辑. 对于一些常用的控件尽量分离复用,设置开关函数,适当的时候开启,不要的时候关闭,有必要的话还可以 ...

  3. smoothstep(),平滑阶梯函数,平滑过渡函数【转】

    函数定义: 参考:https://en.wikipedia.org/wiki/Smoothstep  相关函数图形如下:  计算机图形中经常用到正如上图所示的:两个smooth()函数相减. 相关C+ ...

  4. 深度优先dfs与广度bfs优先搜索总结+例题

    DFS(Deep First Search)深度优先搜索 深度优先遍历(dfs)是对一个连通图进行遍历的算法.它的思想是从一个顶点开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节 ...

  5. UWP 保存音乐或视频缩略图图片到本地

    开发项目时,有时需要将本地媒体文件的缩略图保存到本地,下面是源码. 需要打开Package.appxmanifest 功能 图片库 访问权限. <Page x:Class="SaveB ...

  6. 浪潮服务器NF84260M3安装Windows server 2012 R2 RAID配置

    这里是已经做了RAID6,再做系统 浪潮服务器NF84260M3 U盘启动,光盘刻录 Windows server 2012 R2 镜像,地址:迅雷下载,ed2k://|file|cn_windows ...

  7. mysql在字符编辑窗口下怎么退出编辑界面?(mysql下的ctrl+c与\c)

    [1]SQL编辑 我们在SQL编辑的时候打错了,想要退出编辑重新输入,或者是不想写了. 如下图 (1)如果我们直接按ctrl+c中断,那么直接退出整个linux了,如上图 (2)我们可以使用\c,直接 ...

  8. url-pattern / 与/* 的区别

    其中/和/*的区别:< url-pattern>/</url-pattern> 会匹配到/login这样的路径型url 不会匹配到模式为*.jsp这样的后缀型url,即:*.j ...

  9. Kubernetes---Pod hook

    Pod hook(钩子)是由Kubernetes管理的kubelet发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中.可以同时为Pod中的所有容器都配置 hook ...

  10. WDS无人参与批量部署Ser 2008

    WDS无人参与批量部署Ser 2008 对于其它windows镜像采用此方法也是可以实现的: 1. 准备工作: 虚拟机server2012一个: 地址192.168.1.1/24 Server2008 ...