||
在嵌入式系统中串行Flash是一个很常用的存储芯片。但是对于Cortex-M系列的MCU或者51单片机,若使用文件系统存储数据,即浪费存储空间,又消耗单片机的性能。因此需要一个更简单的存储方式来存储数据。
环形数组是我们经常使用的一种数据结构,常用于存储一些队列数据,因此我们不妨模仿环形数组的方式,在Flash中存储数据。
环形数组环形数组是一种首尾相连的数据结构。由于其头尾相接,这种数据结构能够更好的利用存储芯片的全部空间。
模拟环形数组数组有两个重要的部分:元素与索引。因此为了在Flash模拟环形数组,我们需要解决两个问题:
在Flash中模拟环形数组,我们需要对每个元素的长度提两点要求:
对于第一点,因为在C语言中,数组是定长的,而且只能存储一种数据类型,也就是说数组是int型的,就只能存储int型的数据。那么我们在Flash中模拟时,也需要将FLASH看成一个长度与类型固定的数组,并且需要Flash中的每个元素都是同一种类型的,即数据长度一样。
对于第二点,由于Flash的擦除特性是按块擦除(像下图一样,一个擦除块就像表中的一行),我们希望每次擦除都是擦掉整数个元素。例如sst25vf16b擦除块是4096字节,那么写入的每个元素的长度应该是2的n次方,即1个字节、2个字节、4个字节..
索引每个元素的地址是与索引对应的,即索引乘以每个元素的长度就是这个元素所在的地址。因此通过简单的换算就可以得到各个元素的索引值了。
总结通过在Flash中模拟环形数组的方式存储数据之后可以按照环形数组的操作实现,数据的写入、读出、判断是否满和剩余空间等操作了。
欢迎大家添加我的微信公众号“光豆儿”