Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Mass storage in flash M25P16
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Dmitrich
Есть процессор STM32F103RC и память на 2 Мегабайта M25P16.
Хочется получить доступ к памяти через USB, как к диску.

Взял на сайте ST пример реализации mass storage, обрезал обращение к SD карточке, и для начала запустил в качестве памяти буфер на 32К в ОЗУ процессора.
Это работает, диск при подключении определяется, форматируется, файлы пишутся, читаются и стираются.

Нужно делать следующий шаг - перенести буфер во флеш. Для начала - хотя бы во внутреннюю флеш процессора.

И вот тут я "затормозил".

Виндовс при обращении к моему "диску" многократно перезаписывает таблицу размещения файлов.
Что с этим делать - с ходу не придумывается. Да и придумывать тут не надо - всё давно до меня придумано, но найти не могу.

Помогите, пожалуйста, кто "в теме".
polyname
кроме как кешировать весь сектор 64К в ОЗУ на момент стирания/записи - похоже что никак.
jcxz
Зачем "весь" и зачем "64К"?
Определяете минимальную порцию данных (страницу) которую может писать/стирать данная флешка (256/512/2048 байт) и все операции записи реализуете через эти страницы. Дальше - обычный write-back буфер страниц в ОЗУ CPU под некоторое кол-во этих страниц с вытеснением при переполнении наиболее старых страниц из ОЗУ во флеш.
И надо ещё предусмотреть сигнал аварии питания, по которому у вас при отключении питания CPU успеет всё содержимое буфера скинуть во флеш. Упреждение прихода сигнала относительно формирования RESET на CPU должно быть достаточным для сброса буфера. Для ускорения этого процесса, можно во флеш предусмотреть необходимое кол-во заранее стёртых страниц для такой аварийной записи (так как запись во флеш без стирания много быстрее чем со стиранием).

Цитата(Dmitrich @ Jan 16 2013, 01:20) *
Нужно делать следующий шаг - перенести буфер во флеш. Для начала - хотя бы во внутреннюю флеш процессора.

Не знаю как для STM32, но по LPC могу сказать что внутренняя флеш - не лучший выбор:
1. На порядок меньший ресурс перезаписи по сравнению с обычными SPI флеш.
2. Неудобный размер минимальных порций записи/стирания. И причём они разного размера.
3. Во время операций записи/стирания нельзя выполнять код из флеш. Соответственно если у вас в это время работает USB стек (и прочие ISR/задачи), то он весь должен быть в ОЗУ.
_3m
Цитата(jcxz @ Jan 16 2013, 06:01) *
Зачем "весь" и зачем "64К"?
Определяете минимальную порцию данных (страницу) которую может писать/стирать данная флешка (256/512/2048 байт) и все операции записи реализуете через эти страницы. Дальше - обычный write-back буфер страниц в ОЗУ CPU под некоторое кол-во этих страниц с вытеснением при переполнении наиболее старых страниц из ОЗУ во флеш.

Минимальный стираемый блок у микросхем M25P** фирмы микрон составляет 64 килобайта.
ViKo
Цитата(_3m @ Jan 16 2013, 06:59) *
Минимальный стираемый блок у микросхем M25P** фирмы микрон составляет 64 килобайта.

У M25PE** можно стирать страницы, по 256 байтов.
polyname
Цитата
Определяете минимальную порцию данных (страницу) которую может писать/стирать данная флешка
как раз 64К стирает, см.даташит.
jcxz
Тогда лучше использовать что-то более удобное: W25X16 (4K), AT45DB161D (512).
Иначе - придётся ставить внешнюю ОЗУ для буфера.
Хотя (так как микросхема флеш всегда будет использоваться вместе с данным ПО доступа к диску) можно придумать и что-то сложно извращённое. Например: иметь таблицу трансляции логических номеров секторов в физические, иметь один дополнительный свободный сектор, при записи некоторой страницы во флеш переписывать весь сектор, который её содержал в свободный сектор, корректировать таблицу трансляции и очищать старый сектор, объявляя его свободным. Таблицу трансляции надо сохранять в эту же флеш при сбое питания.
Или более сложный алгоритм типа как в SSD-дисках. disco.gif
Dmitrich
Спасибо отвечавшим, всё внимательно прочитал, и даже сам пытался думать.
Надумал вот что попробовать:

- сделать в RAM буфер размером с таблицу FAT.
Запись и чтение в сектора, принадлежащие FAT - перенаправлять в этот буфер.
Запись собственно данных - направлять сразу в M25P16.
А спустя одну-две секунды после окончания записи - переписывать FAT из RAM в M25P16, стирая предварительно сектор (64К).
Так как использоваться в качестве mass storage устройство будет очень редко, то это вполне допустимо.

Обязуюсь доложить результаты.

Цитата(ViKo @ Jan 16 2013, 08:27) *
У M25PE** можно стирать страницы, по 256 байтов.

К сожалению, нельзя. Только 64К.
ViKo
Цитата(Dmitrich @ Jan 16 2013, 10:05) *
К сожалению, нельзя. Только 64К.

Не понял, почему или кому нельзя. На всякий случай - кусок из технического описания.
Dmitrich
Цитата(jcxz @ Jan 16 2013, 11:01) *
Тогда лучше использовать что-то более удобное: W25X16 (4K), AT45DB161D (512).
Иначе - придётся ставить внешнюю ОЗУ для буфера.


Не, железо менять не будем

Цитата
Хотя (так как микросхема флеш всегда будет использоваться вместе с данным ПО доступа к диску) можно придумать и что-то сложно извращённое.


Именно так: - "сложно извращённое", и с учётом реальных потребностей.



Цитата(ViKo @ Jan 16 2013, 11:12) *
Не понял, почему или кому нельзя. На всякий случай - кусок из технического описания.


M25P16 нельзя.
ViKo
Цитата(Dmitrich @ Jan 16 2013, 10:22) *
M25P16 нельзя.

Купите втихаря M25PE16, перепаяйте втихаря, документацию откорректируйте, и - вперед! rolleyes.gif
Dmitrich
Цитата(jcxz @ Jan 16 2013, 06:01) *
Зачем "весь" и зачем "64К"?
Определяете минимальную порцию данных (страницу) которую может писать/стирать данная флешка (256/512/2048 байт)


Минимум, что можно стереть - 64К.

Цитата
И надо ещё предусмотреть сигнал аварии питания...аварийной записи.


Не, это не требуется. Mass storage - не основной режим, очень редкое использование.

Цитата
Не знаю как для STM32, но по LPC могу сказать что внутренняя флеш - не лучший выбор
...Во время операций записи/стирания нельзя выполнять код из флеш.


Про внутренний флеш я упомянул только имея в виду - попробовать. При этом я забыл, что запись останавливает выполнение. Спасибо, что напомнили. Не буду даже пробовать.
jcxz
Цитата(Dmitrich @ Jan 16 2013, 13:32) *
Минимум, что можно стереть - 64К.

Если вы говорите что железо менять нельзя, то у вас в устройстве значит уже должна быть внешняя память.
Либо использовать предложенный мной метод с таблицей трансляции логических номеров кластеров в физические.
Иначе - как вы собираетесь переписать один кластер во флеш с учётом того, что стирать можете только по 64К?
Размер кластеров в вашем FAT какой? 512 или...?
Либо внешняя память и тогда - считываем сектор, стираем его, заменяем изменившиеся кластеры в нём, записываем.
Либо используем таблицу трансляции - тогда не нужен большой буфер в ОЗУ и можно обойтись внутренней ОЗУ CPU.
Но таблицу трансляции надо скидывать по сигналу сбоя питания (это тоже должно быть уже в железе).
Если у вас чего-то из этого в железе нет, то его менять придётся всё равно и лучше заменить микросхему флеш на что-нить более удобное.
AlexandrY
Цитата(Dmitrich @ Jan 15 2013, 21:20) *
Виндовс при обращении к моему "диску" многократно перезаписывает таблицу размещения файлов.
Что с этим делать - с ходу не придумывается. Да и придумывать тут не надо - всё давно до меня придумано, но найти не могу.

Помогите, пожалуйста, кто "в теме".


Здесь надо вникнуть в детали. Насколько "многократно перезаписывает таблицу" вы знаете?
Там в худшем случае, предполагаю, будет соотношение 1 к 10. Т.е. 10 стираний в FAT на одно стирание в области файлов.
Это сущая ерунда. Если действительно как вы говорите файловая система будет использоваться редко.
Плюс это это соотношение можно еще улучшить изменяя размер файлов, количество файлов и размер кластеров.
Т.е. проблема скорее надуманна.
Dmitrich
Цитата(jcxz @ Jan 16 2013, 13:13) *
Если вы говорите что железо менять нельзя, то у вас в устройстве значит уже должна быть внешняя память.
Либо использовать предложенный мной метод с таблицей трансляции логических номеров кластеров в физические.
Иначе - как вы собираетесь переписать один кластер во флеш с учётом того, что стирать можете только по 64К?

Из внешней памяти в устройстве только M25P16. Устройство в таком виде свои задачи выполняет. В памяти ( M25P16 ) записаны голосовые сообщения, одним "куском" немного больше мегабайта. Файловой системы в устройстве нет. Звук записывается один раз при изготовлении, через технологический UART по протоколу X-modem, медленно и печально.
Речь идёт о модификации - ускорении этой загрузки. И - как дополнительный бонус - дать возможность заказчику обновлять звук при эксплуатации.
Цитата
Размер кластеров в вашем FAT какой? 512 или...?

Размер кластера, насколько я понимаю, мне виндовс задаст при форматировании.
Хм... А что, если мне самому "отформатировать" диск? Задать размер кластера 64К, тогда у меня вся таблица FAT будет крошечная. Виндовсу форматирование - запретить.
Надо попробовать.
Цитата
Либо используем таблицу трансляции - тогда не нужен большой буфер в ОЗУ и можно обойтись внутренней ОЗУ CPU.
Но таблицу трансляции надо скидывать по сигналу сбоя питания (это тоже должно быть уже в железе).

С таблицей трансляции как-то сложновато по моему. Да и, признаться, не очень понятно как.
Отследить потерю питания ТЕОРЕТИЧЕСКИ можно, но это "не вариант". При записи файла питание устройства будет, скорее всего - от USB. Время, в течении которого имеющиеся электролиты разрядятся с 5 до 3 вольт слишком мало. Но вполне можно сделать сохранение таблицы трансляции через 1-2 секунды после последней операции со стороны виндовс.
esaulenka
Предложение - забить на обновление FAT'а (сделать его ридонли, в памяти контроллера), и обновлять только данные. Пользователю разрешить только перезаписывать единственный имеющийся файл.

Нечто похожее есть в примерах NXP "USB bootloader".
jcxz
Цитата(Dmitrich @ Jan 16 2013, 18:03) *
Из внешней памяти в устройстве только M25P16. Устройство в таком виде свои задачи выполняет. В памяти ( M25P16 ) записаны голосовые сообщения, одним "куском" немного больше мегабайта. Файловой системы в устройстве нет. Звук записывается один раз при изготовлении, через технологический UART по протоколу X-modem, медленно и печально.
Речь идёт о модификации - ускорении этой загрузки. И - как дополнительный бонус - дать возможность заказчику обновлять звук при эксплуатации.
И зачем тут файловая система?
И уж точно она никак не поможет ускорить загрузку.
По-моему вы необоснованно усложняете задачу.

Цитата(Dmitrich @ Jan 16 2013, 18:03) *
Хм... А что, если мне самому "отформатировать" диск? Задать размер кластера 64К, тогда у меня вся таблица FAT будет крошечная. Виндовсу форматирование - запретить.
В FAT16 максимальный размер кластера ==32К. Учите матчасть cool.gif
И маленькие файлы тогда будут занимать очень много места.

Цитата(Dmitrich @ Jan 16 2013, 18:03) *
С таблицей трансляции как-то сложновато по моему. Да и, признаться, не очень понятно как.
У вас нет ОЗУ, достаточного для хранения 64К. И как вы при этом собираетесь перезаписывать отдельные области (кластера) внутри этих 64К, объясните?

Цитата(esaulenka @ Jan 16 2013, 18:10) *
Предложение - забить на обновление FAT'а (сделать его ридонли, в памяти контроллера), и обновлять только данные. Пользователю разрешить только перезаписывать единственный имеющийся файл.
Какой тогда вообще смысл в FAT?
Dmitrich
Цитата(esaulenka @ Jan 16 2013, 16:10) *
Предложение - забить на обновление FAT'а (сделать его ридонли, в памяти контроллера), и обновлять только данные. Пользователю разрешить только перезаписывать единственный имеющийся файл.

Нечто похожее есть в примерах NXP "USB bootloader".


Всё, полез искать пример. Это решение - было бы для меня идеальным! Именно то, что мне нужно!

Цитата(jcxz @ Jan 16 2013, 17:16) *
И зачем тут файловая система?

Мне она не нужна. Но без неё виндовс не может.
Цитата
И уж точно она никак не поможет ускорить загрузку.

Сама по себе файловая система - конечно нет. Но загрузится файл всё же быстрее, чем через UART 115200.
Цитата
По-моему вы необоснованно усложняете задачу.
В FAT16 максимальный размер кластера ==32К. Учите матчасть cool.gif
И маленькие файлы тогда будут занимать очень много места.

Эт точно! biggrin.gif
Цитата
У вас нет ОЗУ, достаточного для хранения 64К. И как вы при этом собираетесь перезаписывать отдельные области (кластера) внутри этих 64К, объясните?

Было бы столько ОЗУ - проблемы не было бы. ОЗУ нету, и перезаписывать отдельные области внутри я не буду. Всё, что нужно - записать одним куском большой файл.
Цитата
Какой тогда вообще смысл в FAT?

Легкий доступ из виндовс, больше ничего.
Dmitrich
Докладываю: - проблема решена.

Выглядит это так: - во флеш памяти прцессора лежит 3 массива констант :
- 512 байт - загрузочный сектор
- 112 байт - FAT
- 160 байт - корневой каталог.

Эти массивы "скармливаются" виндовсу, когда он читает соотв. адреса.
При чтении выше 20К - происходит реальное чтение из m25p16
Когда виндовс пишет по адресам ниже 20К - не делается ничего.
Запись выше 20К направляется в m25p16.
При записи в первый сектор страницы 64К - сначала вызывается процедура стирания страницы.

В итоге получилось вот что:
- При подключении устройства, в виндовс появляется новый диск, на котором уже есть файлы ( у меня их там 4 штуки).
- Эти файлы можно перезаписывать, не меняя имён.
- Нельзя стирать ПЕРЕД записью - тогда новый файл может попасть по другим адресам, и всё поломается (но восстановится после сброса)!
- Диск нельзя "убить" никаким форматированием (но данные стереть можно).
-Загрузка файла происходит раз в 5 быстрее, чем было раньше.

В общем, поставленные задачи полностью выполнены.
Спасибо всем, кто помогал. Особенно ценной была подсказка esaulenka - за что отдельное спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.