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

 
 
 
Reply to this topicStart new topic
> FatFs на SAM9260
skyv
сообщение Oct 5 2010, 08:07
Сообщение #1


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

Группа: Участник
Сообщений: 181
Регистрация: 26-07-10
Пользователь №: 58 606



На плате с SAM9260 установил FatFs и работал с карточкой microSD 1Gb
по SPI. Исходный пример работал без проблем. Планируя использовать FatFs
в собственном проекте столкнулся с небольшим вопросом, который не понимаю.
Имею несколько физических носителей - microSD, SDRAM, dataFlash, NAND.
Могу ли я работать одновременно более, чем с одним носителем?
Если да, то как интерфейсные функции FatFs могут понять, с каким именно
носителем им работать?
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Oct 5 2010, 09:34
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Во все "нижние" функции передается Drive. Вот по нему и отличайте.
Код
DSTATUS disk_initialize (
  BYTE Drive           /* Physical drive number */
);

Учтите, что для NAND'а (и для DF желательно) Вам придется написать wear leveling прослойку.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
skyv
сообщение Oct 5 2010, 10:22
Сообщение #3


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

Группа: Участник
Сообщений: 181
Регистрация: 26-07-10
Пользователь №: 58 606



Вот есть функция:
FRESULT f_open (
FIL* FileObject, /* Pointer to the blank file object structure */
const TCHAR* FileName, /* Pointer to the file neme */
BYTE ModeFlags /* Mode flags */
);

Я просто не пойму где тут параметр указывающий принадлежность к носителю.
С вашим примером для низкоуровневых функций я согласен.


Вопрос снимаю. Посмотрел ff.h и стало понятно, что
если FIL *fp, то fp->fs->drv это и есть носитель.
Go to the top of the page
 
+Quote Post
zuy
сообщение Oct 5 2010, 10:22
Сообщение #4


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

Группа: Свой
Сообщений: 173
Регистрация: 30-11-05
Из: San Francisco
Пользователь №: 11 593



Цитата(skyv @ Oct 5 2010, 12:57) *
Вот есть функция:
FRESULT f_open (
FIL* FileObject, /* Pointer to the blank file object structure */
const TCHAR* FileName, /* Pointer to the file neme */
BYTE ModeFlags /* Mode flags */
);

Я просто не пойму где тут параметр указывающий принадлежность к носителю.
С вашим примером для низкоуровневых функций я согласен.



А разве не в FileName ?
Go to the top of the page
 
+Quote Post
skyv
сообщение Oct 5 2010, 10:26
Сообщение #5


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

Группа: Участник
Сообщений: 181
Регистрация: 26-07-10
Пользователь №: 58 606



Мне здается, что имя файла не указывает то на каком носителе он находится.
Go to the top of the page
 
+Quote Post
zuy
сообщение Oct 5 2010, 10:38
Сообщение #6


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

Группа: Свой
Сообщений: 173
Регистрация: 30-11-05
Из: San Francisco
Пользователь №: 11 593



Цитата(skyv @ Oct 5 2010, 13:26) *
Мне здается, что имя файла не указывает то на каком носителе он находится.


Ну я вообще-то не угадать пытался, а конкретно Вам наводку дал где копать smile.gif
Почитайте в документации на FatFS описание параметра FileName.
Параграф так и называется "Format of the path names" и в первой же строке сразу указывается где там номер драйва ставить.

Кстати схема не такая уж редкая, в Win API имя драйва тоже в строке имени файла задается.

Цитата(skyv @ Oct 5 2010, 13:22) *
Вопрос снимаю. Посмотрел ff.h и стало понятно, что
если FIL *fp, то fp->fs->drv это и есть носитель.


Верно, но это внутреннее дело библиотеки.
Если Вы ее правильно портировали, то задав FileName в ф-ции f_open в соответствии с документацией, библиотека сама поставит верно номер драйва в fp->fs->drv.
Пользователь не должен про это вообще ничего знать. Для него есть API, через него и надо работать.
Go to the top of the page
 
+Quote Post
skyv
сообщение Oct 5 2010, 11:31
Сообщение #7


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

Группа: Участник
Сообщений: 181
Регистрация: 26-07-10
Пользователь №: 58 606



Спасибо за конкретный ответ. Посмотрю внимательнее описание.
Go to the top of the page
 
+Quote Post
skyv
сообщение Oct 7 2010, 13:21
Сообщение #8


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

Группа: Участник
Сообщений: 181
Регистрация: 26-07-10
Пользователь №: 58 606



Пишу свой модуль I/O для RAM-diska. И вот остановился на реализации функции
disk_ioctl в части команды CTRL_SYNC.
Понятен первый режим работы функции для устройств имеющих какое-то время записи.
Понятно, что ничего не надо делать если только читаем из устройства.
Не понимаю когда необходим в модуле I/O write back cache и как при этом функционировать.
В примерах для I/O модулей MMC и NAND я не встретил использование write back cache.

Go to the top of the page
 
+Quote Post
Bulya
сообщение Oct 7 2010, 14:14
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 11-10-08
Из: Харьков
Пользователь №: 40 874



Цитата(skyv @ Oct 7 2010, 16:21) *
Не понимаю когда необходим в модуле I/O write back cache и как при этом функционировать.

Если выполняется кеширование записи - кеш (если в нем были изменения) нужно выгрузить.
Go to the top of the page
 
+Quote Post
skyv
сообщение Oct 7 2010, 14:40
Сообщение #10


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

Группа: Участник
Сообщений: 181
Регистрация: 26-07-10
Пользователь №: 58 606



Насколько я понимаю запись кэшируется в самой FatFs.
Теперь плюс к этому я могу делать или нет кэш в своем модуле I/O.
Понятно.
Go to the top of the page
 
+Quote Post
Bulya
сообщение Oct 7 2010, 14:56
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 11-10-08
Из: Харьков
Пользователь №: 40 874



да, запоминающее устройство может иметь собственный кеш (например в DataFlash), используемый драйвером.
эта команда его должна выгрузить. FatFs дергает ее при синхронизации с накопителем
Go to the top of the page
 
+Quote Post

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

 


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


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