|
Хранение файлов на at45db, DataFlash + мк с малыми ресурсами. Как? |
|
|
|
Sep 5 2007, 13:12
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 30-03-06
Пользователь №: 15 598

|
Предлагаю поделится опытом работы с DataFlash. А именно, как организовать на ней хранение файлов -- что-то вроде файловой системы? Какой оптимальный способ для микроконтроллера с малыми ресурсами(ОЗУ - 128..512 байт; FLASH - 2..16 килобайт)? Прилагаю файл с описанием того, как этот вопрос я решил для себя. Интересно ваше мнение, предложения и критика.
|
|
|
|
|
Sep 6 2007, 03:48
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 30-03-06
Пользователь №: 15 598

|
Сам ФАТ нужно хранить в ОЗУ либо мк, либо DataFlash. В мк мало ОЗУ. В DataFlash во время записи используются оба буфера, чтобы ускорить запись. Сам ФАТ во флеши хранится в одной и той же странице. Т.е. запись в нее будет происходить при всякой операции записи. Нет равномерного износа. Может можно сделать по-другому? Исходники уже есть.
|
|
|
|
|
Sep 6 2007, 10:31
|

Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 23-05-05
Из: Ташкент
Пользователь №: 5 324

|
Цитата(alcosar @ Sep 6 2007, 08:48)  Сам ФАТ нужно хранить в ОЗУ либо мк, либо DataFlash. В мк мало ОЗУ. В DataFlash во время записи используются оба буфера, чтобы ускорить запись. Сам ФАТ во флеши хранится в одной и той же странице. Т.е. запись в нее будет происходить при всякой операции записи. Нет равномерного износа. Может можно сделать по-другому? Исходники уже есть. Выделить несколько страниц для хранения FAT и тем самым создать круговой буфер. В начале FAT предусмотреть некий маркер, по которому можно определить что данная страница содержит в себе валидную FAT. Для чтения из FAT находится страница с маркером. Для записи новой информации в FAT копируется текущая FAT в следующую страницу памяти. В старой затирается маркер. В новой меняются необходимые данные. Вместо маркеров можно использовать индекс номера текущей страницы с валидной FAT. Безусловно, по скорости такое решение далеко не лучший вариант. Зато несложное в реализации путем доработки исходников той же FatFS от ChaN`а
|
|
|
|
|
Sep 6 2007, 11:06
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 30-03-06
Пользователь №: 15 598

|
Цитата(urasinov @ Sep 6 2007, 07:03)  Может быть вам будет достаточно хранить перед каждым файлом указатель на следующий файл (адрес начала следующего файла) но при большом количестве файлов думаю это будет медленно.
У меня на скорости 115200 успевает писаться с одним буфером, может быть такой скорости для вас будет достаточно. Вариант с указателем достаточно быстрый. На скорости 115200 может прийти 115200/11 = 10470 байт, при 8 битах данных и двух стоповых. Максимальное ремя записи со стиранием в версиях AT45DBxxxD 40 мс. Более ранние версии писали быстрее. За 40 мс может прийти более 440 байт. Если микросхема с размером буфера 256 байт, то нужно приостанавливать передачу или писать во второй буфер в то время когда первый переносится во флеш.
|
|
|
|
|
Sep 7 2007, 04:20
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(Сергей Борщ @ Sep 6 2007, 18:07)  А смысл? Все равно ее придется стирать когда дойдет очередь. Может сразу стирать, а маркер текущей страницы сделать отличным от 0xFF? А можно вообще ничего не стирать. Пусть маркер имеет значения 0 и 255 (по умолчанию в стертых секторах). Тогда нужный сектор выбираем по "переходу". Пример: Код № сектора 1 2 3 4 Маркер 0 255 255 255 Валидный сектор 1.
№ сектора 1 2 3 4 Маркер 0 0 0 0 Валидный сектор 4.
№ сектора 1 2 3 4 Маркер 255 0 0 0 Валидный сектор 1.
№ сектора 1 2 3 4 Маркер 255 255 0 0 Валидный сектор 2.
ну и т.д. Стирать конечно все равно придется, но помоему, лучше, чтобы операция выглядела как: 1. Если надо-стереть 2. Записать а не : 1. Записать 2. Если надо - стереть В первом варианте операция не полагается на то, что тот сектор, в который она начинает писать, был очищен предыдущей операцией
Сообщение отредактировал Непомнящий Евгений - Sep 7 2007, 04:24
|
|
|
|
|
Oct 5 2007, 19:11
|

Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 23-05-05
Из: Ташкент
Пользователь №: 5 324

|
Цитата(Сергей Борщ @ Sep 6 2007, 19:07)  А смысл? Все равно ее придется стирать когда дойдет очередь. Может сразу стирать, а маркер текущей страницы сделать отличным от 0xFF? Согласен. Упустил наличие необходимости в стирании страницы перед записью. Маркер, безусловно, должен быть отличным от 0xFF. Цитата(Непомнящий Евгений @ Sep 7 2007, 09:20)  А можно вообще ничего не стирать. Пусть маркер имеет значения 0 и 255 (по умолчанию в стертых секторах). Тогда нужный сектор выбираем по "переходу". Тоже решение. Правда немного усложнится поиск текущего валидного маркера.
Сообщение отредактировал kada - Oct 5 2007, 19:12
|
|
|
|
|
Oct 9 2007, 05:34
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата(Kovrov @ Oct 9 2007, 08:46)  ...и при чтении нет нет да промелькнет где то еденичка.. ... пока не заменил дфлеш. Ну если единичка "промелькнула" то наверняка промелькнет еще раз уже на другой.Тут скорее дело не в мс. Вряд ли заменой мс проблема решилась(просто отложилась на некоторое время). Вопросы ЭМС и т.п. еще никто не отменял  . А полагатся на то что был плохой чип, это самоуспокоение.
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Oct 9 2007, 12:24
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 30-03-06
Пользователь №: 15 598

|
Цитата(Kovrov @ Oct 9 2007, 07:46)  Вот такой вопрос волнует в последнее время.. применяете ли вы, уважаемые колеги, какие нибудь методы контроля за записью или чтением в буфер дата флеш? Вопрос встал достаточно ощутимо после того, как попалась дфлешка с полуживым SPI.. Что значит полуживой? Как проявляется? Цитата и наблюдался такой глюк: читаю полностью страничку памяти 528 байт в ней заранее записаны нули.. Если нельзя без ошибок прочитать, откуда уверенность, что записались нули? С DataFlash работаю давно, еще когда были 5-ти вольтовые. Такого еще не встречал. Правда, есть микросхема у которой не работает запись с буфера в память. На мою удачу это была не первая микросхема с которой я начал изучение DataFlash  .
Сообщение отредактировал alcosar - Oct 9 2007, 12:25
|
|
|
|
|
Oct 10 2007, 05:47
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 30-03-06
Пользователь №: 15 598

|
Цитата(Kovrov @ Oct 9 2007, 16:15)  Попорядку: как определил полуживость датафлешки.... На самом деле шину параллельно щупал с помощью лог анализатора... по линии MISO наблюдались характерные пики (лог 1) несмотря на то что CS был неактивен (лог 1). далее... статус регистр при обращении не всегда показывал во 2-5 бите "1011" at45db161 мог показывать вообще ересь типа FF или 00 хотя статус читал циклически. И главное: под конец эпопеи данные вообще перестали записываться-считываться.. собственно из за чего и произошла замена и после чего все исчезло, но появились вопросы :-) Что с питанием? Как получаете 3 В?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|