[nRF51822] 6、基于nRF51822平台的flash读写研究

前言

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

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

e-mail:[email protected]

一、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用来存储一个图片)。因此:

 1 SPIFlash_Erase_Block(0);
 2 SPIFlash_Erase_Block(1);
 3 SPIFlash_Erase_Block(2);
 4 nrf_delay_ms(400);
 5 SpiFlash_Write_MorePage(gImage_A, 0, 40960);
 6 SpiFlash_Write_MorePage(gImage_B, 1<<16, 40960);
 7 SpiFlash_Write_MorePage(gImage_C, 2*(1<<16), 40960);
 8 //DispPic(pic_eval);
 9 DispPicFromSD(0);
10 DispPicFromSD(1);
11 DispPicFromSD(2);

注意:这里有一点小坑就是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:[email protected]

时间: 2024-10-03 14:14:51

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

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

它们拥有的用户和fans之多,大家都很清楚. Myspace是一个基于.NET平台的,而Facebook更多是基于LAMP的.我们来看看MySpace配合.NET+Windows Server 2003+Sql Server 2000/2005+IIS怎么创造传奇的 文章正文如下: 在每个里程碑,站点负担都会超过底层系统部分组件的最大载荷,特别是数据库和存储系统.接着,功能出现问题,用户失声尖叫.最后,技术团队必须为此修订系统策略.虽然自2005年早期,站点账户数超过7百万后,系统架构到目前为止

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

作者:陈秋苑 谢晓锋 陈海焕 广州虹科电子科技有限公司 摘 要:EtherCAT 是开放的实时以太网通讯协议,由德国倍福自动化有限公司研发.EtherCAT 具有高性能.低成本.容易使用等特点,目前在工业自动化领域有着广泛的应用.Zynq-7000 是赛灵思公司(Xilinx)推出的行业第一个全可编程 SoC 产品, 它将双核 ARM Cortex-A9 处理器,低功耗可编程逻辑以及常用的外设紧密集成在一起.ZedBoard 是基于 XC7Z020 器件的低成本开发板,此板可以运行基于 Linu

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

基于335X平台的UBOOT中交换芯片驱动移植 一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.UBOOT版本:U-Boot-2016.05,采用FDT和DM. 3.交换芯片MARVELL的88E6321. 4.参考文章:本博客基于335X的UBOOT网口驱动分析. 二.移植主要步骤 1.准备工作: (1).必须熟悉U-Boot-2016.05中的网口驱动构架,熟悉其中各个网口设备结构体的意义,网口初始化流程.重点详细分析常规基于phydev的驱动初始化的过程

基于Android平台的i-jetty网站智能农业监控系统

基于android平台i-jetty网站的智能农业监控系统 摘要:传统的监控系统,一般是基于PC的有线通信传输,其有很多不足之处,如功耗较高.布线成本高.难度大,适应性差,可扩展性不强,增加新的通信线路需要再次布线施工,而且维护起来也比较麻烦,一旦线路出问题,需要繁琐的检查.而嵌入式Web监控系统是基于物联网技术,其无线通信技术具有成本低廉.适应性强.扩展性强.信息安全.使用维护简单等优点. 智能农业中,种植大棚是通过大棚内安装温湿度以及光照传感器,来对农作物的环境参数进行实时采集,由Web监控

项目需求:基于微信平台的拼团活动系统

项目需求分析 基于微信平台的拼团活动系统 一.业务需求 基于微信平台的拼团系统是一个生活类微信公众平台,解决用户获取厦门城市活动信息问题.同城交友这方面在厦门还比较薄弱,可以通过这个平台增进厦门城市内部的交流,促进大家文娱生活的丰富度.应用前景主要在一下几个方面:1.各类商业活动也可以选择该平台来作为推广和营销的渠道.2.通过该平台找到与自己兴趣相关的活动并参与.活动类型可包括音乐.戏剧.讲座.聚会.电影.展览.活动.公益.旅行等众多内容.一切你热衷的饭局.K歌.球赛都能在上面组织.你可以发起一

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

这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.thanks. 构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化的方式进行配置,所以维护起来相当困难. Gradle:Gradle采用增量构建.Gra

一个基于.NET平台的自动化/压力测试系统设计简述(可独立运行,提供源码)

AutoTest系统设计概述 AutoTest是一个基于.NET平台实现的自动化/压力测试的系统,可独立运行于windows平台下,支持分布式部署,不需要其他配置或编译器的支持.(本质是一个基于协议的测试工具),前面还有一篇对其功能的简单介绍[http://www.cnblogs.com/lulianqi/p/4773146.html] AutoTest用于发布的部分有2个部分,主程序[AutoTest.exe]及分布式部署程序[RemoteService.exe](用于将将测试业务分布式部署到

u-boot分析(九)----nand flash初始化|nand flash读写分析

u-boot分析(九) 上篇博文我们按照210的启动流程,分析到了初始化串口,由于接下来的取消存储保护不是很重要,所以我们今天按照u-boot的启动流程对nand flash初始化进行分析. 今天我们会用到的文档: 1.        2440芯片手册:http://download.csdn.net/detail/wrjvszq/8358949 2.        6410芯片手册:http://download.csdn.net/detail/wrjvszq/8358965 3.      

基于fs210平台的dm9000原理及移植

dm9000的原理图如下: 网卡的移植工作很简单,首先是需要添加目标版的平台设备信息,就可以实现网卡的移植工作,平台设备信息如何添加很重要 添加平台信息的第一步是添加一个platform_device设备信息 首先在arch/arm/mach-s5pv210/mach-smdkv210.c 添加头文件: #include <linux/dm9000.h>              #include <linux/irq.h>              添加platform_devi