manhuami2007的个人空间 https://bbs.21ic.com/?741514 [收藏] [复制] [RSS]

日志

环形数组在FLASH存储中的应用

已有 480 次阅读2017-1-31 16:52 |系统分类:嵌入式系统| 单片机, 嵌入式, FLASH, C语言, Flash

在嵌入式系统中串行Flash是一个很常用的存储芯片。但是对于Cortex-M系列的MCU或者51单片机,若使用文件系统存储数据,即浪费存储空间,又消耗单片机的性能。因此需要一个更简单的存储方式来存储数据。

环形数组是我们经常使用的一种数据结构,常用于存储一些队列数据,因此我们不妨模仿环形数组的方式,在Flash中存储数据。

环形数组


image

环形数组是一种首尾相连的数据结构。由于其头尾相接,这种数据结构能够更好的利用存储芯片的全部空间。

模拟环形数组

数组有两个重要的部分:元素与索引。因此为了在Flash模拟环形数组,我们需要解决两个问题:

  1. 确定模拟数组中元素的类型
  2. 如何在Flash中索引元素


image

元素类型

在Flash中模拟环形数组,我们需要对每个元素的长度提两点要求:

  1. 每个元素的长度是一样
  2. 元素的数据长度能够被Flash擦除块整除


image

对于第一点,因为在C语言中,数组是定长的,而且只能存储一种数据类型,也就是说数组是int型的,就只能存储int型的数据。那么我们在Flash中模拟时,也需要将FLASH看成一个长度与类型固定的数组,并且需要Flash中的每个元素都是同一种类型的,即数据长度一样。

对于第二点,由于Flash的擦除特性是按块擦除(像下图一样,一个擦除块就像表中的一行),我们希望每次擦除都是擦掉整数个元素。例如sst25vf16b擦除块是4096字节,那么写入的每个元素的长度应该是2的n次方,即1个字节、2个字节、4个字节..

索引


image

每个元素的地址是与索引对应的,即索引乘以每个元素的长度就是这个元素所在的地址。因此通过简单的换算就可以得到各个元素的索引值了。

总结


image

通过在Flash中模拟环形数组的方式存储数据之后可以按照环形数组的操作实现,数据的写入、读出、判断是否满和剩余空间等操作了。


欢迎大家添加我的微信公众号“光豆儿”



路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)