【问题标题】:Implementing a standard stack in a page-writable sector-erasable flash memory在页可写扇区可擦除闪存中实现标准堆栈
【发布时间】:2021-07-06 05:33:50
【问题描述】:

我想在我的微控制器固件中实现一个简单的堆栈。 我想实现的堆栈就像this,即标准的东西。

问题是我使用的闪存 IC 支持页面粒度进行写入,但支持扇区粒度进行擦除,就像任何其他 NAND 闪存一样,在闪存上写入一些数据之前,您应该擦除该部分。

作为总结,我擦除了一个扇区并在其第一页上写入了一些数据。为了重写该页面的一个字节,我应该先擦除整个扇区。

在我的堆栈中,

| ○ | ○ | ○ | ○ | ○ |哦|

我推送一些数据:

| W | W | W | ○ | ○ |哦|

然后弹出其中一个:

| W | W |磷 | ○ | ○ |哦|

现在我想推送另一个数据。这里问题出现了。如果像标准堆栈一样,我决定写入以前的数据并更改索引,我必须先删除整个扇区!因此我应该以编程方式解决这个问题。

有什么想法吗?

P.S:闪存映射为:16 Blocks -> Each Block = 16 Sectors -> Each Sector = 16 Pages -> 每页 = 256 Bytes

我有一个页面级别的写入命令,其中包含扇区和块的偏移和擦除命令。

【问题讨论】:

    标签: data-structures stack microcontroller


    【解决方案1】:

    好吧,如果您不想每次推送都写入整个扇区,那么您将不得不容忍堆栈中的一些旧数据:

    | W | W |磷 | W | ○ |哦|

    您需要在每个项目中至少保留一位,以便区分有效和无效。假设扇区擦除用 1 填充它,然后在您写入的所有有效项目中保留有效位 1。然后,您可以通过在弹出项目时将其更改为 0,只写一页,将其标记为无效。

    由于您无法在此方案中重复使用项目插槽,因此您的堆栈将不断增长,直至内存耗尽。这实际上就是你想要的,因为 NAND 闪存在它死前只能被写入这么多次,而且这种方案会在一定程度上分散写入。当您到达空间尽头时,您可以擦除并重写整个内容以消除所有间隙。

    您最终可能会得到一串很长的无效项目,因此跳过它们可能涉及扫描所有中间项目。您可以通过在每个项目中保留多个位来解决此问题。当你写一个有效的项目时,你使用这些位来存储它之前的无效项目的数量加上 1。这让你可以快速向后跳并以恒定的时间弹出。

    然后,当您想将某个项目标记为无效时,您可以将为此计数保留的位更改为全 0,同样只需写入一页。这个零计数不能出现在一个有效的项目中,所以它作为一个无效的标记。

    【讨论】:

    • 感谢您的回复。所以我认为这种方法有点像计算机中的文件系统。
    • 有点,但更简单
    猜你喜欢
    • 2021-02-12
    • 2022-01-03
    • 2015-01-29
    • 2017-08-05
    • 2016-05-09
    • 1970-01-01
    • 2015-04-14
    • 2018-11-03
    • 2012-06-11
    相关资源
    最近更新 更多