完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前提:如题,esp_partition_erase_range()函数擦除flash要求偏移offset与大小size必须对齐4KByte,即整片扇区擦除;
使用场景:我需要使用esp_partition_write()函数保存一条条名单(每条名单128Byte)到分区表中,然后esp_partition_write()函数要求写之前需要先擦除该区域;我的程序一些情况下需要修改某条名单的内容,这时候如果执行擦除再写入就会连其余名单也一起被擦除; 需求:有没有什么方法,可以修改每次擦除的扇区的大小?我想每次只擦除128Byte。 |
|
相关推荐
2个回答
|
|
擦除的扇区大小是由flash硬件本身决定的,是每次擦除的最小单位,没有办法更改。
|
|
|
|
在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的寿命,因此在实际应用中需要权衡利弊。 |
|
|
|
只有小组成员才能发言,加入小组>>
733 浏览 1 评论
552浏览 6评论
461浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
445浏览 5评论
446浏览 4评论
417浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 15:38 , Processed in 0.680518 second(s), Total 49, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号