前言

本文重点介绍flash的数据存取特性、flash的内存划分、一个简单的存取图片的内存管理方式,以及对flash写前删的时间、删后读的时间、写后读的时间进行测量的一个小实验。目的在于更全面了解flash本身特点(尤其是限制),从而方便设计出高效的内存管理驱动。

本文参考论文:闪存的存储管理及索引方法研究_赵培_华中科技大博士论文_2011年

e-mail:beautifulzzzz@qq.com

一、Flash的特点 

  flash有几大奇葩的特点:

  闪存具有多种不用于磁盘的特性,例如:(1)闪存具有不对称的读写操作时间,即闪存的写时间远大于读时间,擦除时间远大于写时间。(2)闪存在重写同一闪存存储位置的数据之前需要执行擦除操作,即具有Erase-Before-Write特性。很显然,采用传统的“In-place-update"方法(即每次更新闪存页前均擦除整个闪存块)更新闪存的策略是不可行的。因此一般情况下,闪存存储系统采用”out-place-updata"方式更新闪存中的数据,即:将新版本的数据写入其他空闲的页面内,然后再将原始数据所在页面记为失效页面(Dead page 或Dirty Page),包含最新版本的闪存页面成为Live页面。当闪存中的空页面不足时,才执行擦除操作回收空间。若待回收的闪存块包含有效数据,则需要在执行擦除操作前将有效数据复制到闪存其他空闲页面,这一过程成为Garbage Collection。(3)每个闪存块具有有限的擦除次数(一般为10K或100K次),若某个块超过最大擦除次数,则此块为“坏块”(Worn-out Block或Bad Block)。坏块的可靠性差,将会频繁出现读写错误,不能用于存储数据。(4)为了延长闪存使用寿命,闪存存储系统需要通过Wear-leveling机制尽量使所有闪存块具有相同或相似的擦除次数。

  这些特性使得传统的基于磁盘设计的数据管理拌饭直接应用到闪存系统时的性能很差,不能充分发挥闪存本省的优良特性(SSD和机械式硬盘)。

二、GD25Q128B(16M)介绍

http://www.xinyahong.com/upLoad/product/month_1411/20141118164301603.pdf

2.1、GD25Q128B存储划分

  该款芯片在nRF51822EK_TM开发板上用~

2.2、GD25Q128B操作速度

2.3、GD25Q128B的页写操作及函数

  • 像驱动代码里面的:void SpiFlash_Write_Data(char *pBuffer, uint8_t Block_Num, uint8_t Page_Num, uint32_t WriteBytesNum)
需要三个地址:Block_Num,Page_Num,addr
在该函数里将addr设为0
    pcmd[0] = Block_Num;
    pcmd[1] = Page_Num;
    pcmd[2] = 0;
 
  • void SpiFlash_Write_Sector_Data(char *pBuffer, uint8_t Block_Num, uint8_t Sector_Num, uint32_t WriteBytesNum)
写哪个块中哪个sector中的数据
首先计算将会占用多少page(1page=256bytes)
   Write_Page_Num = WriteBytesNum / 256;
   if((WriteBytesNum % 256) != 0) Write_Page_Num += 1;
 
  • uint8_t SpiFlash_Write_MorePage(uint8_t *pBuffer, uint32_t WriteAddr, uint32_t WriteBytesNum)

按页写,写多页,传入是地址和要写数据的量,内部写写的是零头,然后按页整页整页的写

三、Flash存取图片的具体案例(比较简单的一种内存管理)

一张图128X160的40960bytes=160X256(页),而1block为64KB=2^16=2^8X256≈256页(而2^7又小于160,因此把1block的64K用来存储一个图片)。因此:

 SPIFlash_Erase_Block();
SPIFlash_Erase_Block();
SPIFlash_Erase_Block();
nrf_delay_ms();
SpiFlash_Write_MorePage(gImage_A, , );
SpiFlash_Write_MorePage(gImage_B, <<, );
SpiFlash_Write_MorePage(gImage_C, *(<<), );
//DispPic(pic_eval);
DispPicFromSD();
DispPicFromSD();
DispPicFromSD();
注意:这里有一点小坑就是SpiFlash_Write_MorePage是先把零头写好,然后整页整页写,读是在DispPicFromSD中调用SpiFlash_Read_Data(buffer, PicNum , Address_S , 256);
void SpiFlash_Read_Data(uint8_t *pBuffer, uint8_t Block_Num , uint8_t Page_Num , uint32_t ReadBytesNum)          
 

四、实测Flash读写及清除的速度(为做更复杂、高效的存储管理做准备)

  由于第三节中介绍的一张图片约为1block大小,此外整个存储全部用来存放相同规格的图片,加之这些图片只需要存一遍,之后仅仅是读取这些图片(不涉及多次删除、随机索引等情况),因此,在第三节中的存储利用方法还算可以满足需求。

  但是对于一种带有陀螺仪采集数据、存储和同步的一种手环:每帧17byte的传感器采集数据,(1)首先要满足采集数据的时候高速存储,(2)其次要满足同步数据时完整同步,(3)同时也要满足Flash满了之后能用新的数据覆盖老的数据。

  针对这3点要求可以按照下面的方法进行实施:

  针对上面实施办法,需要具体测试下存取的效果:

4.1、Write_Before_EraseSector与Read_Before_EraseSector延时时差计算:  

  实验核心代码:48行以上测试sector erase后最短多久进行write操作没有问题;48行以下是测试sector erase后最短多久read操作没有问题:

测试结果:erase sector后write至少需要100ms的延时(建议选120ms),write后read和erase sector后read均不需要延时。

4.2、Write_Before_EraseBlock与Read_Before_EraseBlock延时时差计算:

同4.1理解.

  测试结果:erase block后至少需要350ms的延时,才能进行有效写!(其中后半段是注释掉第50行代码导致的)

PS:erase full至少40s,测试6次未出现错误,实验同4.1,4.2。

PS:如果您觉得还不错,点个赞,让更多人受益~

@link:http://pan.baidu.com/s/1pK13HUV(私用)
@beautifulzzzz 2016-03-19 continue~  
e-mail:beautifulzzzz@qq.com

[nRF51822] 6、基于nRF51822平台的flash读写研究的更多相关文章

  1. 【应用笔记】【AN002】通过iTool2基于MinGW平台读写EEPROM

    为了增加大家 DIY 的乐趣,XiaomaGee今天为大家只做了一篇使用iTool2内置的USB转I2C来读写EEPROM的方法和代码. iTool2简介 iTool2为银杏公司面向电子类研发工程师推 ...

  2. 从MySpace基于.NET平台的六次重构经历感受分布式

    它们拥有的用户和fans之多,大家都很清楚. Myspace是一个基于.NET平台的,而Facebook更多是基于LAMP的.我们来看看MySpace配合.NET+Windows Server 200 ...

  3. 基于335X平台的UBOOT中交换芯片驱动移植

    基于335X平台的UBOOT中交换芯片驱动移植 一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.UBOOT版本:U-Boot-2016.05,采用FDT和DM. 3 ...

  4. 基于Zynq平台的EtherCAT主站方案实现

    作者:陈秋苑 谢晓锋 陈海焕 广州虹科电子科技有限公司 摘 要:EtherCAT 是开放的实时以太网通讯协议,由德国倍福自动化有限公司研发.EtherCAT 具有高性能.低成本.容易使用等特点,目前在 ...

  5. 基于java平台的常用资源整理

    这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...

  6. 基于X86平台的PC机通过网络发送一个int(32位)整数的字节顺序

    1.字节顺序 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序.小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处:大端字节序是高字节数据存 ...

  7. 基于Linux平台的libpcap源码分析和优化

    目录 1..... libpcap简介... 1 2..... libpcap捕包过程... 2 2.1        数据包基本捕包流程... 2 2.2        libpcap捕包过程... ...

  8. 这里整理了基于java平台的常用资源

    这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...

  9. 基于微软平台IIS/ASP.NET开发的大型网站有哪些呢?

    首先说明一下,本文绝不是要说Microsoft平台多么好,多么牛.只是要提醒一些LAMP/JAVA平台下的同志们,微软平台不至于像你们说的,和想象的那么不堪!只是你们自己不知道而已.同时,也希望广大M ...

随机推荐

  1. C++ exe调用dll文件

    生成dll程序 extern "C"_declspec(dllexport) void maopao(int *p,int count);void maopao(int *p,in ...

  2. 记录Gzip函数

    仅仅作个日志而与 public static function compress(param1:ByteArray) : ByteArray { var _loc_2:ByteArray; var _ ...

  3. 大前端学习笔记整理【二】CSS视觉格式化模型

    1. 概念 在视觉格式化模型中,文档树中的每个元素都将会根据盒模型产生零到多个盒子.这些盒子的布局由如下因素决定: 盒子的尺寸和类型 定位策略(正常文档流,浮动或者绝对定位) 和文档树中其他元素的关系 ...

  4. 【OpenGL】如何绘制Shadow

    背景 Shadow即阴影,它是光线被不透明物体遮挡而产生的黑暗区域,与光源的方向相反. 在Blender中编辑过程中没有Shadow,只有在经过渲染后才能显示.目前有一个基于Blender的项目,要求 ...

  5. XAMARIN +VS2015 ANDROID 开发禁止屏幕自动转动 Portrait,Nosensor

    网上有很多java的写法,但是放在C#中都无法使用,其实有时候还是安下心来认真的去看官网文档比在百度或者google来的快的多 this.RequestedOrientation = Android. ...

  6. awk用法总结笔记

    +  : 匹配1或多次出现的字符或正则表达式  awk '/col+/' testfile ?  : 匹配0或1次出现的字符或正则表达式    awk '/col+/' testfile |  : 匹 ...

  7. cognos制作报表流程

    第一章 创建报表 制作ReportStudio报表,步骤如下图所示: 第二章 添加查询 1.点击中间栏的查询资源管理器,然后点击查询,就可以新建查询.步骤如下图所示: 2.点击查询出现的页面: 3.在 ...

  8. libev安装与示例程序编译运行

    Linux平台C网络编程,之前总是看各大名著(如UNIX环境高级编程和UNIX网络编程,还有TCP/IP详解 卷1:协议和深入理解计算机系统(原书第2版)),同时写点小程序练习.然而还是拿不出手. 参 ...

  9. XAF 官方问题笔记

    1.How to print report direct, and print preview via an simple action? 如何通过一个按钮直接打印报表或者打印预览报表 https:/ ...

  10. html5 localStorage实现表单本地存储

    随笔开头,我不得不吐槽,为什么我的随笔每次发布之后,都会在分分钟之内移出首页.好气啊!! 进入正题了,项目中有许多表单输入框要填写,还有一些单选复选框之类的.用户可能在填写了大量的信息之后,不小心刷新 ...