[nRF51822] 6、基于nRF51822平台的flash读写研究
前言
本文重点介绍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)
- void SpiFlash_Write_Sector_Data(char *pBuffer, uint8_t Block_Num, uint8_t Sector_Num, uint32_t WriteBytesNum)
- 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();
四、实测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读写研究的更多相关文章
- 【应用笔记】【AN002】通过iTool2基于MinGW平台读写EEPROM
为了增加大家 DIY 的乐趣,XiaomaGee今天为大家只做了一篇使用iTool2内置的USB转I2C来读写EEPROM的方法和代码. iTool2简介 iTool2为银杏公司面向电子类研发工程师推 ...
- 从MySpace基于.NET平台的六次重构经历感受分布式
它们拥有的用户和fans之多,大家都很清楚. Myspace是一个基于.NET平台的,而Facebook更多是基于LAMP的.我们来看看MySpace配合.NET+Windows Server 200 ...
- 基于335X平台的UBOOT中交换芯片驱动移植
基于335X平台的UBOOT中交换芯片驱动移植 一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.UBOOT版本:U-Boot-2016.05,采用FDT和DM. 3 ...
- 基于Zynq平台的EtherCAT主站方案实现
作者:陈秋苑 谢晓锋 陈海焕 广州虹科电子科技有限公司 摘 要:EtherCAT 是开放的实时以太网通讯协议,由德国倍福自动化有限公司研发.EtherCAT 具有高性能.低成本.容易使用等特点,目前在 ...
- 基于java平台的常用资源整理
这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...
- 基于X86平台的PC机通过网络发送一个int(32位)整数的字节顺序
1.字节顺序 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序.小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处:大端字节序是高字节数据存 ...
- 基于Linux平台的libpcap源码分析和优化
目录 1..... libpcap简介... 1 2..... libpcap捕包过程... 2 2.1 数据包基本捕包流程... 2 2.2 libpcap捕包过程... ...
- 这里整理了基于java平台的常用资源
这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...
- 基于微软平台IIS/ASP.NET开发的大型网站有哪些呢?
首先说明一下,本文绝不是要说Microsoft平台多么好,多么牛.只是要提醒一些LAMP/JAVA平台下的同志们,微软平台不至于像你们说的,和想象的那么不堪!只是你们自己不知道而已.同时,也希望广大M ...
随机推荐
- angularjs 作用域
1.指令属性取值:通过attr.someAttribute属性名字获取 以下,通过$eval(attr.data)获取value <div ng-controller="personC ...
- 关于webstorm 对 vue的设置
1. 首先安装vue插件,安装方法: setting --> plugin ,点击plugin,在内容部分的左侧输入框输入vue,会出现两个关于vue的插件,点击安装即可.安装完成后,就可 ...
- js常用的地址栏参数获取
用JS获取地址栏参数的方法(超级简单) 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var reg ...
- 【章老师的课程】Black Box Testing
本周我们学习了黑盒测试,这是一种常用的软件测试方法,它将被测软件看作一个打不开的黑盒,主要根据功能需求设计测试用例,进行测试.本章主要介绍几种常用的黑盒测试方法和黑盒测试工具,并通过实例介绍各种方法的 ...
- python核心编程(第二版)习题
重新再看一遍python核心编程,把后面的习题都做一下.
- 除法取模练习(51nod 1119 & 1013 )
题目:1119 机器人走方格 V2 思路:求C(m+n-2,n-1) % 10^9 +7 (2<=m,n<= 1000000) 在求组合数时,一般都通过双重for循环c[i][ ...
- Joseph(JAVA版)
package Joseph;//约瑟夫环,m个人围成一圈.从第K个人开始报数,报道m数时,那个人出列,以此得到出列序列//例如1,2,3,4.从2开始报数,报到3剔除,顺序为4,3,1,2publi ...
- 【转】gtk+多线程的程序实例
#include <gtk/gtk.h> gint test() { while(1) { gdk_threads_enter(); g_printf("hello\n" ...
- 简单的css js控制table隔行变色
(1)用expression 鼠标滑过变色: <style type="text/css"><!-- table { background-color:#0000 ...
- lib/sqlalchemy/cextension/processors.c:10:20: 致命错误: Python.h:没有那个文件或目录
本文地址:http://www.cnblogs.com/yhLinux/p/4063444.html $ sudo easy_install sqlalchemy [sudo] password fo ...