对于在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 ...
随机推荐
- idea-配置文件提示红色
Idea建立spring配置文件首行红色 提示URI is not registered 复制出现红色字体的路径...File - Settings - schemas and DtDs 点击加号 ...
- Flutter Swiper制作轮播效果
1.引入flutter_swiper插件 flutter最强大的siwiper, 多种布局方式,无限轮播,Android和IOS双端适配. Flutter_swiper的GitHub地址:https: ...
- 双目结构光三维扫描仪获得的三维点云模型(GIF)
- CF1187E Tree Painting
思路: 树形dp,首先使用dp计算以1为根的时候的最大分数,同时得到各个子树i的最大分数dp[i].然后利用前面得到的dp数组分别计算以其他每个点作为根的时候的最大分数. 实现: #include & ...
- 常用的API
API (application programming Interface)应用程序编程接口 java 是字典 Scanner类的功能可以实现从键盘输入到程序当中. 引用类型的一般使用步骤 ·1导包 ...
- GitHub项目管理维护实用教程
GitHub项目维护教程 1)注册GitHub账户并登陆: 2)在Windows cmd(或Ubuntu中的terminal)中cd到自己的工作目录,将仓库clone下来: 命令: git clo ...
- HTTP请求方法:GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE 说明
平时的Rest开发,用到的都是GET,POST,PUT,DELETE类型的请求. 但Rest支持的请求类型不止前面4种,还有其他几种. 下面部分转自: https://www.html.cn/arch ...
- 【AtCoder】AGC006
AGC006 A - Prefix and Suffix -- #include <bits/stdc++.h> #define fi first #define se second #d ...
- JAVA开发者大会:拍拍贷MQ系统原理与应用
--喜欢记得关注我哟[shoshana]-- 前记: 5月12号参加了JAVA开发者大会,就<拍拍贷消息系统原理及应用> 作者:李乘胜老师 关于PMQ的分享整理一下笔记以及笔记的思考 和复 ...
- Spring 加载项目外部配置文件
背景 在项目的部署过程中,一般是打成 war 或者 jar 包,这样一般存在两种问题: 即使是配置文件修改,也还需要整个项目重新打包和部署. 整个项目只有一套环境,不能切换. 针对上面的问题,可以使用 ...