乐鑫技术交流
直播中

李玉兰

7年用户 1478经验值
私信 关注
[问答]

擦除flash的API函数esp_partition_erase_range(),擦除的扇区大小能否设置呢?

前提:如题,esp_partition_erase_range()函数擦除flash要求偏移offset与大小size必须对齐4KByte,即整片扇区擦除;
使用场景:我需要使用esp_partition_write()函数保存一条条名单(每条名单128Byte)到分区表中,然后esp_partition_write()函数要求写之前需要先擦除该区域;我的程序一些情况下需要修改某条名单的内容,这时候如果执行擦除再写入就会连其余名单也一起被擦除;
需求:有没有什么方法,可以修改每次擦除的扇区的大小?我想每次只擦除128Byte。

回帖(2)

王若鸿

2024-6-20 14:08:46
 擦除的扇区大小是由flash硬件本身决定的,是每次擦除的最小单位,没有办法更改。
举报

王芳

2024-6-20 17:15:25
在ESP32中,`esp_partition_erase_range()`函数确实要求偏移offset与大小size必须对齐4KByte,即整片扇区擦除。这是由于Flash存储器的物理特性决定的。然而,您的需求是每次只擦除128Byte,这在硬件层面上是不允许的。但是,您可以通过以下方法实现类似的效果:

1. **使用软件层面的逻辑扇区**:您可以将一个4KB的物理扇区划分为多个128B的逻辑扇区。这样,您可以在软件层面上管理这些逻辑扇区,实现每次只擦除128B的需求。

2. **数据结构设计**:在每个128B的逻辑扇区内,您可以设计一个数据结构,例如:

   ```
   struct Entry {
       uint8_t data[128];
       bool is_valid;
   };
   ```

   其中`is_valid`用于标记该条目是否有效。当您需要修改某条名单时,可以先检查`is_valid`标志,如果为`true`,则先擦除整个4KB物理扇区,然后重新写入所有有效的条目,最后修改目标条目。

3. **写入操作**:当您需要写入新的条目时,可以在逻辑扇区内寻找一个`is_valid`为`false`的位置,写入数据,并将`is_valid`设置为`true`。如果逻辑扇区内没有可用空间,您需要擦除整个4KB物理扇区,然后重新写入所有有效的条目。

4. **擦除操作**:在需要修改某条名单时,您可以先找到该条目所在的逻辑扇区,然后擦除整个4KB物理扇区。在擦除后,重新写入所有有效的条目,最后修改目标条目。

5. **注意事项**:这种方法可能会导致写入放大(每次修改都需要擦除整个4KB扇区),从而影响Flash的寿命。因此,在设计系统时,需要权衡性能和Flash寿命。

总之,虽然硬件层面上无法实现每次只擦除128Byte,但通过软件层面的逻辑扇区管理和数据结构设计,您可以实现类似的功能。请注意,这种方法可能会影响Flash的寿命,因此在实际应用中需要权衡利弊。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分