-
Notifications
You must be signed in to change notification settings - Fork 884
Description
I use W25Q128 Flash.
My LFS adopts the following configuration.
const struct lfs_config fsCfg =
{
.read_size = 32,
.prog_size = 32,
.block_size = 4096,
.block_count =10, //address start at 0x800
.lookahead_size = 64,
.block_cycles = 8,
.cache_size = 1024,
};
I have some data that needs to be stored in flash at any time when there is a power outage. So every time I use lfs to open a file (use open type writeOnly, append) and write to it, I immediately close the file (I also used sync testing, and the results were the same).
If I don't close file it or synchronize, then the power outage data will be lost at this time
The data is stored in a structure with a size of 64B, and the size is always 64 when writing. Because it immediately shuts down after each write, lfs saves the data back to flash after each write. In this case, when the file size is over 512 B, every time I save data, lfs erases a new sector. You know, I only wrote 64B of data, but every time lfs erases an entire sector of 4096B, there is a difference of 2 ^ 6=64 times. This is a bit too inefficient, and even less efficient than simply erasing the sectors in place.
Is it caused by my usage error.
My log is as follows。
The
"i" mean times of write.
"size" means the total number of bytes in the file now( befor write data and close file ).
"fe" means erase sector .
- >
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 0,size=0 (file size now)
- > w25WrAdd = 0x801040,size=64 //maybe creat file
- > w25WrAdd = 0x801080,size=96 //maybe write file =64; update file info = 32; total 96
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 1,size=64
- > w25WrAdd = 0x8010E0,size=160 // maybe write file =64*2; update file info = 32;total 160.
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 2,size=128
- > w25WrAdd = 0x801180,size=224 // maybe write file =64*3; update file info = 32;total 224. Copying the entire file every time is too inefficient
- >
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 3,size=192
- > w25WrAdd = 0x801260,size=288
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 4,size=256
- > w25WrAdd = 0x801380,size=352
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 5,size=320
- > w25WrAdd = 0x8014E0,size=416
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 6,size=384
- > w25WrAdd = 0x801680,size=480
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 7,size=448
- > w25WrAdd = 0x801860,size=544
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 8,size=512
- > fe:802 //when size is over 512 ,every time close file, erase sector.
- > w25WrAdd = 0x802000,size=576
- > w25WrAdd = 0x801A80,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 9,size=576
- > fe:803
- > w25WrAdd = 0x803000,size=640
- > w25WrAdd = 0x801AA0,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 10,size=640
- > fe:804
- > w25WrAdd = 0x804000,size=704
- > w25WrAdd = 0x801AC0,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 11,size=704
- > fe:805
- > w25WrAdd = 0x805000,size=768
- > w25WrAdd = 0x801AE0,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 12,size=768
- > fe:806
- > w25WrAdd = 0x806000,size=832
- > w25WrAdd = 0x801B00,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 13,size=832
- > fe:807
- > w25WrAdd = 0x807000,size=896
- > w25WrAdd = 0x801B20,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 14,size=896
- > fe:808
- > w25WrAdd = 0x808000,size=960
- > w25WrAdd = 0x801B40,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 15,size=960
- > fe:809
- > w25WrAdd = 0x809000,size=1024
- > w25WrAdd = 0x801B60,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 16,size=1024
- > fe:802
- > w25WrAdd = 0x802000,size=1024
- > w25WrAdd = 0x802400,size=64
- > w25WrAdd = 0x801B80,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 17,size=1088
- > fe:803
- > w25WrAdd = 0x803000,size=1024
- > w25WrAdd = 0x803400,size=128
- > w25WrAdd = 0x801BA0,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 18,size=1152
- > fe:804
- > w25WrAdd = 0x804000,size=1024
- > w25WrAdd = 0x804400,size=192
- > w25WrAdd = 0x801BC0,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 19,size=1216
- > fe:805
- > w25WrAdd = 0x805000,size=1024
- > w25WrAdd = 0x805400,size=256
- > w25WrAdd = 0x801BE0,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 20,size=1280
- > fe:806
- > w25WrAdd = 0x806000,size=1024
- > w25WrAdd = 0x806400,size=320
- > w25WrAdd = 0x801C00,size=32
- >
- >
- > .............................Omit some conten
- >
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 62,size=3968
- > fe:806
- > w25WrAdd = 0x806000,size=1024
- > w25WrAdd = 0x806400,size=1024
- > w25WrAdd = 0x806800,size=1024
- > w25WrAdd = 0x806C00,size=960
- > w25WrAdd = 0x800180,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 63,size=4032
- > fe:807
- > w25WrAdd = 0x807000,size=1024
- > w25WrAdd = 0x807400,size=1024
- > w25WrAdd = 0x807800,size=1024
- > w25WrAdd = 0x807C00,size=1024
- > w25WrAdd = 0x8001A0,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 64,size=4096
- > fe:808
- > w25WrAdd = 0x808000,size=96 //size over 4096 ,repeat the process
- > w25WrAdd = 0x8001C0,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 65,size=4160
- > fe:802
- > w25WrAdd = 0x802000,size=160
- > w25WrAdd = 0x8001E0,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 66,size=4224
- > fe:803
- > w25WrAdd = 0x803000,size=224
- > w25WrAdd = 0x800200,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 67,size=4288
- > fe:804
- > w25WrAdd = 0x804000,size=288
- > w25WrAdd = 0x800220,size=32
- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i= 68,size=4352
- > fe:805
- > w25WrAdd = 0x805000,size=352 //size over 4096 ,repeat the process
- > w25WrAdd = 0x800240,size=32
Is it my usage mistake, or is it how lfs is designed.