Optimize flash writes on SAMD21 #4905
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
In its current implementation, the
machine.Flash.WriteAt()
function on SAMD21 will copy data to the internal flash memory in 4-byte chunks -- even if the page buffer is actually 64 bytes long for all chip variants.The existing code can be improved to get ~12x faster write speeds, which will be useful when #4844 (USB mass storage) is merged and SAMD21 support is added.
I get these results when writing 4kB of data:
This will also make sure that no more than 4 writes are performed to the same flash row (256 bytes long). The datasheet says:
Based on my long-term testing (working on a device that reads and writes a lot), it seems to work as expected. Data is saved to the expected memory location and can be read after the reset. It would be nice if someone else could take a look.
Of course, this is a breaking change. If some application assumes the block size of 4, it will not work properly.
There's also SAMD51 that could benefit from similar change, but I don't have any device to test with.
References: