[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 ...
随机推荐
- Ext开场表单布局设计
var form = new Ext.form.FormPanel({ labelAlign: 'right', labelWidth: 60, buttonAlign: 'center', titl ...
- grep笔记
grep "match_text" file1 file2 file3 ... #grep可以对多个文件进行过滤 --color ...
- js获取单选按钮的值
function a(){ var v=document.getElementsByName("radio"); ;i<v.length;i++){ if(v[i].chec ...
- LinuxMM--Memory Pressure
Memory pressure定义在操作系统中,用户分配.文件缓存.网卡包缓冲区等等都会消耗内存.一旦出现内存紧张就会导致memory pressure.引发当某个任务需要请求内存时就有可能引发mem ...
- BZOJ 1026: [SCOI2009]windy数
题目 人生中的第一道数位dp,很有趣,虽然我很快推出了结构,但是过程却迟迟没有写出来,最后看别人的题解才恍然大悟 d[i][j]表示数位为i,最高位为j的方案数 DpInit非常简单,复杂度应该是O( ...
- python 使用字符串名调用类以及调用类方法名
在python中,有时调用者仅知道类名和类方法,不负责实际的函数调用,而是将要调用的类名和类方法告诉一个中间函数,由中间函数负责实际调用函数.中间函数需以被告知的字符串调用类和类方法. ...
- centos安装lamp环境
通过yum安装,需要联网且为su账号 yum -y install httpd php mysql mysql-server php-mysql 设置开启启动mysql,httpd /sbin ...
- 使用Glyph Designer创建位图字体
使用Glyph Designer创建位图字体 转http://book.2cto.com/201210/6610.html <iOS 5 cocos2d游戏开发实战(第2版)>将引导 ...
- hdu 1394 Minimum Inversion Number(树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给你一个0 — n-1的排列,对于这个排列你可以将第一个元素放到最后一个,问你可能得到的最 ...
- Eclipse中支持js提示
使用eclipse自带的插件,无需另外安装插件,具体步骤如下 1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 修改Auto Act ...