Як захистити SD-карту від несподіваних збоїв живлення?


18

Я працюю на пристрої, який використовує бібліотеку Microchip MDDFS для зберігання даних на SD-карту. Журнал записує дані з максимальною швидкістю 1 запис (56 байт) щохвилини. Проблема полягає в тому, що пристрій може втратити живлення в будь-який час, потенційно посеред послідовності запису. Мені цікаво, який найкращий спосіб захистити мої дані від корупції. Я виявив, що якщо файл відкритий при втраті живлення, всі дані, записані у файл після останнього закриття файлу, втрачаються. Я не знаю, чи те ж саме справедливо, якщо втрачається потужність в середині послідовності запису.

Оскільки процедура запису не трапляється дуже часто, я можу відкривати файл, записувати дані та закривати файл, кожного разу, коли дані реєструються. Чи з часом такий підхід пошкодить sd-карту?

Ще один підхід може тримати файл відкритим, але після кожні 10 або 50 записів я міг би закрити файл, а потім повторно відкрити його.

Я також міг буферувати дані в пам'яті, а потім час від часу обробляти їх, можливо, після кбайт або близько того.

Остання ідея, що в мене була, я міг додати великий конденсатор, який би забезпечував живлення моєї карти карти / sd досить довго після відключення живлення, щоб швидко закрити файл. Проблема такого підходу полягає в тому, що час, необхідний для закриття файлу та / або збереження даних, є дуже непослідовним. Наскільки я розумію, цей час може дуже залежно від поточного місця у флеш-сторінці, на якій знаходиться файл.

У будь-якому випадку, що б ви запропонували?


2
Якщо ви перейшли на необмежену флеш-пам’ять NAND з мінімальною файловою системою, ви можете проаналізувати багато шарів абстрагування, що перешкоджають вашим можливостям робити невеликі записи, і, ймовірно, отримати можливість робити часткове записування блоків негайно, коли дані стануть доступними. Ви також будете захищати від того, щоб кінцевий користувач замінив карту з різними реквізитами про ефективність (можливо, навіть маргінальною сірою) у дорозі.
Кріс Страттон

Відповіді:


16

Під час запису даних у файл може трапитися декілька речей. Я опишу послідовність, яка повинна відбутися, щоб дані були безпечними, не обов'язково викликами з бібліотеки.

Коли ви пишете та додаєте до кінця файлу (звичайний режим запису), ви читаєте останній блок файлу в пам'яті, модифікуєте його за допомогою даних запису, а потім записуєте весь блок назад на карту SD . Якщо блок заповнений, новий блок потрібно знайти в Таблиці розподілу файлів (FAT). Після знаходження нового блоку FAT повинен бути оновлений, що є циклом читання-модифікації-запису. Якщо ми закінчимо з файлом, то нам потрібно оновити атрибути файлів (наприклад, довжина файлу) у кореневій директорії, що спричинить ще один цикл читання-зміна-запис.

Мінімізація часу на запис

  • Переконайтеся, що у файлі вже зберігаються ваші дані, коли ви пишете сектор. Якщо ви почнете з великого файлу і замініть дані замість додавання даних, дані стануть у безпеці, як тільки запис сектору SD-карти закінчиться. Таким чином можна усунути один-два цикли читання-зміни-запису. Мій пусковий код записуватиме 0 у файл з кроком до сектору до повного заповнення SD-карти, а потім перемотайте на початок файлу.

  • Зробіть розмір записів даних таким, щоб ціле число записів помістилося в секторі. Я підніс би ваші записи до 64 байт. Незважаючи на те, що це менш ефективно, це не дозволить вам прочитати-змінити-написати два сектори.

  • Створіть варіант функції FSwrite, який дозволяє писати цілі сектори. Якщо ви зберігаєте весь сектор в SRAM, то ваш цикл переходить від "читати-змінювати-писати" до "змінювати-писати"

Тримайте живлення PIC та SD якомога довше

  • Великі конденсатори хороші. 470uF повинен дати вам більше ніж достатню потужність для завершення циклу запису.

  • Переконайтесь, що джерело живлення не буде висмоктувати живлення з резервного конденсатора! При необхідності додайте діод.

Знай, коли тобі не в силах

  • Велика кришка джерела живлення дасть вам 10 мс і більше, щоб обернути речі SD-карткою, але не натискайте на удачу. Використовуйте шпильку на мікроконтролері, щоб побачити, чи джерело живлення все ще добре, і не починайте писати, якщо джерело помер.

Дякуємо за інформацію. Дуже корисний. Я побачу, що я можу з цим зробити ...
PICyourBrain

Як довго, на вашу думку, знадобиться записати всі нулі на карту 4 Гб? Здається, давно. Крім того, чи є у вас приклади коду, якими ви могли б поділитися для зміни функції fswrite, щоб дозволити записувати цілі сектори?
PICyourBrain

Крім того, якщо ви записуєте всі нулі у файл. Як ви відстежуєте, де знаходиться кінець фактичних даних? Ви просто прочитали всі дані на початку і знайдете рядок нулів?
PICyourBrain

1
Якщо ви використовуєте FAT16, я вважаю, що ви обмежені 2 Гб. Я вважаю, що карта SD / MMC має функцію "блокування стирань", яка, здається, не реалізована в бібліотеці MDDFS. Я використовував власну бібліотеку кодів для свого проекту SD-карт, тому я не можу ділитися будь-якими прикладами коду. Для того, щоб знайти останні дані, вам потрібно буде прочитати, поки ви не знайдете всі 0 у записі даних. Якщо ваш запис даних може бути рівним 0, я б радив додати деякі ненульові дані або роздільник деяких типів.
W5VO

6

Одне питання, яке ще не згадується на картах SD (або MMC, CompactFlash тощо), полягає в тому, що, хоча SD-карта може здаватися хосту як проста колекція 512-байтних секторів, які можуть читатися і записуватися у довільному порядку, флеш-пристрої загалом зберігайте 528-байтні сторінки в групах, які мають 32 КБ, якщо не більша кожна, і єдині підтримувані операції - це або записати на іншу порожню сторінку, або стерти всю групу. Для вирішення цього обмеження контролер на SD-карті зберігатиме таблицю, яка дозволить будь-якому логічному сектору відобразити будь-яку фізичну сторінку. Коли подається запит на написання сектору, контролер знайде порожню сторінку десь на чіпі та оновить відображення новою адресою відповідного сектора. Якщо порожні сторінки можуть бути дефіцитними, або в інший час,

Важливість цього полягає в тому, що акт запису до певного логічного сектора може зажадати переміщення даних з багатьох логічних секторів. Якщо в цьому процесі щось піде не так, це може призвести до корупції будь-якого довільного сектору - не лише сектора, на якому просили написати карту. Хороший контролер SD-карти повинен бути розроблений для виконання операцій переміщення даних таким чином, що якщо втрачається живлення під час переміщення даних, він зможе визначити, які частини операції завершено, а які - і отже, зможете закінчити операцію належним чином. На жаль, я не маю уявлення, як можна сказати, чи буде корисна в цьому плані SD-карта 5 доларів, знята в магазині знижок.

Безумовно, навіть якщо SD-карта абсолютно ідеальна з точки зору забезпечення того, що кожна операція запису, яка, як повідомлялося, завершена, насправді переживе відключення живлення (тобто забезпечення того, чи буде ця робота написана чи ні) викликав би завершення, достатньо завершено, що карта закінчить операцію, коли живлення буде повторно застосовано), що не означає, що операційна система хоста не матиме проблем, якщо вона виконує деякі, але не всі дані, які вона записує. Тим не менш, важливо враховувати, що якщо SD-карта не зможе підтримати її кінець "угоди", нічого не можна зробити на програмному забезпеченні, що запобігає втраті даних від збою живлення.


Це дуже проникливий коментар.
Фред Бассет

5

Я б також запропонував використовувати якусь контрольну суму для перевірки правильності даних на SD, коли їх потрібно прочитати.


3

Можливо, цей суперконденсатор Sparkfun вирішив би проблему.


2
Він би утримував пам'ять PIC, але він має 10uA макс. Я не думаю, що ти можеш так сильно записати на SD-карту.
W5VO

1
Концепція хороша, хоча. Швидкий пошук знайдений конденсатор Іллінойса ( illinoiscapacitor.com ) має суперконденсатор до 8 F і здатний підтримувати струми до 4 А. Додавання одного з них або акумулятора дасть мікро шансам закінчити запис і закрити речі. добре, якщо основне джерело живлення вийшло з ладу.
Фотон

3

Оскільки процедура запису не трапляється дуже часто, я можу відкривати файл, записувати дані та закривати файл, кожного разу, коли дані реєструються. Чи з часом такий підхід пошкодить sd-карту?

Як і будь-яка інженерна проблема, тут вам доведеться розібратися з компромісами.

Чи критично, що дані не втрачаються взагалі? Тоді я зробив би сказане вище. Ви втратили б більше збитків, ніж втратили дані. Ви можете провести стрес-тест, подібний, щоб визначити, скільки разів ви могли виконати цю операцію, перш ніж карта пошкодиться. Якщо ви спокійні за тривалість часу, який минув до того, як картка стала непридатною, і перед тим, як змінити карту, здається, це прийнятний проміжок часу, я б пішов з цим маршрутом.


1

Якщо ви хочете просто зберігати дані, у файловій системі немає потреби. операція запису буде виконана безпосередньо над SPI шляхом вибору адреси блоку. тим самим ви мінімізуєте час запису і ви ризикуєте пошкодити дані.

Навіть у випадку втрати електроенергії та без везіння ви втратите лише один запис (що може бути прийнятним у певній системі).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.