-
Notifications
You must be signed in to change notification settings - Fork 25
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Rethinking NorFlash and writing abilities #58
Comments
Let's create an overview of all(ish) different random(ish) access memory types and their properties to see if we can find a common usable interface: overview
Let's summarize what we see:
Not mentioned is memory reliability with regards to bitflips and corruption. This is all information that could be encoded into a trait: trait Storage {
const READ_SIZE: usize;
const WRITE_SIZE: usize;
const ERASE_SIZE: Option<usize>;
const IS_BLOCK_DEVICE: bool = READ_SIZE == WRITE_SIZE && match ERASE_SIZE { Some(READ_SIZE) => true, _ => false };
const WRITE_METHOD: WriteMethod;
const WRITE_MAX_COUNT: WriteMaxCount;
const ERASE_VALUE: u8; // 0xFF or 0x00
fn read(&mut self, offset: u32, bytes: &mut [u8]) -> Result<(), Self::Error>;
fn capacity(&self) -> usize;
fn erase(&mut self, from: u32, to: u32) -> Result<(), Self::Error>;
fn write(&mut self, offset: u32, bytes: &[u8]) -> Result<(), Self::Error>;
}
enum WriteMethod {
Direct, // No erase required
AndWithPrevious, // So erase required
}
/// How many times can a word be written before erase is required?
enum WriteMaxCount {
Once,
TwiceSecondZero,
Infinite,
} Block devices would use the address of each block instead of a block index. Pros:
Cons:
|
Thank you for doing the analysis! Personally I find this less complex than what I did a small test on Looking forward to more discussions on this! |
Ha, you're the only one with such a positive outlook on this. Most people in the embedded matrix chat thought it was way too complex. So I'm gonna think about it some more and see if I can find a way to keep the flexibility while also supporting a wide range of storage types. But I also invite anyone to think along and come up with problems, solutions and proposals! |
Hi all!
In #57 an extension was proposed to add a
second write must be 0
ability.However, the way this is done doesn't really help anyone who wants to abstract over the different write abilities.
Personally for sequential-storage I want to do these two things:
This last one isn't possible at the moment, but hasn't been a big issue for me thus far.
Currently there are two (cap?)abilities:
It's worked ok so far, but when adding more abilities like
Write twice, second write is 0
, things get more complex.To support this in s-s without making things worse for real multiwrite flashes, we need to be able to query the abilities in general APIs that can't use the trait bounds (because they need to be general).
So, I propose we discuss something along these lines: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=4479663da7dd48eb5ad8402260d75d24
It's verbose sadly, but it does make everything work. If someone can come up with something better I'm all ears!
We need the chain of traits because
const generics
aren't stable yet and we can't put const bounds on our functions and structs.We need the associated consts so we can query the abilities on APIs that only use the
NorFlash
trait as a bound. (This would be solved by reflection, but alas)This is now all implemented as an associated type to make the implementation less bug-prone.
Could this be a good direction to go in?
There's also #56 which proposes block devices like SD cards.
Now I've been thinking about how to run s-s on SD cards and there's no good way since they would be separate traits.
However, that might not be necessary with the write abilities I propose here. Maybe we can unify these all and make one trait based on the current
NorFlash
trait and add aBlock
write ability? I don't know, maybe there are reasons why that can't work...The text was updated successfully, but these errors were encountered: