【嵌入式干货】利用二分法定位Flash存有数据(非FF)的地址
前言
最近项目中需要实现这样的功能:设备具备温湿度数据采集并写入flash保存的功能;当设备复位后,还能重新开启采集功能且将采集到的数据继续接着写入。问题来了,复位后,MCU会将RAM的数据清除,这样会导致程序丢失了上次记录温湿度数据的最终flash地址,那么得在复位后程序能够找到复位前记录的flash地址(即flash中存有数据(非FF)的最后地址)。
实现
利用二分法对flash进行数据查找,用的是2M byte flash芯片P25Q16U
一、首先在PC端用C语言跑通实现代码如下:
//二分法查找上次写的最后一个地址
#include "stdio.h"
#include "string.h"
#include "stdlib.h"unsigned char *my_memory=(unsigned char*)malloc(2016384); ;
char i=0;unsigned int LastSectorHeadAddress;
unsigned int NextSectorStart;
unsigned int NextSectorStop;
unsigned char buf;
unsigned int Get_Last_Sector(unsigned int Sector_start, unsigned int Sector_stop)
{static unsigned char cnt=0;cnt++;if(Sector_start<0x00004000 || Sector_stop>0x001EC480)//不在寻找区域内{return -1;}LastSectorHeadAddress = (Sector_start + Sector_stop)/2;// spiFlashRead(*LastSectorHeadAddress,1,buf);buf = *((unsigned char*)(my_memory+LastSectorHeadAddress));printf("第%d次查找的数据为:%d\n",cnt,buf);if(buf == 0xFF){ NextSectorStop = LastSectorHeadAddress;NextSectorStart = Sector_start;if(Sector_stop == NextSectorStop){return Sector_start; }else{return Get_Last_Sector(NextSectorStart,NextSectorStop);}}else{ NextSectorStop = Sector_stop;NextSectorStart = LastSectorHeadAddress;if(NextSectorStart == Sector_start){return Sector_start;}else{return Get_Last_Sector(NextSectorStart,NextSectorStop);}}
}int main()
{unsigned int my_address;unsigned char buf;memset(my_memory,0xff,2016384); //全部初始化为FFmemset(my_memory,0x0A,16384+4001); //初始化为0Abuf = *((unsigned char*)(my_memory+99));my_address = Get_Last_Sector(16384,2016384);printf("数据的最后地址是:%d,数据为:%d,总共写了%d个数据\n",my_address,buf,my_address-16384+1);}
二、在硬件上跑通代码如下;
//定位上次最后一个存有数据的地址
unsigned int MidAddress;
unsigned int NextAddressStart;
unsigned int NextAddressStop;
unsigned char buf;
unsigned int Get_Last_Sector(unsigned int Sector_start, unsigned int Sector_stop)
{static unsigned char cnt=0;cnt++;if(Sector_start<0x00004000 || Sector_stop>0x001EC480)//不在寻找区域内{return -1;}MidAddress = (Sector_start + Sector_stop)/2;spiFlashRead(MidAddress,1,&buf);if(buf == 0xFF){ NextAddressStop = MidAddress;NextAddressStart = Sector_start;if(Sector_stop == NextAddressStop){return Sector_start; }else{return Get_Last_Sector(NextAddressStart,NextAddressStop);}}else{ NextAddressStop = Sector_stop;NextAddressStart = MidAddress;if(NextAddressStart == Sector_start){return Sector_start;}else{return Get_Last_Sector(NextAddressStart,NextAddressStop);}}
}
三、结论
经测试,在2M byte的flash中,最多只需20次便能定位到存有温湿度数据(非FF)的最后一个字节(地址)。
【嵌入式干货】利用二分法定位Flash存有数据(非FF)的地址相关推荐
- tinyFlash:一种超轻量级的嵌入式单片机flash KV 数据存储方案
tinyFlash 一种超轻量级的flash KV数据存储方案 Github 地址:https://github.com/ospanic/tinyFlash 设计原理 本方案采用两个扇区轮流使用的方法 ...
- 嵌入式linux之Nor/Nand FLASH的读写
http://www.cnblogs.com/tureno/articles/2708461.html 所谓Flash,是内存(Memory)的一种,但兼有RAM和ROM 的优点,是一种可在系统(In ...
- STM32操作访问flash,包括写入数据到flash和从flash读取数据
文章目录 序言:flash相关知识背景 一.FLASH操作流程与操作选址 1.1 FLASH操作流程 1.2 如何查找并选定要写入Flash十六进制地址 二.Flash基本知识点 2.1 Flash容 ...
- 处理DataFrame数据——利用Groupby函数分类汇总数据并转为矩阵
问题 我的手头有35万条数据,包含三个属性:时间.数量和ID.我现在需要以时间.ID分类,对数量进行求和统计(分类汇总):然后以time列为行(x轴),ID为列(y轴),num为值建立矩阵. 读取数据 ...
- 干货丨不可错过的大数据学习资源推荐
今天为大家推荐一些翻译整理的大数据相关的非常棒的学习资源,希望能给大家一些帮助. 关系数据库管理系统(RDBMS) MySQL:世界最流行的开源数据库: PostgreSQL:世界最先进的开源数据库: ...
- linux共享文件丢失,【干货分享】linux平台下数据文件被误删后,如何及时得知并进行恢复...
原标题:[干货分享]linux平台下数据文件被误删后,如何及时得知并进行恢复 我们知道在windows平台下,一旦文件在程序中打开,则不能被删除,所以不存在误删数据文件的情况,如下图所示. 但是在LI ...
- 坎蒂雷赋权法 matlab,干货 | 利用MATLAB实现FMCW雷达中的常用角度估计方法
其中在介绍角度估计中,通过对接收差频信号在快慢时间维度的扩展,增加了空域的信息.扩展后的接收差频信号可以表示为 其中k表示接收天线的个数,d为天线间距. 在"干货|利用MATLAB实现FMC ...
- hopper_如何利用卫星收集的遥感数据轻松对蚱hopper中的站点进行建模
hopper 建筑学与数据科学 (Architectonics and Data Science) Understanding the site and topography are crucial ...
- NDK 下利用 arm-linux-androideabi-addr2line 定位 so 库问题点
"通常so库崩溃都是内存问题(野指针/空指针/访问越界...)" 1.backtrace信息as里面通常无法打印,需要 adb logcat > crash.log , 然后 ...
最新文章
- 恭贺《构建高可用Linux服务器》荣获几项殊荣
- string用法总结
- 学习开发自己的composer包,并使用GitHub实时更新到Packagist
- OpenGL GLFW
- 【大话Hibernate】Hibernate的核心接口和类
- 关于HttpModule
- Centos7通过yum安装jsoncpp库
- 单元测试代码:SpringTest+JUnit
- Postgre合并多行数据为一行
- 【Python】Matplotlib绘图中文乱码问题的解决方案
- 【NOIP2011TG】【OJ4366】【codevs1135】选择客栈
- OpenSSL:openssl-xxx.tar.gz
- 有序关系中的极大元与极小元
- AngularJs自定义指令的详解
- 教师计算机应用能力现状分析,信息技术教学应用个人现状分析以及发展计划
- 关于训练误差、测试误差、泛化误差
- 测试人员的绩效考核指标
- Data Binding学习(一)
- php 高洛峰 正则,PHP 自定义 Smarty 模板引擎类 高洛峰 细说PHP
- Focal loss 损失函数详解
热门文章
- 浅谈Struts2下
- linux查找文件或字符串的命令
- 扩展Visual Studio 2010服务器资源管理器中的SharePoint结点
- C++ STL之vector常用方法
- Javascript获取数组中最大和最小值
- PHP Warning: Xdebug MUST be loaded as a Zend extension
- 《Cisco IPv6网络实现技术(修订版)》一2.6 配置练习:使用Cisco路由器配置一个IPv6网络...
- rabbitmq安装完整版
- SQLServer导入Excel截断数据的解决办法
- Linux与win2003下修改mac地址方法