
Re: Използване на SPI FLASH и организация на данните вътре
Иначе организацията на една флаш фс е общо взето следната:
Имаш флаш, разделяш го на блокове. Ти си решаваш дали блоковете да са с фиксирана голема и различен брой според размера на флаша или пък фиксиран брой с различна големина. Примерно в първия вариант ако си избереш блок с размер 64к имаш 16 блока при 1МБ, 32 блока при 2МБ и т.н. Във втория вариант да речем си избираш 16 на брой блока, където всеки блок е 1/16 от размера на флаша ти. И при двата варианта условието е да може да изриеш кой да е блок, т.е. да е кратен на erase страница/сектор.
Сега от блоковете оставяш един винаги да ти е празен, а в останалите може да имаш данни. На всеки блок присвояваш логически номер, който си го пишеш в началото на блока. Да кажем че си избрал варианта с 16 блока, значи в началото си сканираш хедърите на всички физически блокове и си попълваш една табличка в паметта, кой логически на кой физически съответства. Идеята е, че с времето те се разместват...
От блоковете може да си направиш логически дискове. Да кажем един диск с големина 4 блока, един диск 2 блока, един диск 5 и т.н. Това е цел да си структурираш нещата, в смисъл ако търсиш даден файл да го търсиш само в блоковете на диска, а не из целия флаш.
Сега в рамките на един блок може да пишеш файлове. За целта от единия край на блока почваш да пишеш индекси, а от другия самите файлове. Индексите са записи с фиксиран размер, желателно много малък размер. Примерно размер на файла, crc на файла, crc на директорията.. плюс няколко вълшебни битчета. Идеята е като трябва да търсиш файл с определено име и/или директория, хващаш и четеш индексите подред и гледаш crc-тата. Табличката с индексите особено ако ползваш 16-бит crc-та и ако размера на файла ти е до 65kB е малка, така че с едно четене сканираш много записи...
Между другото докато четеш индексите си натрупваш и дължините, щото това ти е указател до текущия файл. И ако той те интересува това е от офеста от другия край на блока...
А самия файл започва с хедър от името на файла, директорията му, ако искаш CRC-та и после самите данни.
Това е организацията общо взето, пишеш файлчета от единия край, индекси от другия и така докато двете писания се срещнат, т.е. напълниш блока...
Сега за "вълшебните" битчета... Те са нещо като семафорчета, защото писането на един бит или ще мине, или няма да мине, но няма да остане в средно положение

Докато писането на повече данни не е ясно какво ще стане ако го прекъснеш по един или друг начин. Затова критичните неща се "обграждат" с писане на битчета. Примерно трябва да запишеш нов идекс на файл, пишеш го обаче без един бит. Ако запишеш блока, сваляш и битчето. При четене ако видиш че има мазано в индекс, ама битчето за валидност не е свалено, значи тоя индекс го прескачаш... И те така си защитаваш данните....
Едно битче може да си оставиш и за това дали файла е изтрит. Като го свалиш, после си знаеш да не ползваш файла. А данните си напрактика си остават в блока, нещо като "дупки". Между другото, в хедъра на блока може да имаш и битче за това дали си трил файлове, т.е. дали имаш дупки. Така, когато ти се напълни даден блок може да го оптимизираш като хванеш и копираш всички файлове в празния блока (нали имаш един винаги празен). Копираш естествено без дупките. И естествено това защитено с битчета за валиден блок, така че първо правиш новия блок валиден, после инвалидираш стария. Ех, ако ти спре тока точно по средата може да ти се получат два физически блока с едни и същи логически адреси, ама ти ще го хванеш това при следващия буут докато си изграждаш табличката логически-физически и освен това ако си сложиш и ревизия ще знаеш коя весия е старата и ще я инвалидираш....
Тва е, не е сложно.. само дето някои бъгчета се откриват месеци или години по-късно

Но пак ще кажа, дейтафлаша няма защита при SPI комуникацията и ако имаш смущения (GSM, тоци разни..) забрави да имаш надеждност!