| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Запис в SD карта http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=14528 |
Страница 1 от 2 |
| Автор: | 4040 [ Пон Апр 25, 2016 6:49 pm ] |
| Заглавие: | Запис в SD карта |
Трябва да записвам редовно постъпващи данни на една СД карта и се зачудих дали има някакви ограничения ,тъй като това си е флаш памет. Данните ще са по около 50 байта на всяка секунда в течение на дни и месеци. Картата е uSD, 2GB, FAT16, на 20MHz. Само ще се записва в текстови файлове, които после ще се смъкват на РС. Въпросът е дали да записвам 50-те байта всяка секунда или да трупам данните и да правя запис на няколко минути? |
|
| Автор: | miro_atc [ Пон Апр 25, 2016 7:31 pm ] |
| Заглавие: | Re: Запис в SD карта |
Мда, принципно е флаш, даже NAND с процесор вътре който се грижи за един куп алгоритми (износване/грешки и т.н.). И принципно ако картата е истинска не би трябвало да имаш грижи. Все пак не се знае какво е сътворил производителя и ако искаш да се застраховаш трябва да имаш предвид следното: Добре е картата да е била форматирано правилно, т.е. с команди или поне със запис на правилните стойности. Обикновено изтрит flash дава 0xFF, но при картите често е инвертирано, така че най-добре да се провери бита от инфо структурата, който указва дали е 0 или 1 по дефаулт. Това ти трябва в случай че пишеш на малки порции (по-малки от един сектор). Целта е да не се налага местене/триене на сектора. И тъй като ти не можеш да пишеш по-малко от един сектор, секторът първо се чете подменят се определени байтове и се пише. Та затова е важно какво е съдържанието там където още не си писал Другият вариант е да си направиш кеширане на ниво сектор, така дори и да се наложи триене на сектора то ще е еднократно. Има още един потенциален проблем с честото писане - файловата система трябва да си опреснява дължини на файлове и т.н., което води до презаписване на сектори... Това може да го спестиш ако приложението ти може да се ориентира по данните докъде е стигнало. Т.е. създаваш си първоначално един голям файл. В зависимост от картата съдържанието му ще е само 0000 или FFFF... Търсиш докъде си стигнал и почваш от там нататък да пишеш докато стигнеш края на файла. Но в общия случай, пак казвам не би трябвало да имаш грижи. Картата трябва да си дойде форматирана правилно, дори и да ъпдейтваш файловете с тия 50 байта в секунда трябва да издържи мнооого години |
|
| Автор: | DanielDimov [ Пон Апр 25, 2016 8:04 pm ] |
| Заглавие: | Re: Запис в SD карта |
Щом става въпрос за FAT16 - файловата система е разделена на сектори по 512 байта, които с 99% процента вероятност се пращат един по един за запис. Ако е така - има смисъл да си трупаш данни докато станат 512 или повече байта и тогава да запишеш първите 512 байта от буфера и т.н. докато цялото логване приключи. Ако правиш запис на всеки 50 байта - това ще доведе до безсмислено увеличаване на записите върху картата 10 пъти, което не трябва да те притеснява изобщо (не е като да е 10'000 пъти, което вече е притеснително)! |
|
| Автор: | ДедоБоре [ Пон Апр 25, 2016 8:52 pm ] |
| Заглавие: | Re: Запис в SD карта |
всички уважаващи себе си контролери за карти правят също оптимизация на писането по сектори. алгоритъма е горе-долу като описания по-горе, само дето контролера води списък в кои сектори е писал и се старае да изравнява броя на записите във всички сектори. далечен първообраз на SSD дисковете. сектора на NAND-а варира от големината на чипа и производителя. при CF и USB флашките е лесно да се разбере какъв е NAND чипа. при SD картите не е толкова лесно, но може би има програмчета за общуване с контролера. не съм се ровил в нета, за USB флашка има програми, с които да индентифицираш контролера и флаша, търси за SD. ако намериш, пусни линк тука. при NAND флешовете ситуацията е още по-кофти и от нормалните (NOR) флешове. има въведено понятието блок, които е няколко (десетки) сектора на флаша. може да се пише по сектори, но понякога може да се трие само блок. много зависи от чипа и/или производителя. още повече, че производителите на крайни устройства (самата карта) контрактват дириктно със силиконовата фабрика, най-малкото защото купуват паметите на кристали. и бог знае какви комбинации от "гениални" контролери и полу-бракувани чипове памет бондират при тази ценова война. и няма никаква гаранция, че един същи модел карта ще е еднакъв за всички тиражи, дори и закупени през 3 месеца. всичко това може и да не те интересува. просто пиши на по-големи хапки, желателно след записа да го провериш записаното. и като се скапе нещо, хвърляш флашката и слагаш нова за 5лв. ако контролера (на флашката) оптимизира сектори, по-голяма флашка теоретично ще се скапе след повече време при малък обем на използваната памет. |
|
| Автор: | 4040 [ Пон Апр 25, 2016 9:04 pm ] | |||||||||
| Заглавие: | Re: Запис в SD карта | |||||||||
Не е ли обратното - може да си пишеш в сектора колкото пъти си искаш (стига да е на празно място), а се трие наведнъж, така ,че и да е имало някакво старо съдържание , още с първото триене сектора се "форматира"? Сиреч , за един цикъл реално се брои не записът ,а триенето? Ето накои твърдения от нета ,които ми направиха впечатление (не знам дали всички са верни): 1. Изтритата памет е "пълна" само с 1-ци. 2. При запис може само да се променят 1->0 ,но не и обратно. При това може да се "нулирва" произволен байт ,че даже и бит , без да се "хаби" флаша. Но ако трябва да "сетнеш" 1-ца, трябва да се трие целия сектор/блок и живота му се намалява с един цикъл. 3. Физическият брой на циклите презапис при по-новите СД карти е по-малък (реално от 1 до 10хил.) , но със софтуерни алгоритми на контролерите и с излишък от памет се пазят секторите от чести презаписи (реално се следи да се износват равномерно). 4. При достигане на "края на живота" старите данни си остават - просто не може да се запишат нови. Което пък води до въпроса как всъщност се износва флаша - не може повече да се трие, да се записва, да се чете, комбинация от трите или просто дава произволни грешни резултати? |
||||||||||
| Автор: | miro_atc [ Пон Апр 25, 2016 9:28 pm ] | ||||||||||||||||||
| Заглавие: | Re: Запис в SD карта | ||||||||||||||||||
Всеки сектор може да го пишеш колкото пъти искаш каквото искаш. Въпросът е дали при записа ще е нужно и предварително триене. Представи си ситуация при която пишеш байт по байт. Ти пишеш първия байт, файлът ти е с дължина един байт, обаче физически винаги се пише цял сектор. Правилното е картата да е форматирана с команда предварително (това ти гарантира изтрит сектор) след това файловата система да прочете сектора и да промени само първия байт. Другият вариант е да знае дали изтрито значи 0-ли или 1-ци и съответно да допълни останалите 511 така, че те да останат непроменени. Защото ако промениш останалите байтове при запис на следващия байт целия сектор трябва да се трие.... |
|||||||||||||||||||
| Автор: | DanielDimov [ Пон Апр 25, 2016 9:32 pm ] |
| Заглавие: | Re: Запис в SD карта |
Всичко това е горе-долу вярно за голата флаш памет, но ти нямаш достъп до нея. Ти имаш достъп до едно или повече нива на абстракция отгоре върху флаш паметта до положението, че можеш произволно да четеш и записваш "блокове". Блоковете се обработват винаги целите - тоест винаги като четеш - картата ти предоставя цял блок, а когато записваш - подаваш данни за цял блок. Няма начин да работиш с по-малки обеми данни. Като наближи края на живота на картата - тя започва да губи данни - записваш нещо, то уж се записва, но по-късно като го прочетеш се оказва с грешки. Алгоритмите за корекция заложени в картата оправят нещата до едно време, но после изметнатите битове стават толкова много, че няма как да се справят и започваш наистина да получаваш променени данни. Между другото некачествените карти това го правят от ден първи. Качествените изкарват няколко десетки хиляди записа. |
|
| Автор: | TheWizard [ Пон Апр 25, 2016 10:02 pm ] |
| Заглавие: | Re: Запис в SD карта |
всъщност се поинтересувай файловата ти система как ще работи: дали ще презаписва сектора или ще флушва буфера когато се напълни иначе при "проста" файлова система при 512 байта сектор с тези 50 байта съкращаваш живота на картата 10 пъти няма значение предварителното изтриване(Full Format) на сектора - FAT-а няма данни "къде е чисто" - знае само "къде е края" |
|
| Автор: | ДедоБоре [ Вто Апр 26, 2016 12:04 am ] |
| Заглавие: | Re: Запис в SD карта |
миро, това, което си написал важи за работа с гол чип флаш. но когато той е скрит зад контролер, контролера има грижа за четене-триене-копиране на най-малката единица за триене във флеша. можеш да запишеш 1,000,000 пъти един и същ сектор (от абстракцията през инрефейса) и всеки уважаващ себе си контролер ще го запише в различни сектори на флеша (ако са различни) или няма да прави нищо (ако пишеш едни и същи данни). не се ангажирам с конкретни числа на секторен флеш, но да кажем, че е 8К, а един блок е 64К. някои памети могат да трият само блокове. когато пишеш 512 байта сектор, реално обаче трябва да се запише 8К в паметта. когато говорим за FAT и WIN, има значение и големината на клъстера. например FAT32 за малки медии (<512МВ) не поддържа клъстерно кеширане. а пък FAT16 не поддържа за повече от 2GB... и ако картата се форматира на WIN, а ще се ползва на някаква по-орязана емулация на FAT, трябва да се внимава с опциите за форматиране. |
|
| Автор: | miro_atc [ Вто Апр 26, 2016 9:48 am ] | |||||||||||||||||||||||||||
| Заглавие: | Re: Запис в SD карта | |||||||||||||||||||||||||||
Напротив, важи си за всякакви флаш носители. Ако пишеш бягащи нули или единици в сектора, какъвто и да е контролера отдолу няма как да повтори два последователни записа на едно и също място във физическия флаш (без междинно триене разбира се).
Има значение... нали това обяснявам! Файловите системи по принцип не се интересуват какъв е носителя отдолу. Има две често срещани имплементации на FAT, едната fill-ва с нули, другата винаги чете и не модифицира съдържанието на сектора след края на файла. Точно поради първата причина повечето карти инвертират данните, т.е. след формат данните са нули. Така като пишеш последователно на малки порции и fill-ваш с нули не мажеш флаша. Вторият вариант е по-чист и почти винаги се прилага при по-големите системи, тъй като отдолу почти винаги има журнал и секторът дето ще модифицираш задължително се изчита така или иначе, дори и цял сектор да пишеш. И при двата варианта (особено втория) има значение какво е предварителното съдържание. Освен това, ако се ползва трика с предварително създаден файл същия ефект може да има и от приложението. Ако примерно създават файловете с писане на колкото мегабайта им трябват FF или 00. Само че ако се ползва грешната стойност се получават пак бягащите нули/единици и постоянното бърсане...
Моите наблюдения са малко по-различни... Общо взето ние ползваме предимно евтини карти (идея нямам откъде се купуват). Досега не съм забелязал ефект на "забравяне". Сигурно има и такъв вид скапване, но на напрактика не сме наблюдавали. За сравнение при дейтафлашовете сме го забелязвали, най-вече заради това че интерфейсът им е незащитен и един бит шум в комуникацията може да доведе до писане/триене на грешно място. При SD картите това е почти изключено. Обикновено проблемите с картите са че почват да дават много грешки на комуникационно ниво. Възможно е това да е сързано с претоварване на вътрешния контролер (ако той трябва да си лекува много сектори и да не му остава време да си говори с нас - не знам). Но това е - картите почват да таймоутват, да дават грешки и т.н. В нашия случай обаче тъй като ние няма какво друго да правим, грешките само се логват и операциите се повтарят до откат. Крайният резултат е, че "скапаните" карти продължават да работят, само че заради многото опити работят мноооого по-бавно |
||||||||||||||||||||||||||||
| Автор: | radolin [ Вто Апр 26, 2016 10:09 am ] |
| Заглавие: | Re: Запис в SD карта |
От опита ми за ползване на SD карти в Линукс системи, ето няколко линка, които може да са полезни: https://wiki.linaro.org/WorkingGroups/K ... CardSurvey https://github.com/bradfa/flashbench http://sg.danny.cz/sg/sdparm.html https://lwn.net/Articles/428584/ |
|
| Автор: | DanielDimov [ Вто Апр 26, 2016 10:52 am ] | |||||||||
| Заглавие: | Re: Запис в SD карта | |||||||||
Аз имах следното "приключение": жена ми обичаше да снима с Nikon-а си в RAW формат, обаче започнаха да се появяват файлове, които фотошопа не успява да прочете (дава някаква грешка и не се отваря). Аз естествено се усъмних в картата и направих следните експерименти: 1. Записах няколко големи файла (размер около 10 MB колкото бяха и тогавашните RAW файлове) като на всеки от файловете още на PC-то бях сметнал MD5 хеш 2. Продължихме да снимаме с апарата и след 50-ина кадъра прочетох файловете обратно на PC-то и пак вадене на MD5 на всеки от тях - на някои от файловете (около 2-3 %) хеша беше различен 3. Същия експеримент като ползвам картата през самия апарат без да я вадя - резултата същия Картата беше ритуално счупена с чук, купих Kingston и проблемите с неотварянето на файловете във фотошоп приключи. От тогава тази карта се експлоатира жестоко първо със стария Nikon, а сега и с новия и няма нито един счупен RAW файл. |
||||||||||
| Автор: | 4040 [ Вто Апр 26, 2016 1:37 pm ] |
| Заглавие: | Re: Запис в SD карта |
Интересни слухове за SD картите: http://technabob.com/blog/2013/12/31/sd-card-programmable-hack/ И малко сметки: ако всяка секунда презаписвам един блок 32кБ, за 2ГБ ще трябват 18часа. А тези 2ГБ за да ги повторя така 10хил.пъти ще отнеме 20 години. Количествените натрупвания си казват думата. Макар ,че на теория, ако само се отвори файл и постоянно се пращат нови данни, не би трябвало да се появява физически презапис(триене) докато не се напълни картата. Но не се знае какво правят ФАТ драйверите и вътрешния контролер. |
|
| Автор: | gicho [ Вто Апр 26, 2016 3:11 pm ] |
| Заглавие: | Re: Запис в SD карта |
Има си индустриални SD карти, които са далеч по-надеждни от "музикалните", например ATP, не са NOR но поне са SLC. Ако цената не е проблем са много добра инвестиция. С другите ще е много зор да се стигне до някаква дефинируема надеждност, просто защото може да се предадат още на 10-тия запис. ФАТ-а не е от най-подходящите за флаш, разчита се изключително на контролера в картата да успее да направи "изравняването". Доколко често спира тока и колко назад ти е позволено да загубиш? Повече буфериране при теб ще помогне не само на картата, но и на консумацията. Това от микроконтролер ли ще го пишеш или от нещо по-голямо (линукс)? Картата ще се вади за да се събират данните или е просто буфер и през контролера ще се чете? |
|
| Автор: | DanielDimov [ Вто Апр 26, 2016 3:11 pm ] |
| Заглавие: | Re: Запис в SD карта |
При всеки запис във файл имаш ПОНЕ следните няколко записа по сектори: 1. Презаписва се сектора в който са самите данни. Елементарните реализации на FAT файлова система не оптимизират нищо, а директно шляпат новите данни (които може и да не са нови) върху диска (в твоя случай картата). Ако новите данни се паднат на границата м-у два сектора - записват се и двата. 2. Актуализира се елемента в директорията в която се намира файла - тук може да му се смени датата и часа, а може да се актуализира и дължината на файла. 3. Ако файла се удължава - той в някой момент ще вземе нов клъстер от файловата система - за това нещо трябва да се направи запис във FAT таблицата. Зависи как се паднат клъстерите и позицията на елементите им в таблицата - това може да изисква записване на един или два сектора. Освен това FAT таблицата има две идентични копия. Какво излиза в крайна сметка: за да запишеш няколко байта в един прост файл - това може да коства на картата запис на до 7 сектора. |
|
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|