Cleaned up tag encoding, now with clear chunk field
Before, the tag format's type field was limited to 9-bits. This sounds
like a lot, but this field needed to encode up to 256 user-specified
types. This limited the flexibility of the encoded types. As time went
on, more bits in the type field were repurposed for various things,
leaving a rather fragile type field.
Here we make the jump to full 11-bit type fields. This comes at the cost
of a smaller length field, however the use of the length field was
always going to come with a RAM limitation. Rather than putting pressure
on RAM for inline files, the new type field lets us encode a chunk
number, splitting up inline files into multiple updatable units. This
actually pushes the theoretical inline max from 8KiB to 256KiB! (Note
that we only allow a single 1KiB chunk for now, chunky inline files
is just a theoretical future improvement).
Here is the new 32-bit tag format, note that there are multiple levels
of types which break down into more info:
[---- 32 ----]
[1|-- 11 --|-- 10 --|-- 10 --]
^. ^ . ^ ^- entry length
|. | . \------------ file id chunk info
|. \-----.------------------ type info (type3)
\.-----------.------------------ valid bit
[-3-|-- 8 --]
^ ^- chunk info
\------- type info (type1)
Additionally, I've split the CREATE tag into separate SPLICE and NAME
tags. This simplified the new compact logic a bit. For now, littlefs
still follows the rule that a NAME tag precedes any other tags related
to a file, but this can change in the future.
This commit is contained in:
+3
-3
@@ -253,7 +253,7 @@ tests/test.py << TEST
|
||||
|
||||
// find out max file size
|
||||
lfs_mkdir(&lfs, "exhaustiondir") => 0;
|
||||
for (int i = 0; i < 9; i++) {
|
||||
for (int i = 0; i < 10; i++) {
|
||||
sprintf((char*)buffer, "dirwithanexhaustivelylongnameforpadding%d", i);
|
||||
lfs_mkdir(&lfs, (char*)buffer) => 0;
|
||||
}
|
||||
@@ -275,7 +275,7 @@ tests/test.py << TEST
|
||||
|
||||
lfs_remove(&lfs, "exhaustion") => 0;
|
||||
lfs_remove(&lfs, "exhaustiondir") => 0;
|
||||
for (int i = 0; i < 9; i++) {
|
||||
for (int i = 0; i < 10; i++) {
|
||||
sprintf((char*)buffer, "dirwithanexhaustivelylongnameforpadding%d", i);
|
||||
lfs_remove(&lfs, (char*)buffer) => 0;
|
||||
}
|
||||
@@ -287,7 +287,7 @@ tests/test.py << TEST
|
||||
}
|
||||
lfs_file_sync(&lfs, &file[0]) => 0;
|
||||
|
||||
for (int i = 0; i < 9; i++) {
|
||||
for (int i = 0; i < 10; i++) {
|
||||
sprintf((char*)buffer, "dirwithanexhaustivelylongnameforpadding%d", i);
|
||||
lfs_mkdir(&lfs, (char*)buffer) => 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user