我需要存储在闪存芯片中的圆形队列不同长度的项目。每个项目都有其封装,所以我可以计算出它是多么大,下一个项目开始。当有在缓冲足够的项目,将换行到开始。

<强>什么是存储一个循环队列在一个闪存芯片的好方法吗

还有就是我想用来存储数以万计的项目的可能性。于是从头开始并读取到缓冲区的结束并不理想,因为它需要时间来搜索到最后。

此外,由于它是圆形的,我需要能够向第一项从上次进行区分。

最后一个问题是,这是存储在闪存,这样既时间擦除每个块耗时且只能做的设定次数对每个块。

有帮助吗?

解决方案

<强>首先,块管理

把一个较小的头在每个块的开始。你需要的主要事情,以保持的“最老”,轨迹“最新”是块号,这只是增加模ķ。的ķ必须比你的块的总数更大。理想的情况下,使ķ不到您的MAX值(例如0xFFFF的),这样你可以很容易地知道什么是擦除块。

在启动时,您的代码读取依次在每个块的首部,和定位在序列中的第一个和最后块的是为n <子> i + 1的 =(N <子> I + 1)MODULOķ。小心不要得到由擦除的块混淆(块号是例如0xFFFF的)或以某种方式破坏的数据(例如,不完全擦除)。

<强>在每个块

每个块最初启动空(各字节为0xFF)。每个记录简单地写一前一后。如果你有固定大小的记录,那么你可以用一个简单的索引来访问它。如果你有可变大小的记录,然后读取它,你必须从块,链接列表样式开始扫描。

如果你想有可变大小的记录,但避免线性扫描,则可以对每个记录一个良好定义的报头。例如。使用0作为一个记录分隔符,和 COBS -encode (或 COBS / R -encode )每个记录。或者使用如果在每个记录(类似的 PPP协议)。

在启动时,一旦你知道你的最新的块,你可以做的最新记录的线性扫描。或者,如果你有固定大小的记录或记录分隔符,你可以做一个二进制搜索。

<强>擦除调度

有关一些闪存芯片,擦除块可以采取显著时间 - e.g。 5秒。考虑安排擦除作为后台任务有点“提前”。例如。当当前块为x%满,然后开始擦除下一个块。

<强>记录编号

您可能要数记录。我已经在过去做了它的方式是把在每个块的第一个记录的记录编号的头。然后,软件必须保持块内的每个记录的数量的计数。

<强>校验和或CRC

如果要检测损坏的数据(例如,不完整的写入或擦除由于意外的电源故障),那么可以将校验和或CRC添加到每个记录,并且可能用于块头。注意块头CRC只覆盖头本身,而不是记录,因为它不能当每一个新的记录被写入重写。

其他提示

请包含一个指向第一个记录的开始和最后的记录的结束的单独块。您也可以保持更喜欢的记录总数等信息。

直到你最初运行的空间,添加记录是如将其写入到缓冲器的端部和更新所述尾指针一样简单。

如您需要回收空间,删除足够记录,以便你能适应当前的记录。更新头指针,你删除记录。

您需要跟踪多少额外的空间已被释放。如果你保持一个指针,你需要添加一条记录,下一次来结束最后一个记录,你可以比较,与指针的第一条记录,以确定是否需要删除任何更多的记录。

此外,如果这是NAND,你或闪存控制器将需要做去块和损耗均衡,但应该都是在下层比所述循环缓冲区分配空间。

我想我现在就买下。这似乎是你最大的问题将具有填补录制的可用空间,接下来会发生什么?新的数据应该覆盖最早的数据,这是我相信你通过循环缓冲的意思。但由于该数据是不固定的长度,你可能会覆盖多条记录。

我假设变异性长度的量足够高,使得填充一切出为固定长度不是一个选项。

您写段需要不断表示要写入下一个记录的起始地址的轨道。如果你知道一个块的大小写的时间提前,你可以告诉你,如果打算在逻辑缓冲区的端到端起来,在“0”开始。我不会与一些在端部和一些在开始分割记录起来。

一个单独的寄存器可以跟踪开始;这是一个还没有被覆盖尚未最早的数据。如果你去了读出的数据,这是在那里你会开始。

在数据写入器然后将检查,给定的写起始地址和数据长度的约提交,如果应该凸块的读取寄存器,这将检查第一嵌段和看到的长度,并前进至下一个记录,直到有足够的空间来写任何的数据。会有垃圾数据的差距写入的数据的末端,最早的数据开始之间的生活,大概。不过这样一来,你可以像写开销的地址或两个,而不是重新排列块。

至少,这可能是我会做什么。 HTH

我看到三个选项:

选项1:是垫一切出到相同的尺寸,这是简单的,存储一个指向缓冲器的头部和尾部,所以你知道在哪里写入和从何处开始读,使用每个对象的大小,以得到偏移到下一个,这意味着你需要,你会链表,又名其缓慢的,如果你需要项目5000横向缓冲区。

选项2:是只指向真正的数据存储在循环缓冲区,这样,当你在你身边循环没有处理大小错误配衬。如果你存储在一个循环缓冲区的真实数据,并没有垫出来的地方在知晓的多个项目与1个新的数据对象,我想这也不行,你可能会遇到一个情况。

存储在其他位置的实际数据闪光灯,大多数闪存将有某种内置的磨损均衡的,如果是这样,你不需要担心同一位置多次重写,IC将找出其中实际存储它在芯片上,只写至到下一个可用的空闲空间。

这意味着你必须选择一个最大尺寸为循环缓冲器你如何做到这取决于数据的可变性。如果数据的大小,只是改变了,只有几个字节说,那么你应该只垫出来,并使用选项1.如果大小的变化疯狂和不可预知,选择它可能是最大的尺寸,并找出多少个对象那规模将适合您的闪存,使用作为缓冲区条目的最大数量。这意味着你浪费一堆空间。

选项3:如果对象真的可以是任何尺寸,你在哪里,你应该只使用一个文件系统,为了和循环命名文件备份点,当记满保管,如果你的新条目是大,你可能要删除多个旧条目以适应它,这是真的只是选项2的延伸,选项2是在许多方面是一个简单的文件系统。

在闪蒸“通知”可以在块大小,这意味着必须声明你分配用于此缓冲液中的闪光的多少块的基础上进行。

缓冲器的实际尺寸将是N-1之间的每个特定时间(n是块的数量)和正

每个块应该使用包含序列号或可用于确定哪些块是比其他老时间戳的标头开始。

封装有一个报头和页脚每个项目。默认的标题包含任何你想要的,但根据这个标题,你必须知道该项目的大小。默认页脚是0xFFFFFFFF的。该值表示一个空终止。

在您的RAM,你必须保存一个指向最早的数据块和最新块指针最古老的项目和最新的项目。接通电源后,你去了所有块找到相关的模块和加载这个成员。

当你要存储一个新的项目,你检查最新的块包含了此项目足够的空间。如果是您保存该项目在上一个项目的结束和改变以前页脚指向此文件。如果它不包含足够的空间,你需要删除最早的数据块。你抹去此前块更改最早的数据块成员(RAM)指向下一个和最古老的项目上,以在该块中的第一个项目点。 然后你就可以保存新的项目在此块和变化的最新项目的页脚指向这个项目。

我知道,可能的解释听起来很复杂,但这个过程是非常简单的,如果你把它写纠正你可以把它连电源故障安全(始终保持在你心里写的顺序)。

注重缓冲区的圆不保存在flash,但只闪存包含块与您可以根据块标题和邮件头是什么,这些项目的顺序决定项目

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top