前言

最近项目中需要实现这样的功能:设备具备温湿度数据采集并写入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)的地址相关推荐

  1. tinyFlash:一种超轻量级的嵌入式单片机flash KV 数据存储方案

    tinyFlash 一种超轻量级的flash KV数据存储方案 Github 地址:https://github.com/ospanic/tinyFlash 设计原理 本方案采用两个扇区轮流使用的方法 ...

  2. 嵌入式linux之Nor/Nand FLASH的读写

    http://www.cnblogs.com/tureno/articles/2708461.html 所谓Flash,是内存(Memory)的一种,但兼有RAM和ROM 的优点,是一种可在系统(In ...

  3. STM32操作访问flash,包括写入数据到flash和从flash读取数据

    文章目录 序言:flash相关知识背景 一.FLASH操作流程与操作选址 1.1 FLASH操作流程 1.2 如何查找并选定要写入Flash十六进制地址 二.Flash基本知识点 2.1 Flash容 ...

  4. 处理DataFrame数据——利用Groupby函数分类汇总数据并转为矩阵

    问题 我的手头有35万条数据,包含三个属性:时间.数量和ID.我现在需要以时间.ID分类,对数量进行求和统计(分类汇总):然后以time列为行(x轴),ID为列(y轴),num为值建立矩阵. 读取数据 ...

  5. 干货丨不可错过的大数据学习资源推荐

    今天为大家推荐一些翻译整理的大数据相关的非常棒的学习资源,希望能给大家一些帮助. 关系数据库管理系统(RDBMS) MySQL:世界最流行的开源数据库: PostgreSQL:世界最先进的开源数据库: ...

  6. linux共享文件丢失,【干货分享】linux平台下数据文件被误删后,如何及时得知并进行恢复...

    原标题:[干货分享]linux平台下数据文件被误删后,如何及时得知并进行恢复 我们知道在windows平台下,一旦文件在程序中打开,则不能被删除,所以不存在误删数据文件的情况,如下图所示. 但是在LI ...

  7. 坎蒂雷赋权法 matlab,干货 | 利用MATLAB实现FMCW雷达中的常用角度估计方法

    其中在介绍角度估计中,通过对接收差频信号在快慢时间维度的扩展,增加了空域的信息.扩展后的接收差频信号可以表示为 其中k表示接收天线的个数,d为天线间距. 在"干货|利用MATLAB实现FMC ...

  8. hopper_如何利用卫星收集的遥感数据轻松对蚱hopper中的站点进行建模

    hopper 建筑学与数据科学 (Architectonics and Data Science) Understanding the site and topography are crucial ...

  9. NDK 下利用 arm-linux-androideabi-addr2line 定位 so 库问题点

    "通常so库崩溃都是内存问题(野指针/空指针/访问越界...)" 1.backtrace信息as里面通常无法打印,需要 adb logcat > crash.log , 然后 ...

最新文章

  1. 恭贺《构建高可用Linux服务器》荣获几项殊荣
  2. string用法总结
  3. 学习开发自己的composer包,并使用GitHub实时更新到Packagist
  4. OpenGL GLFW
  5. 【大话Hibernate】Hibernate的核心接口和类
  6. 关于HttpModule
  7. Centos7通过yum安装jsoncpp库
  8. 单元测试代码:SpringTest+JUnit
  9. Postgre合并多行数据为一行
  10. 【Python】Matplotlib绘图中文乱码问题的解决方案
  11. 【NOIP2011TG】【OJ4366】【codevs1135】选择客栈
  12. OpenSSL:openssl-xxx.tar.gz
  13. 有序关系中的极大元与极小元
  14. AngularJs自定义指令的详解
  15. 教师计算机应用能力现状分析,信息技术教学应用个人现状分析以及发展计划
  16. 关于训练误差、测试误差、泛化误差
  17. 测试人员的绩效考核指标
  18. Data Binding学习(一)
  19. php 高洛峰 正则,PHP 自定义 Smarty 模板引擎类 高洛峰 细说PHP
  20. Focal loss 损失函数详解

热门文章

  1. 浅谈Struts2下
  2. linux查找文件或字符串的命令
  3. 扩展Visual Studio 2010服务器资源管理器中的SharePoint结点
  4. C++ STL之vector常用方法
  5. Javascript获取数组中最大和最小值
  6. PHP Warning: Xdebug MUST be loaded as a Zend extension
  7. 《Cisco IPv6网络实现技术(修订版)》一2.6 配置练习:使用Cisco路由器配置一个IPv6网络...
  8. rabbitmq安装完整版
  9. SQLServer导入Excel截断数据的解决办法
  10. Linux与win2003下修改mac地址方法