реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Хранение файлов на at45db, DataFlash + мк с малыми ресурсами. Как?
alcosar
сообщение Sep 5 2007, 13:12
Сообщение #1


Участник
*

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



Предлагаю поделится опытом работы с DataFlash. А именно, как организовать на ней хранение файлов -- что-то вроде файловой системы? Какой оптимальный способ для микроконтроллера с малыми ресурсами(ОЗУ - 128..512 байт; FLASH - 2..16 килобайт)? Прилагаю файл с описанием того, как этот вопрос я решил для себя. Интересно ваше мнение, предложения и критика.
Прикрепленные файлы
Прикрепленный файл  files_on_data_flash.zip ( 2.48 килобайт ) Кол-во скачиваний: 209
 
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Sep 5 2007, 14:31
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



А собсно чем не нравится FatFS от ChaN`а?
Я так просмотрел ваш текстовичёк - прийдётся вам конечно поработаь над его исходниками, но в принципе это не смертельно... smile.gif
Go to the top of the page
 
+Quote Post
alcosar
сообщение Sep 6 2007, 03:48
Сообщение #3


Участник
*

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



Сам ФАТ нужно хранить в ОЗУ либо мк, либо DataFlash. В мк мало ОЗУ. В DataFlash во время записи используются оба буфера, чтобы ускорить запись. Сам ФАТ во флеши хранится в одной и той же странице. Т.е. запись в нее будет происходить при всякой операции записи. Нет равномерного износа.
Может можно сделать по-другому?
Исходники уже есть.
Go to the top of the page
 
+Quote Post
uriy
сообщение Sep 6 2007, 04:03
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Может быть вам будет достаточно хранить перед каждым файлом указатель на следующий файл (адрес начала следующего файла) но при большом количестве файлов думаю это будет медленно.
Цитата
В DataFlash во время записи используются оба буфера, чтобы ускорить запись

У меня на скорости 115200 успевает писаться с одним буфером, может быть такой скорости для вас будет достаточно.
Go to the top of the page
 
+Quote Post
kada
сообщение Sep 6 2007, 10:31
Сообщение #5


Частый гость
**

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



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

Выделить несколько страниц для хранения FAT и тем самым создать круговой буфер. В начале FAT предусмотреть некий маркер, по которому можно определить что данная страница содержит в себе валидную FAT. Для чтения из FAT находится страница с маркером. Для записи новой информации в FAT копируется текущая FAT в следующую страницу памяти. В старой затирается маркер. В новой меняются необходимые данные. Вместо маркеров можно использовать индекс номера текущей страницы с валидной FAT. Безусловно, по скорости такое решение далеко не лучший вариант. Зато несложное в реализации путем доработки исходников той же FatFS от ChaN`а
Go to the top of the page
 
+Quote Post
alcosar
сообщение Sep 6 2007, 11:06
Сообщение #6


Участник
*

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



Цитата(urasinov @ Sep 6 2007, 07:03) *
Может быть вам будет достаточно хранить перед каждым файлом указатель на следующий файл (адрес начала следующего файла) но при большом количестве файлов думаю это будет медленно.

У меня на скорости 115200 успевает писаться с одним буфером, может быть такой скорости для вас будет достаточно.


Вариант с указателем достаточно быстрый.
На скорости 115200 может прийти 115200/11 = 10470 байт, при 8 битах данных и двух стоповых.
Максимальное ремя записи со стиранием в версиях AT45DBxxxD 40 мс. Более ранние версии писали быстрее. За 40 мс может прийти более 440 байт. Если микросхема с размером буфера 256 байт, то нужно приостанавливать передачу или писать во второй буфер в то время когда первый переносится во флеш.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 6 2007, 14:07
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(kada @ Sep 6 2007, 13:31) *
В старой затирается маркер.
А смысл? Все равно ее придется стирать когда дойдет очередь. Может сразу стирать, а маркер текущей страницы сделать отличным от 0xFF?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Sep 7 2007, 04:20
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
kada
сообщение Oct 5 2007, 19:11
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Kovrov
сообщение Oct 9 2007, 04:46
Сообщение #10


Мастер-фломастер
****

Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700



Вот такой вопрос волнует в последнее время..
применяете ли вы, уважаемые колеги, какие нибудь методы контроля за записью или чтением в буфер
дата флеш?
Вопрос встал достаточно ощутимо после того, как попалась дфлешка с полуживым SPI..
и наблюдался такой глюк:
читаю полностью страничку памяти 528 байт
в ней заранее записаны нули..
и при чтении нет нет да промелькнет где то еденичка..
вчера всю голову сломал- думал что это: наводки или косяки в программе.
пока не заменил дфлеш.


--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
Go to the top of the page
 
+Quote Post
add
сообщение Oct 9 2007, 05:34
Сообщение #11


Местный
***

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



Цитата(Kovrov @ Oct 9 2007, 08:46) *
...и при чтении нет нет да промелькнет где то еденичка..
...
пока не заменил дфлеш.

Ну если единичка "промелькнула" то наверняка промелькнет еще раз уже на другой.Тут скорее дело не в мс. Вряд ли заменой мс проблема решилась(просто отложилась на некоторое время). Вопросы ЭМС и т.п. еще никто не отменял smile.gif. А полагатся на то что был плохой чип, это самоуспокоение.


--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
Go to the top of the page
 
+Quote Post
Kovrov
сообщение Oct 9 2007, 11:30
Сообщение #12


Мастер-фломастер
****

Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700



Возможно не спорю...
ну и тем не менее вопрос остается открытым.


--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
Go to the top of the page
 
+Quote Post
alcosar
сообщение Oct 9 2007, 12:24
Сообщение #13


Участник
*

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



Цитата(Kovrov @ Oct 9 2007, 07:46) *
Вот такой вопрос волнует в последнее время..
применяете ли вы, уважаемые колеги, какие нибудь методы контроля за записью или чтением в буфер
дата флеш?
Вопрос встал достаточно ощутимо после того, как попалась дфлешка с полуживым SPI..

Что значит полуживой? Как проявляется?
Цитата
и наблюдался такой глюк:
читаю полностью страничку памяти 528 байт
в ней заранее записаны нули..

Если нельзя без ошибок прочитать, откуда уверенность, что записались нули?
С DataFlash работаю давно, еще когда были 5-ти вольтовые. Такого еще не встречал. Правда, есть микросхема у которой не работает запись с буфера в память. На мою удачу это была не первая микросхема с которой я начал изучение DataFlash smile.gif.

Сообщение отредактировал alcosar - Oct 9 2007, 12:25
Go to the top of the page
 
+Quote Post
Kovrov
сообщение Oct 9 2007, 13:15
Сообщение #14


Мастер-фломастер
****

Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700



Попорядку:
как определил полуживость датафлешки....
На самом деле шину параллельно щупал с помощью лог анализатора...
по линии MISO наблюдались характерные пики (лог 1) несмотря на то что CS был неактивен (лог 1).
далее... статус регистр при обращении не всегда показывал во 2-5 бите "1011" at45db161
мог показывать вообще ересь типа FF или 00 хотя статус читал циклически.
И главное: под конец эпопеи данные вообще перестали записываться-считываться..
собственно из за чего и произошла замена и после чего все исчезло, но появились вопросы :-)


--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
Go to the top of the page
 
+Quote Post
alcosar
сообщение Oct 10 2007, 05:47
Сообщение #15


Участник
*

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



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

Что с питанием? Как получаете 3 В?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01484 секунд с 7
ELECTRONIX ©2004-2016