[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)
需要三个地址: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。



本文转自beautifulzzzz博客园博客,原文链接:http://www.cnblogs.com/zjutlitao/p/5294909.html,如需转载请自行联系原作者

相关文章
|
3天前
全志平台A40I GPIO操作:adb通过debugfs控制GPIO
全志平台A40I GPIO操作:adb通过debugfs控制GPIO
14 0
|
存储 编解码 算法
LDPC 在 5G-NR 中的标准进展之基本图 | 带你读《5G-NR信道编码》之十三
本章节将带读者走进5G LDPC 码基本图矩阵,带你了解LDPC有哪些基本图的设计。
LDPC 在 5G-NR 中的标准进展之基本图 | 带你读《5G-NR信道编码》之十三
|
18天前
|
网络架构 芯片 内存技术
TP_Link WR886N 硬改闪存16M内存64M,刷入openwrt
TP_Link WR886N 硬改闪存16M内存64M,刷入openwrt
21 0
|
存储 编解码 5G
LDPC 在 5G-NR 中的标准进展 | 带你读《5G-NR信道编码》之十二
本章节带你了解LDPC 在 5G-NR 中的标准进展 ,观察5G是如何通过LDPC起作用的。
LDPC 在 5G-NR 中的标准进展  | 带你读《5G-NR信道编码》之十二
|
3月前
|
存储 算法 Linux
内存系列学习(五):ARM处理器中的Cache和Write Buffer
内存系列学习(五):ARM处理器中的Cache和Write Buffer
57 0
内存系列学习(五):ARM处理器中的Cache和Write Buffer
|
Android开发 异构计算
nios ii FIFO读取FPGA数据交互实验1
nios ii FIFO读取FPGA数据交互实验1
206 0
nios ii FIFO读取FPGA数据交互实验1
|
8月前
|
芯片
飞腾CPU FT-2000/4 uboot下PHY调试记录
飞腾CPU FT-2000/4 uboot下PHY调试记录
355 0
飞腾CPU FT-2000/4 uboot下PHY调试记录
|
10月前
|
存储 缓存 算法
【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接(下)
【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接(下)
139 1
|
10月前
|
存储 Linux 编译器
【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接(上)
【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接(上)
147 0
|
调度 索引
传输块大小(TBS)的确定 | 带你读《5G-NR信道编码》之十六
物理块上行和下行数据共享通道是以传输块(TB,Transport Block)为基本单位进行传输数据的。在LTE中,TBS可以用给定的物理资源块(PRB,Physical Resource Block)的数目 NPRB 以及 TBS 的索引 ITBS 通过查表的方式得到。在 5G-NR 标准化过程中,有的公司提出采用公式计算和查表分别量化 不同大小区间的 TBS 的方式来确定 TBS,以实现更大的调度灵活性。
14686 0
传输块大小(TBS)的确定 | 带你读《5G-NR信道编码》之十六