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

 
 
> StmF407+USBFlash+Fatfs Прблемка
pahanvs
сообщение Sep 29 2016, 07:07
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 15-04-15
Пользователь №: 86 236



Привет всем sm.gif
Есть следующая загвоздка:

Пытаюсь реализовать чтение с ЮСБ флешки файла BMP. Как бы все работает вроде неплохо, но вот наткнулся на один косяк.
все подключается, пишется и т.д. НО мне нужно прочитать в заголовке файла некую информацию, а именно откуда начинаются данные самого растра, дабы переместится туда и начать их считывать. Ну ладно думаю в чем проблема-то:
f_lseek (&MyFile, 10);
f_read (&MyFile, rastr, sizeof(rastr), &br);
считываю что растр начинается с 62 байта.
перемещаюсь туда:
f_lseek (&MyFile, 62);
и вот прикол- пытаюсь считать 2500 байт
f_read (&MyFile, send, sizeof(send), &br); буфер send имеет размер 2500...
и фигушки...
ну ладно думаю, погляжу в отладке.. смотрю... а он считывает только 450 байт и все. при повторном обращении не читает ничего и f_error(&MyFile) устанавливает единичку, тобиш ахтунг...
Ломал голову и так и сяк, потом заметил что если сначала не читать заголовок файла, а сразу начинать читать кусками по 2500, то все нормально. читает весь файл до конца без ошибок.
Вообщем суть такова что после любого перемещения указателя по файлу он разрешает читать только 450 байт, а если сразу читать нужные куски, то хоть 4000. Мож кто сталкивался?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
pahanvs
сообщение Sep 29 2016, 11:23
Сообщение #2





Группа: Новичок
Сообщений: 3
Регистрация: 15-04-15
Пользователь №: 86 236



Вообщем поправлю себя. Поковырял маленько.
Если читать файл с самого начала, то все ок, если переместить указатель больше чем 512 байт, то дальше можно читать любыми кусками, если менее, то только до 512-го байта, дальше ошибка. Я конечно выкрутился из данной ситуации, но все же вопрос остался.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Sep 29 2016, 11:41
Сообщение #3


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(pahanvs @ Sep 29 2016, 14:23) *
Вообщем поправлю себя. Поковырял маленько.
Если читать файл с самого начала, то все ок, если переместить указатель больше чем 512 байт, то дальше можно читать любыми кусками, если менее, то только до 512-го байта, дальше ошибка. Я конечно выкрутился из данной ситуации, но все же вопрос остался.

Возможно связано с работой драйвера.
Если флеш, страничная организация - то чтение идет естественно страницей.
Соотв-но если у Вас линейный адрес, то он пересчитывается драйвером в страницы-блоки-сектора.
Вот тут и может быть написано нечто "мелким шрифтом" sm.gif
к примеру что lseek двигать кратно размеру страницы, иначе ОНО должно подкачивать в буфер сразу 2.



Go to the top of the page
 
+Quote Post
pahanvs
сообщение Sep 29 2016, 12:52
Сообщение #4





Группа: Новичок
Сообщений: 3
Регистрация: 15-04-15
Пользователь №: 86 236



вот это мелкий шрифт и не читается ))) Тут у меня скорей всего скила не хватает. я сделал так:
читаю заголовок и перемещаю указатель на начало растра+величина одной строки растра и поехал дальше читать. первую строчку канеш теряю, но их там очень много, и потеря одной не критична sm.gif

01.gif Вообщем вруша я sm.gif Нифигасеньки не получилось sm.gif Все упирается в магические цифры sad.gif перемещаю указатель на 600 позицию - читаю сколько влезет. А если на 2562-ю, то фсе... Опять те же грабли... sad.gif Вообщем ну эти большие куски sm.gif Читаю по 4 байта нужное количество раз (все равно в BMP запись пикселей кратна 4-ем байтам), складываю все в массив, потом отправляю дальше по конвееру sm.gif Так работает sm.gif Уже проверил на железе sm.gif 08.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 29 2016, 14:17
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(k155la3 @ Sep 29 2016, 17:41) *
Если флеш, страничная организация - то чтение идет естественно страницей.
Соотв-но если у Вас линейный адрес, то он пересчитывается драйвером в страницы-блоки-сектора.

Если так, то очевидно, что проблема в кривом low-level драйвере, через который работает FatFS. Так как FatFS - это middleware, то FatFS не знает и не должен ничего знать о низкоуровневой организации флешь (всяких страницах, секторах, ...). Вот его и надо выпрямлять.
Go to the top of the page
 
+Quote Post
mantech
сообщение Sep 29 2016, 14:56
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(jcxz @ Sep 29 2016, 17:17) *
Если так, то очевидно, что проблема в кривом low-level драйвере, через который работает FatFS. Так как FatFS - это middleware, то FatFS не знает и не должен ничего знать о низкоуровневой организации флешь (всяких страницах, секторах, ...). Вот его и надо выпрямлять.


Да причем тут "низкоуровневой организации флешь"?? Автор явно указал, что "Пытаюсь реализовать чтение с ЮСБ флешки" , т.е. это обычное Mass Storage Device, а следовательно работает уже блочным принципом, т.е. можно читать и записывать блоки, как минимум 512-4096, или более байт. Как они организованы внутри флешки - да фиг с ними.
У него проблема в функции BlockRead(write), скорее всего параметр "SectorCount" всегда равен 1, и когда идет запрос нескольких секторов, то получается фигня. Из этого следует, либо читать только блоки равные сектору, т.е. 1-512, или править указанные процедуры.

Сообщение отредактировал mantech - Sep 29 2016, 14:57
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 29 2016, 15:07
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(mantech @ Sep 29 2016, 20:56) *
Да причем тут "низкоуровневой организации флешь"?? Автор явно указал, что "Пытаюсь реализовать чтение с ЮСБ флешки" , т.е. это обычное Mass Storage Device, а следовательно работает уже блочным принципом,

И что???
Значит low-level драйвер через который работает FatFS - это реализация класса MassStorage на UsbHost. Вот он и "при том". В нём и следует искать проблему, что-то он читает неверно.
Функция disk_read() (и прочие disk_...()), вызываемая FatFS, каким-то способом обращается к классу MassStorage, скорей всего проблема здесь.

Цитата(mantech @ Sep 29 2016, 20:56) *
У него проблема в функции BlockRead(write), скорее всего параметр "SectorCount" всегда равен 1

Что это за функция такая? И каким образом Вы узнали что у автора она есть???
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 29 2016, 15:12
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(mantech @ Sep 29 2016, 17:56) *
У него проблема в функции BlockRead(write), скорее всего параметр "SectorCount" всегда равен 1, и когда идет запрос нескольких секторов, то получается фигня. Из этого следует, либо читать только блоки равные сектору, т.е. 1-512, или править указанные процедуры.

Да где же следует, если
Цитата
...заметил что если сначала не читать заголовок файла, а сразу начинать читать кусками по 2500, то все нормально. читает весь файл до конца без ошибок.


И еще информация к размышлению на основе данных из первого поста:
62 + 450 = 512, что как бы намекает.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 29 2016, 15:18
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(aaarrr @ Sep 29 2016, 21:12) *
И еще информация к размышлению на основе данных из первого поста:
62 + 450 = 512, что как бы намекает.

Открыть disk_read() (и прочие disk_...()) и разбираться что там да как напортачено.
Go to the top of the page
 
+Quote Post
mantech
сообщение Sep 29 2016, 18:01
Сообщение #10


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(jcxz @ Sep 29 2016, 18:07) *
Что это за функция такая? И каким образом Вы узнали что у автора она есть???


Она есть в любом случае, у меня она так называется, у кого-то может добавлено подчеркивание...Суть не в названии...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 29 2016, 19:35
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(mantech @ Sep 30 2016, 00:01) *
Она есть в любом случае, у меня она так называется, у кого-то может добавлено подчеркивание...Суть не в названии...

В любом случае в FatFS есть low-level функции указанные в файле diskio.h. Эти же функции описаны на странице http://elm-chan.org/fsw/ff/00index_e.html в разделе "Device Control Interface". Именно через это API FatFS общается с низкоуровневым драйвером.
А то что у Вас - это что-то лично Ваше. Возможно это что-то более нижнего уровня. И оно не входит в FatFS.
Go to the top of the page
 
+Quote Post

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

 


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


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